【LangChain专栏】核心组件Model I/O 模块

文章目录

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

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 实现:

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

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. 方式1:用户自己通过提示词指明返回Json 格式;
  2. 方式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格式"})
相关推荐
ZaneAI2 小时前
🚀 Claude Agent SDK 使用指南:深度掌握 Hooks 机制
langchain·agent·claude
ZaneAI2 小时前
🚀 Claude Agent SDK 使用指南:如何优雅地处理用户审批与提问 (User Input)
langchain·agent·claude
海天一色y3 小时前
从零构建医疗AI Agent:RAG增强检索、混合搜索与模型部署实战
人工智能·langchain·智能体开发
AI Echoes3 小时前
对接自定义向量数据库的配置与使用
数据库·人工智能·python·langchain·prompt·agent
极客先躯3 小时前
高级java每日一道面试题-2025年7月11日-基础篇[LangChain4j]-如何管理 LangChain4j 应用的配置?请描述配置的最佳实践。
java·langchain·团队协作·密钥管理·动态调整·敏感信息保护·多环境支持
LateFrames14 小时前
IIS 窗口不显示,但是任务栏状态正常
服务器·windows·microsoft
山岚的运维笔记15 小时前
SQL Server笔记 -- 第65章:迁移 第66章:表值参数
数据库·笔记·sql·microsoft·sqlserver
一切尽在,你来20 小时前
AI大模型应用开发前置知识:Python迭代器和生成器深入详解
python·langchain·ai编程