文章目录
- [LangChain 核心组件](#LangChain 核心组件)
-
- [Model I/O 模块](#Model I/O 模块)
-
- [Model I/O 介绍](#Model I/O 介绍)
- [Prompt Template](#Prompt Template)
- ChatPromptTemplate
-
- 介绍
- 简单示例
- 带多轮对话历史(MessagesPlaceholder)
- [Few-shot 示例(少样本提示)](#Few-shot 示例(少样本提示))
- 结合模型使用(LCEL)
-
- [链式调用(LCEL 风格)](#链式调用(LCEL 风格))
- 示例代码
- [Output Parsers](#Output Parsers)
-
- [什么是 Output Parsers?](#什么是 Output Parsers?)
- [LangChain 解析器列表](#LangChain 解析器列表)
- 常用解析器使用示例
-
- 字符串解析器(StrOutputParser)
- [JSON 解析器(JsonOutputParser)](#JSON 解析器(JsonOutputParser))
LangChain 核心组件
Model I/O 模块
Model I/O 介绍
Model I/O 模块是与语言模型(LLMs)进行交互的核心组件,在整个框架中有着很重要的地位。所谓的Model I/O,包括输入提示(Format)、调用模型(Predict)、输出解析(Parse),分别对应着 Prompt Template、Model 和 Output Parser。简单来说,就是输入、模型处理、输出这三个步骤。

Prompt Template
什么是 Prompt Template?
简单说:Prompt Template = 带变量的提示词模板
作用:
- 把固定提示结构 + 动态变量,组合成最终给 LLM 的完整 Prompt
- 解决固定提示词灵活性、适用范围不足的问题
Prompt Template 是LangChain中的一个概念,接收用户输入,返回一个传递给LLM的信息(即提示词prompt)。是模板化的字符串,可将变量插入到模板中创建不同的提示。
调用规则:
- 以字典作为输入,其中每个键代表要填充的提示模板中的变量;
- 输出一个 PromptValue,该值可传递给 LLM 或 ChatModel,也可转换为字符串或消息列表。
提示模板的类型
- PromptTemplate:LLM 提示模板,用于生成字符串提示,使用 Python 的字符串来模板提示;
- ChatPromptTemplate:聊天提示模板,用于组合各种角色的消息模板,传入聊天模型;
- XxxMessagePromptTemplate:消息模板词模板,包括SystemMessagePromptTemplate、HumanMessagePromptTemplate、AIMessagePromptTemplate、ChatMessagePromptTemplate 等;
- FewShotPromptTemplate:样本提示词模板,通过示例来教模型如何回答;
- PipelinePrompt:管道提示词模板,用于把几个提示词组合在一起使用;
- 自定义模板:允许基于其它模板类来定制自己的提示词模板。
PromptTemplate 具体使用
PromptTemplate 类,用于快速构建包含变量的提示词模板,并通过传入不同的参数值生成自定义的提示词。
主要参数
- template:定义提示词模板的字符串,其中包含文本和变量占位符(如{name});
- input_variables:列表,指定了模板中使用的变量名称,在调用模板时被替换;
- partial_variables:字典,用于定义模板中一些固定的变量名,这些值不需要每次调用时被替换。
核心函数
- format():给input_variables 变量赋值,并返回提示词。利用format() 进行格式化时必须赋值,否则会报错;当在template 中未设置input_variables,则会自动忽略。
PromptTemplate 实例化方式
方式一:from_template()(最常用)
自动识别 {} 里的变量,不需要手动写 input_variables
python
import os
from openai import OpenAI
from langchain_core.prompts import PromptTemplate
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
template = "Tell me a joke about {topic}"
prompt = PromptTemplate.from_template(template)
print(prompt.format(topic="AI"))
方式二:直接构造函数
适用场景:需要精确控制变量、模板字符串动态生成、想提前校验变量
python
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate(
input_variables=["topic"],
template="Tell me a joke about {topic}"
)
print(prompt.format(topic="AI"))
format() 与 invoke()
- 只要对象是RunnableSerializable 接口类型,都可以使用invoke(),替换前面使用format()的调用方式;
- format():返回值为字符串类型;
- invoke():返回值为PromptValue 类型,可接着调用to_string()返回字符串。
示例代码:
python
prompt_template = PromptTemplate.from_template(
"Tell me a {adjective} joke about {content}."
)
invoke = prompt_template.invoke({"adjective": "funny", "content": "chickens"})
print(invoke)
print("------------------")
print(invoke.to_string())
输出结果:
PromptValue_01
text='Tell me a funny joke about chickens.'
------------------
Tell me a funny joke about chickens.
ChatPromptTemplate
介绍
ChatPromptTemplate 是 LangChain 中针对聊天模型(Chat Model) 的专用 PromptTemplate,和普通PromptTemplate最大区别在于消息结构:系统、用户、助手消息分开管理,更适合多轮对话和聊天模型输入。
ChatPromptTemplate 是容器,里面可以放多条消息,每条消息可以是:
- SystemMessage(系统消息,定义角色或背景)
- HumanMessage(用户消息)
- AIMessage(AI 回复,可做历史对话占位)
- MessagesPlaceholder(多轮对话历史占位)
简单示例
python
import os
from langchain_core.prompts import ChatPromptTemplate
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 定义模板
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业AI助手,回答简洁明了"),
("human", "请解释一下:{topic}")
])
# 格式化
messages = chat_prompt.format_messages(topic="RAG")
# 输出消息结构
print(messages)
输出结果:
[SystemMessage(content='你是一个专业AI 助手,回答简洁明了', additional_kwargs={}, response_metadata={}), HumanMessage(content='请解释一下:RAG', additional_kwargs={}, response_metadata={})]
带多轮对话历史(MessagesPlaceholder)
实现多轮对话记忆,可将历史对话插入到模板中间
python
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是客服助手"),
MessagesPlaceholder(variable_name="history"),
("human", "{input}")
])
# 假设有历史对话
history = [
{"role": "user", "content": "我想查询运单状态"},
{"role": "assistant", "content": "请提供运单号"}
]
messages = chat_prompt.format_messages(input="运单号12345", history=history)
print(messages)
Few-shot 示例(少样本提示)
通过示例教模型如何回答问题
python
examples = [
("human", "解释AI"),
("assistant", "AI是人工智能")
]
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是AI专家"),
*examples,
("human", "解释RAG")
])
messages = chat_prompt.format_messages()
print(messages)
结合模型使用(LCEL)
链式调用(LCEL 风格)
python
chain = chat_prompt | model
- 这是 LangChain 新版 LCEL 风格(类似 Unix 管道);
- 表示链式组合:
|,流程为 PromptTemplate -> Model -> Output; - 链式调用的好处:语法直观、可组合多个 Prompt 或工具、支持一步完成.invoke()。
等价于自定义函数:
python
def chain_invoke(inputs):
messages = chat_prompt.format_messages(**inputs)
return model(messages)
示例代码
python
import os
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
from openai import OpenAI
model = ChatOpenAI(model="qwen-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 定义 ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是AI助手"),
("human", "{question}")
])
# 链式调用
chain = chat_prompt | model
# 调用
result = chain.invoke({"question": "什么是RAG?"})
print(result.content)
Output Parsers
什么是 Output Parsers?
在 LangChain 的 Model I/O 中,Output Parsers 在整个 Prompt → Model → Output 流程中,扮演的角色是把模型返回的"文本"解析成可用数据结构。
模型输出通常是文本字符串,直接使用可满足基础需求,但很多场景希望输出JSON、Python 字典、列表、结构化对象等格式,此时需要 Output Parsers 实现:
- 校验输出格式;
- 将文本解析成 Python 对象;
- 提供链式调用的接口。
LangChain 解析器列表
| 解析器名称 | 功能说明 |
|---|---|
| StrOutputParser | 字符串解析器,将 LLM 输出直接解析为字符串格式 |
| JsonOutputParser | JSON 解析器,确保输出符合特定 JSON 对象格式 |
| XMLOutputParser | XML 解析器,允许以流行的 XML 格式从 LLM 获取结果 |
| CommaSeparatedListOutputParser | CSV 解析器,模型的输出以逗号分隔,以列表形式返回输出 |
| DatetimeOutputParser | 日期时间解析器,可用于将 LLM 输出解析为日期时间格式 |
| EnumOutputParser | 枚举解析器,将 LLM 的输出解析为预定义的枚举值 |
| StructuredOutputParser | 将非结构化文本转换为预定义格式的结构化数据(如字典) |
| OutputFixingParser | 输出修复解析器,用于自动修复格式错误的解析器,比如将返回的不符合预期格式的输出,尝试修正为正确的结构化数据(如 JSON) |
| RetryOutputParser | 重试解析器,当主解析器(如 JSONOutputParser)因格式错误无法解析 LLM 的输出时,通过调用另一个 LLM 自动修正错误,并重新尝试解析 |
常用解析器使用示例
字符串解析器(StrOutputParser)
简单地将任何输入转换为字符串,从结果中提取 content 字段。
python
import os
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
chat_model = ChatOpenAI(model="qwen-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
messages = [
SystemMessage(content="将以下内容从英语翻译成中文"),
HumanMessage(content="It's a nice day today"),
]
result = chat_model.invoke(messages)
print(type(result))
print(result)
parser = StrOutputParser()
# 使用parser处理model返回的结果
response = parser.invoke(result)
print(type(response))
print(response)
输出结果:
<class 'langchain_core.messages.ai.AIMessage'>
content='今天天气很好。' additional_kwargs={'refusal':None} response_metadata={'token_usage':{'completion_tokens':...}}
<class 'str'>
今天天气很好。
JSON 解析器(JsonOutputParser)
将大模型的自由文本输出转换为结构化JSON数据,特别适用于需要严格结构化输出的场景,比如 API 调用、数据存储或下游任务处理。
实现方式:
- 方式1:用户自己通过提示词指明返回Json 格式;
- 方式2:借助JsonOutputParser 的 get_format_instructions(),生成格式说明,指导模型输出 JSON 结构。
示例代码:
python
import os
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
chat_model = ChatOpenAI(model="qwen-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
chat_prompt_template = ChatPromptTemplate.from_messages([
("system", "你是一个靠谱的{role}"),
("human", "{question}")
])
parser = JsonOutputParser()
# 方式1: 手动指定返回JSON格式
result = chat_model.invoke(chat_prompt_template.format_messages(role="人工智能专家",
question="人工智能用英文怎么说?问题用q表示,答案用a表示,返回一个JSON格式"))
print(result)
print(type(result))
parser.invoke(result)
# 方式2: 链式调用
chain = chat_prompt_template | chat_model | parser
chain.invoke({"role":"人工智能专家","question" : "人工智能用英文怎么说?问题用q表示,答案用a表示,返回一个JSON格式"})