在人工智能应用开发中,LangChain 已经成为构建 LLM 应用的重要框架。今天,让我们一起深入探索 LangChain 的三大核心组件:模型(Model) 、提示词模板(Prompts) 和输出解析器(Output Parser) ,了解它们如何协作让我们的代码更加优雅和高效。
🔍 认识 LangChain 的三大核心
LangChain 的基本工作流可以简单拆解为三个关键步骤:Prompt (提示词模板) → Model (模型调用) → Output Parser (输出解析器) 。这种设计模式将 LLM 的原始输出转化为结构化、可直接在代码中使用的数据。
(图为:LangChain三大核心组件工作流程示意图)
🤖 1. 模型(Models)- AI的大脑
LangChain 区分了两种类型的模型接口:
LLMs vs ChatModels
- • LLMs:接受字符串作为输入,返回字符串(如早期 GPT-3)
- • ChatModels:接受"消息列表"作为输入,返回一条消息(如 GPT-4)
消息类型详解
在 ChatModels 中,我们有三种重要的消息类型:
- • SystemMessage: 设置 AI 的行为背景和角色定义
- • HumanMessage: 用户的直接输入和提问
- • AIMessage: AI 的回复和响应
💡 最佳实践:通过合理组合这三种消息,可以精确控制 AI 的行为和响应质量。
📝 2. 提示词模板(Prompts)- 精准沟通的桥梁
手动拼接字符串非常低效且容易出错。PromptTemplate 允许我们将逻辑与具体输入分离,实现:
核心优势
- • 🔄 复用性:定义一次模板,传入不同参数生成不同 Prompt
- • ✅ 一致性:确保模型接收到的上下文格式统一
- • 🎯 精准性:避免手动拼接带来的格式错误
实际应用示例
from langchain.prompts import ChatPromptTemplate
# 定义商品评论分析模板
template = """
请分析以下用户评价,提取关键信息:
商品评价:{review_text}
分析重点:{analysis_focus}
"""
# 生成具体提示词
prompt = ChatPromptTemplate.from_template(template=template)
messages = prompt.format_messages(
review_text="这款手机拍照效果很好,电池续航也不错",
analysis_focus="产品优缺点"
)
🎯 3. 输出解析器(Output Parsers)- 结构化的魔法
LLM 默认返回的是文本字符串,但在实际应用中,我们通常需要结构化数据。输出解析器就是解决这个问题的神器。
工作原理
- 1. 📝 指令注入:解析器会生成一段"格式化指令"附加到 Prompt 中,告诉模型如何组织输出
- 2. 🔄 结果解析:解析模型生成的字符串,将其转换为结构化数据(如 Python 字典)
支持的输出格式
- • JSON 格式:易于数据交换和处理
- • 列表结构:方便批量数据处理
- • 自定义对象:满足特定的业务需求
🚀 完整流程实战示例
让我们通过一个具体的例子,看看如何利用这三个组件完成一个"提取商品评价"的任务。
代码实现
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
# 1. 定义模型
chat = ChatOpenAI(temperature=0.0)
# 2. 定义解析方案
# 我们希望模型输出 gift 和 delivery_days 两个字段
gift_schema = ResponseSchema(
name="gift",
description="这件商品是送人的礼物吗?如果是返回 True,否则返回 False"
)
delivery_schema = ResponseSchema(
name="delivery_days",
description="商品送达花了多少天?如果没提到返回 -1"
)
response_schemas = [gift_schema, delivery_schema]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 3. 获取格式化指令
format_instructions = output_parser.get_format_instructions()
# 4. 定义提示词模板
review_template = """
对于以下评论,提取以下信息:
gift: 商品是礼物吗?
delivery_days: 送达花了几天?
评论内容: {text}
{format_instructions}
"""
prompt = ChatPromptTemplate.from_template(template=review_template)
# 5. 组合并运行
customer_review = "这个吹风机太棒了!我是买给妻子的生日礼物,昨天买的今天就到了。"
messages = prompt.format_messages(
text=customer_review,
format_instructions=format_instructions
)
# 6. 获取回复并解析
response = chat(messages)
output_dict = output_parser.parse(response.content)
print(output_dict)
# 输出示例: {'gift': True, 'delivery_days': 1}
代码解析
graph TD A[用户评论] --> B[提示词模板] B --> C[ChatOpenAI模型] C --> D[模型响应] D --> E[输出解析器] E --> F[结构化数据]
📊 核心逻辑总结
| 组件 | 角色 | 关键函数/类 |
|---|---|---|
| Prompts | 准备输入 | ChatPromptTemplate.from_template() |
| Models | 逻辑思考 | ChatOpenAI(temperature=...) |
| Parsers | 整理结果 | StructuredOutputParser, parse() |
💡 为什么这种模式很重要?
1. 结构化输出
- • 不再需要写复杂的正则表达式来从文本中提取数据
- • 直接获得结构化的 JSON 或 Python 对象
2. 解耦设计
- • 如果更换底层的 LLM,只需要微调 Prompt 或解析逻辑
- • 业务代码几乎不用动,降低了维护成本
3. 自动化处理
- • 解析器可以处理"如果不符合格式就重试"的逻辑
- • 提高了代码的健壮性