LangChain核心揭秘:模型、提示词与解析器的完美协作

14 阅读4分钟

在人工智能应用开发中,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. 1. 📝 指令注入:解析器会生成一段"格式化指令"附加到 Prompt 中,告诉模型如何组织输出
  2. 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整理结果StructuredOutputParserparse()

💡 为什么这种模式很重要?

1. 结构化输出

  • • 不再需要写复杂的正则表达式来从文本中提取数据
  • • 直接获得结构化的 JSON 或 Python 对象

2. 解耦设计

  • • 如果更换底层的 LLM,只需要微调 Prompt 或解析逻辑
  • • 业务代码几乎不用动,降低了维护成本

3. 自动化处理

  • • 解析器可以处理"如果不符合格式就重试"的逻辑
  • • 提高了代码的健壮性