在一些入门例子中,我们会发现,我们可以告诉 LLM
如何输出,然后输出的结果真的是我们想要的,比如下面这个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import PromptTemplatefrom langchain_openai import ChatOpenAIllm = ChatOpenAI(model_name="gpt-3.5-turbo" , temperature=0.5 , max_tokens=200 ) summarizing_prompt_template = """ 输出为 JSON 格式,包含字段 content、summary。 总结以下文本为一个 20 字以内的句子: --- {content} """ prompt = PromptTemplate.from_template(summarizing_prompt_template) summarizing_chain = prompt | llm | StrOutputParser() print (summarizing_chain.invoke({"content" : "这是一个测试。" }))
在实际使用中,content
可能是一个很长的文本。
输出:
1 2 3 4 { "content" : "这是一个测试。" , "summary" : "这是一个测试。" }
正如某些例子上经常写的 "You are a helpful
assistant",其实从某种程度上来说,我们确实可以把 LLM
看作是我们的一名得力助手。
这名助手是可以理解我们说的话并作出回应的。
因此,我们就可以告诉 LLM,我们希望输出的格式是 JSON,然后我们可以在
JSON 中定义我们希望输出的字段。
langchain 中的 JSON 输出
在上面这个例子中,其实是等于我们给了 LLM
一个指令,告诉它我们希望输出的格式是 JSON,然后我们定义了 JSON 的格式。
既然很多时候我们都想要给我们的 LLM
一个指令,那为何不把这些逻辑固定下来呢?
为了解决这个问题,langchain 的 PromptTemplate
为我们提供了指定输出的指令的通用解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 from langchain.output_parsers import StructuredOutputParser, ResponseSchemafrom langchain_core.prompts import PromptTemplatefrom langchain_openai import ChatOpenAIllm = ChatOpenAI( model_name="gpt-3.5-turbo" , temperature=0.5 , max_tokens=200 ) response_schemas = [ ResponseSchema(name="content" , description="The original content" ), ResponseSchema(name="summary" , description="The summary of the content" ), ] output_parser = StructuredOutputParser.from_response_schemas(response_schemas) format_instructions = output_parser.get_format_instructions() summarizing_prompt_template = """ {format_instructions} 总结以下文本为一个 20 字以内的句子: --- {content} """ prompt = PromptTemplate.from_template(summarizing_prompt_template, partial_variables={'format_instructions' : format_instructions}) summarizing_chain = prompt | llm | output_parser print (summarizing_chain.invoke({"content" : "这是一个测试。" }))
输出:
1 2 3 4 { "content" : "这是一个测试。" , "summary" : "这是一个测试。" }
说明:
ResponseSchema
用于定义输出的字段,name
为字段名,description
为字段描述。这些信息是给 LLM
看的。LLM 会根据这些信息来输出我们想要的结果。
partial_variables
用于传递部分变量给模板,剩下的变量会在调用 LLM 的时候再传递。
在上面这个例子中,我们实际传递给 LLM 的模板是:
1 2 3 4 5 6 7 8 9 10 11 12 The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```": ```json { "content": string // The original content "summary": string // The summary of the content } ``` 总结以下文本为一个 20 字以内的句子: --- 这是一个测试。
这个模板告诉 LLM,我们希望输出的格式是 JSON,然后我们定义了 JSON
的格式。
总结
在 langchain 中,我们可以通过 ResponseSchema
来定义我们希望输出的字段,然后生成一个 prompt
,传递给
LLM,让 LLM 知道我们希望输出的格式是什么。