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)。是模板化的字符串,可将变量插入到模板中创建不同的提示。

调用规则

  1. 以字典作为输入,其中每个键代表要填充的提示模板中的变量;
  2. 输出一个 PromptValue,该值可传递给 LLM 或 ChatModel,也可转换为字符串或消息列表。

提示模板的类型

  1. PromptTemplate:LLM 提示模板,用于生成字符串提示,使用 Python 的字符串来模板提示;
  2. ChatPromptTemplate:聊天提示模板,用于组合各种角色的消息模板,传入聊天模型;
  3. XxxMessagePromptTemplate:消息模板词模板,包括SystemMessagePromptTemplate、HumanMessagePromptTemplate、AIMessagePromptTemplate、ChatMessagePromptTemplate 等;
  4. FewShotPromptTemplate:样本提示词模板,通过示例来教模型如何回答;
  5. PipelinePrompt:管道提示词模板,用于把几个提示词组合在一起使用;
  6. 自定义模板:允许基于其它模板类来定制自己的提示词模板。

PromptTemplate 具体使用

PromptTemplate 类,用于快速构建包含变量的提示词模板,并通过传入不同的参数值生成自定义的提示词。

主要参数
  • template:定义提示词模板的字符串,其中包含文本和变量占位符(如{name});
  • input_variables:列表,指定了模板中使用的变量名称,在调用模板时被替换;
  • partial_variables:字典,用于定义模板中一些固定的变量名,这些值不需要每次调用时被替换。
核心函数
  • format():给input_variables 变量赋值,并返回提示词。利用format() 进行格式化时必须赋值,否则会报错;当在template 中未设置input_variables,则会自动忽略。
PromptTemplate 实例化方式

方式一:from_template()(最常用)
自动识别 {} 里的变量,不需要手动写 input_variables

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"))

方式二:直接构造函数
适用场景:需要精确控制变量、模板字符串动态生成、想提前校验变量

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()返回字符串。

示例代码:

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(多轮对话历史占位)

简单示例

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)

实现多轮对话记忆,可将历史对话插入到模板中间

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 示例(少样本提示)

通过示例教模型如何回答问题

examples = [
    ("human", "解释AI"),
    ("assistant", "AI是人工智能")
]

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是AI专家"),
    *examples,
    ("human", "解释RAG")
])

messages = chat_prompt.format_messages()
print(messages)

结合模型使用(LCEL)

链式调用(LCEL 风格)
chain = chat_prompt | model
  • 这是 LangChain 新版 LCEL 风格(类似 Unix 管道);
  • 表示链式组合:|,流程为 PromptTemplate -> Model -> Output;
  • 链式调用的好处:语法直观、可组合多个 Prompt 或工具、支持一步完成.invoke()。

等价于自定义函数:

def chain_invoke(inputs):
    messages = chat_prompt.format_messages(**inputs)
    return model(messages)
示例代码
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 实现:

  1. 校验输出格式;
  2. 将文本解析成 Python 对象;
  3. 提供链式调用的接口。

LangChain 解析器列表

解析器名称功能说明
StrOutputParser字符串解析器,将 LLM 输出直接解析为字符串格式
JsonOutputParserJSON 解析器,确保输出符合特定 JSON 对象格式
XMLOutputParserXML 解析器,允许以流行的 XML 格式从 LLM 获取结果
CommaSeparatedListOutputParserCSV 解析器,模型的输出以逗号分隔,以列表形式返回输出
DatetimeOutputParser日期时间解析器,可用于将 LLM 输出解析为日期时间格式
EnumOutputParser枚举解析器,将 LLM 的输出解析为预定义的枚举值
StructuredOutputParser将非结构化文本转换为预定义格式的结构化数据(如字典)
OutputFixingParser输出修复解析器,用于自动修复格式错误的解析器,比如将返回的不符合预期格式的输出,尝试修正为正确的结构化数据(如 JSON)
RetryOutputParser重试解析器,当主解析器(如 JSONOutputParser)因格式错误无法解析 LLM 的输出时,通过调用另一个 LLM 自动修正错误,并重新尝试解析

常用解析器使用示例

字符串解析器(StrOutputParser)

简单地将任何输入转换为字符串,从结果中提取 content 字段。

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. 方式1:用户自己通过提示词指明返回Json 格式;
  2. 方式2:借助JsonOutputParser 的 get_format_instructions(),生成格式说明,指导模型输出 JSON 结构。

示例代码:

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格式"})
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐