LangChain开发(七)自定义输出格式(JSON/XML/YAML)
文章目录
- JSON结构输出
- 未使用Pydantic
- Pydantic
- 流式处理
- XML结构输出
- xml输出
- 指定字段
- YAML输出
- 源码地址
- 参考资料
JSON结构输出
虽然一些模型提供商支持内置的方法返回结构化输出,但并非所有都支持。我们可以使用输出解析器来帮助用户通过指示指定任意的JSON模型,查询符合该模式的模型输出,最后将该模式解析为JSON。
JsonOutputParser是一个内置选项,用于提示并解析JSON输出。虽然它在功能上类似于PydanticOutputParser,但它还支持流式返回部分JSON对象。
以下是如何将其与Pydantic一起使用以方便地声明预期模式的示例:
未使用Pydantic
让大模型生成json结构
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os
model = ChatOpenAI(model="gpt-4o", temperature=0)
joke_query = "告诉我一个笑话."
parser = JsonOutputParser()
prompt = PromptTemplate(
template="回答用户的查询.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
response = chain.invoke({"query": joke_query})
print(response)
{'joke': '为什么电脑去医院?因为它需要检查一下‘病毒’!'}
Pydantic
让大模型生成指定结构的数据,结构为class Joke
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o", temperature=0)
# 定义期望的数据结构
class Joke(BaseModel):
setup: str = Field(description="设置笑话的问题")
punchline: str = Field(description="解决笑话的答案")
joke_query = "告诉我一个笑话."
parser = JsonOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
template="回答用户的查询.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
response = chain.invoke({"query": joke_query})
print(response)
输出示例:
{'setup': '为什么计算机不能喝咖啡?', 'punchline': '因为它们会崩溃!'}
请注意,我们将解析器中的format_instructions
直接传递到提示中。可以并且应该尝试在提示的其他部分中添加自己的格式提示,以增强或替换默认指令:
parser.get_format_instructions()
流式处理
如上所述,JsonOutputParser
和PydanticOutputParsr
之间的一个关键区别是JsonOutputParser
输出解析器支持流式处理部分块。以下是其示例:
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o", temperature=0)
joke_query = "告诉我一个笑话."
parser = JsonOutputParser()
prompt = PromptTemplate(
template="回答用户的查询.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
response = chain.invoke({"query": joke_query})
for s in chain.stream({"query": joke_query}):
print(s)
输出示例:
{}
{'joke': '为什么'}
{'joke': '为什么电脑去医院?因为它'}
{'joke': '为什么电脑去医院?因为它需要检查一下‘'}
{'joke': '为什么电脑去医院?因为它需要检查一下‘病毒’!'}
XML结构输出
下面使用XMLOutParser来提示模型生成XML输出,然后将该输出解析为可用的格式。
xml输出
我们可以使用XMLOutputParser
将默认的格式指令添加到提示中,并将输出的XML解析为字典:
from langchain_core.output_parsers import XMLOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os
# pip install defusexml
model = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
model="qwen-turbo",
temperature=0
)
action_query = "生成周星驰的简化电影作品列表,按照最新的顺序降序"
parser = XMLOutputParser()
prompt = PromptTemplate(
template="回答用户的查询.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model
response = chain.invoke({"query": action_query})
xml_output = parser.parse(response.content)
print(response.content)
输出示例:
```xml
<movie_list>
<movie>
<title>美人鱼</title>
<year>2016</year>
</movie>
<movie>
<title>西游降魔篇</title>
<year>2013</year>
</movie>
<movie>
<title>长江七号</title>
<year>2008</year>
</movie>
<movie>
<title>功夫</title>
<year>2004</year>
</movie>
<movie>
<title>少林足球</title>
<year>2001</year>
</movie>
</movie_list>
```
我们还可以添加一些标签以根据我们的需求定制输出。可以在提示的其他部分中尝试添加自己的格式提示,以增强或替换默认指令:
指定字段
# 指定字段名称
from langchain_core.output_parsers import XMLOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os
# pip install defusexml
model = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
model="qwen-turbo",
temperature=0
)
joke_query = "生成周星驰的简化电影作品列表,按照最新的顺序降序"
parser = XMLOutputParser(tags=["movies", "actor", "film", "name", "genre"])
prompt = PromptTemplate(
template="回答用户的查询.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model
response = chain.invoke({"query": joke_query})
xml_output = parser.parse(response.content)
print(response.content)
输出示例:
```xml
<movies>
<actor>
<name>周星驰</name>
<film>
<name>美人鱼</name>
<genre>喜剧</genre>
</film>
<film>
<name>西游降魔篇</name>
<genre>奇幻, 喜剧</genre>
</film>
<film>
<name>功夫</name>
<genre>动作, 喜剧</genre>
</film>
<film>
<name>少林足球</name>
<genre>喜剧, 动作</genre>
</film>
</actor>
</movies>
```
YAML输出
我们使用Pydantic
与YamlOutputParser
输出指定的YAML格式
from langchain.output_parsers import YamlOutputParser
from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
import os
class Joke(BaseModel):
setup: str = Field(description="设置笑话的问题")
punchline: str = Field(description="解决笑话的答案")
model = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
model="qwen-turbo",
temperature=0
)
joke_query = "告诉我一个笑话."
# 设置一个解析器 + 将指令注入到提示模板中.
parser = YamlOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
template="回答用户的查询.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model
print(parser.get_format_instructions())
response = chain.invoke({"query": joke_query})
print(response.content)
以上就是让大模型输出指定格式输出示例
源码地址
https://github.com/lys1313013/langchain-example/tree/main/08-output-parser
参考资料
B站:2025吃透LangChain大模型全套教程(LLM+RAG+OpenAI+Agent)第6集后半段
LangChain官网 JSON parser
LangChain官网 XML parser
LangChain官网 YAMLparser