在大模型应用开发中,将模型的自然语言输出转化为结构化数据是核心需求之一。本文将以「提取指定国家的汽车品牌列表」为例,使用 LangChain 的 CommaSeparatedListOutputParser实现输出结构化解析,让非结构化的文本输出秒变可直接使用的 Python 列表。
一、逗号分隔列表
1.完整代码
python
# 导入核心依赖
from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
# 1. 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
# 系统消息:传入解析器的格式要求
("system", "{parser_instructions}"),
# 人类消息:用户的具体查询,包含动态参数subject
("human", "列出5个{subject}国家的汽车品牌。")
])
# 2. 初始化输出解析器并获取格式说明
output_parser = CommaSeparatedListOutputParser()
# 获取解析器要求的格式说明(自动生成,告诉模型要返回逗号分隔的列表)
parser_instructions = output_parser.get_format_instructions()
print("解析器格式要求:", parser_instructions)
# 3. 填充提示词参数
final_prompt = prompt.invoke({
"subject": "中国",
"parser_instructions": parser_instructions
})
# 4. 初始化大模型(对接通义千问)
model = ChatOpenAI(
model="qwen-plus", # 通义千问增强版
openai_api_key="sk-75e9a245c6054b4bb06a862aa50a0346", # 替换为你的API Key
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1" # 通义千问兼容接口
)
# 5. 调用模型并获取响应
response = model.invoke(final_prompt)
print("模型原始输出:", response.content)
# 6. 解析输出为Python列表
parsed_result = output_parser.invoke(response)
print("解析后的列表:", parsed_result)
print("列表类型:", type(parsed_result))
2.代码解析
(1)提示词模板定义
python
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions}"),
("human", "列出5个{subject}国家的汽车品牌。")
])
-
使用
from_messages方法构建包含系统消息和人类消息的提示词模板 -
{parser_instructions}:动态填充解析器要求的格式说明,确保模型输出符合解析要求 -
{subject}:动态指定查询的国家,提升模板复用性
(2)输出解析器初始化
python
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
-
CommaSeparatedListOutputParser会自动生成格式说明(如「Your response should be a list of comma separated values, eg: foo, bar, baz」) -
格式说明会告诉模型必须返回逗号分隔的列表,为后续解析提供基础
(3)模型调用与解析
python
response = model.invoke(final_prompt)
parsed_result = output_parser.invoke(response)
-
model.invoke():将填充后的提示词传入模型,获取原始响应 -
output_parser.invoke():将模型响应解析为 Python 列表,无需手动处理字符串分割
(4)预期输出示例
python
解析器格式要求: Your response should be a list of comma separated values, eg: foo, bar, baz
模型原始输出: 吉利,比亚迪,长城,奇瑞,长安
解析后的列表: ['吉利', '比亚迪', '长城', '奇瑞', '长安']
列表类型: <class 'list'>