Message
是用于构建与语言模型交互的历史记录和上下文的核心数据结构。它主要用于组织对话中的多轮交互,包括系统消息、用户消息、助手(AI)消息等。LangChain 提供了以下几种常见的消息类型:
消息类型 | 类名 | 说明 |
---|---|---|
SystemMessage | langchain_core.messages.SystemMessage |
表示系统的指令或角色设定,如“你是一个翻译官”、“你是一个客服助手”等 |
HumanMessage | langchain_core.messages.HumanMessage |
表示用户输入的内容,即人类发出的消息 |
AIMessage | langchain_core.messages.AIMessage |
表示 AI 助手生成的回复内容 |
FunctionMessage | langchain_core.messages.FunctionMessage |
表示调用工具后返回的结果,通常用于函数调用流程中 |
每个 Message
对象都包含以下主要属性:
content
: 字符串,表示消息内容additional_kwargs
: 可选字典,用于存储额外信息(如角色、工具调用参数等)response_metadata
: 可选元数据,例如模型响应的 token 数量、调用耗时等from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
system_msg = SystemMessage(content="You are a helpful assistant.")
human_msg = HumanMessage(content="Translate '无人扶我青云志' to English.")
ai_msg = AIMessage(content="No one supports my lofty ambitions.")
print(system_msg)
# 输出: SystemMessage(content='You are a helpful assistant.', additional_kwargs={}, response_metadata={})
场景 | 描述 |
---|---|
聊天机器人 | 构建客服、助手类对话系统 |
多轮对话 | 支持带上下文的历史对话 |
翻译/摘要/问答 | 利用模型进行结构化文本处理 |
Agent 应用 | 结合工具调用,构建智能代理系统 |
ChatModel
接口在 LangChain 中,ChatModel
是一个抽象接口,定义了聊天模型的基本行为,如接收消息列表、返回响应消息等。
ChatOpenAI
:对接 OpenAI 的 GPT 系列模型(如 gpt-3.5-turbo, gpt-4)ChatAnthropic
:对接 Anthropic 的 Claude 模型ChatGoogleGenerativeAI
:对接 Google Gemini 模型BaseChatModel
实现BaseMessage
类型BaseMessage
对象组成的列表:类型 | 含义 |
---|---|
HumanMessage |
用户发出的消息 |
AIMessage |
模型回复的消息 |
SystemMessage |
系统指令或角色设定 |
FunctionMessage |
函数调用结果(用于工具调用) |
ToolMessage |
工具调用返回的内容 |
示例:
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="你是一个翻译助手"),
HumanMessage(content="请将'无人扶我青云志,我自踏雪至山巅'翻译为英文")
]
以 ChatOpenAI
为例:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
使用 .invoke()
方法传入消息列表:
response = model.invoke(messages)
print(response.content)
输出示例:
No one supports my lofty ambitions; I will tread through the snow to reach the mountain peak on my own.
MessagesPlaceholder
可以保留历史对话记录,让模型理解上下文。from langchain_core.prompts import MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
("system", "你是客服助手"),
MessagesPlaceholder("history"),
("user", "{input}")
])
for chunk in chain.stream({
"system_message": "你是一个翻译助手",
"user_input": "无人扶我青云志,我自踏雪至山巅"
}):
print(chunk, end="", flush=True)
from langchain_core.messages import ToolCall
tool_call = ToolCall(name="search_internet", content={"query": "最新新闻"})
LangChain 的 提示词模板(Prompt Templates) 是构建与大语言模型交互时的核心组件之一。它允许你以结构化、可复用的方式定义输入提示,从而动态地生成最终的提示内容。
Prompt Template 是一种 参数化模板,用于在运行时将变量插入到固定的文本中,从而生成最终发送给 LLM 的提示。
提示词模板的输入是一个字典,其中每个键表示要填充的提示词模板中的变量。
提示词模板分为:PromptTemplate、ChatPromptTemplate、消息占位符
from langchain_core.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Tell me a joke about {topic}")
prompt_template.invoke({"topic": "cats"})
StringPromptValue(text='Tell me a joke about cats')
from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
("user", "Tell me a joke about {topic}")
])
prompt_template.invoke({"topic": "cats"})
ChatPromptValue(messages=[SystemMessage(content='You are a helpful assistant', additional_kwargs={}, response_metadata={}), HumanMessage(content='Tell me a joke about cats', additional_kwargs={}, response_metadata={})])
MessagesPlaceholder:用于占位一组消息,常用于历史对话管理。
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage
prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
MessagesPlaceholder("msgs")
])
prompt_template.invoke({"msgs": [HumanMessage(content="hi!")]})
ChatPromptValue(messages=[SystemMessage(content='You are a helpful assistant', additional_kwargs={}, response_metadata={}), HumanMessage(content='hi!', additional_kwargs={}, response_metadata={})])
from langchain_core.messages import HumanMessage
from langchain_core.prompts import MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
MessagesPlaceholder("history"),
("user", "{input}")
])
prompt.invoke({
"history": [HumanMessage(content="Hi")],
"input": "How are you?"
})
ChatPromptValue(messages=[SystemMessage(content='You are a helpful assistant', additional_kwargs={}, response_metadata={}), HumanMessage(content='Hi', additional_kwargs={}, response_metadata={}), HumanMessage(content='How are you?', additional_kwargs={}, response_metadata={})])
解析器 | 描述 | 使用场景 |
---|---|---|
StrOutputParser |
直接返回模型输出的字符串内容 | 简单文本输出 |
JsonOutputParser |
将输出解析为 JSON 格式 | 需要结构化数据时 |
PydanticOutputParser |
使用 Pydantic 模型定义结构并解析输出 | 强类型校验与结构化输出 |
CommaSeparatedListOutputParser |
将输出按逗号分割成列表 | 输出多个选项或关键词 |
EnumOutputParser |
限制输出为指定枚举值 | 控制输出范围,如 yes/no、分类标签 |
BooleanOutputParser |
将输出解析为布尔值 | 判断是否满足条件 |
StrOutputParser
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
output = parser.invoke("Hello, world!")
# 输出: "Hello, world!"
JsonOutputParser
from langchain_core.output_parsers import JsonOutputParser
parser = JsonOutputParser()
output = parser.invoke('{"name": "Alice", "age": 30}')
# 输出: {'name': 'Alice', 'age': 30}
PydanticOutputParser
适用于需要强类型约束的结构化输出。
from pydantic import BaseModel
from langchain_core.output_parsers import PydanticOutputParser
class Person(BaseModel):
name: str
age: int
parser = PydanticOutputParser(pydantic_object=Person)
output = parser.invoke("{'name': 'Bob', 'age': 25}")
# 输出: Person(name='Bob', age=25)
CommaSeparatedListOutputParser
from langchain_core.output_parsers import CommaSeparatedListOutputParser
parser = CommaSeparatedListOutputParser()
output = parser.invoke("apple, banana, orange")
# 输出: ['apple', 'banana', 'orange']
BooleanOutputParser
from langchain_core.output_parsers import BooleanOutputParser
parser = BooleanOutputParser()
output = parser.invoke("Yes")
# 输出: True
import os
from langchain_openai import ChatOpenAI
from langfuse.callback import CallbackHandler
from langchain.chains import LLMChain # 导入链模块
from langchain_core.prompts import ChatPromptTemplate # 导入提示模板
from langchain_core.output_parsers import StrOutputParser
# 配置 API 易环境
os.environ["OPENAI_API_KEY"] = "hk-xxx" # 从API易后台获取
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1" # API易基础URL
# 配置Langfuse
langfuse_handler = CallbackHandler(
public_key="pk-lf-xxx",
secret_key="sk-lf-xxx",
host="http://192.168.1.21:3000"
)
# 创建一个大语言模型
model = ChatOpenAI(model="gpt-3.5-turbo")
# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "{system_message}"),
("user", "{user_input}")
])
# 创建链
chain = LLMChain(llm=model, prompt=prompt)
# 定义传递给模型的消息内容
system_message = "把下面的语句翻译为英文。"
user_input = "无人扶我青云志,我自踏雪至山巅"
# 调用链并打印结果
response = chain.invoke(
{"system_message": system_message, "user_input": user_input},
config={"callbacks": [langfuse_handler]}
)
parser=StrOutputParser()
print(parser.invoke(response)) # 输出模型生成的内容
{'system_message': '把下面的语句翻译为英文。', 'user_input': '无人扶我青云志,我自踏雪至山巅', 'text': 'No one supports my ambition to rise to the top, I will tread through the snow to reach the summit on my own.'}
#%%
import os
from langchain_openai import ChatOpenAI
from langfuse.callback import CallbackHandler
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 配置 API 易环境
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"
# 配置Langfuse
langfuse_handler = CallbackHandler(
public_key="pk-lf-xxx",
secret_key="sk-lf-xxx",
host="http://192.168.1.21:3000"
)
# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "{system_message}"),
("user", "{user_input}")
])
# 创建模型
model = ChatOpenAI(model="gpt-3.5-turbo")
# 创建输出解析器
parser = StrOutputParser()
# 使用链式调用构建完整流程
chain = prompt | model | parser
# 定义输入内容
system_message = "把下面的语句翻译为英文。"
user_input = "无人扶我青云志,我自踏雪至山巅"dian
# 调用链并打印结果,同时传入回调处理器
response = chain.invoke(
{"system_message": system_message, "user_input": user_input},
config={"callbacks": [langfuse_handler]}
)
print(response) # 输出模型生成的内容
No one supports my ambition to reach the sky; I will ascend to the mountain peak on my own through the snow.
功能 | 描述 |
---|---|
`prompt | model |
RunnableSequence |
LangChain 内部自动创建的链结构,支持 .invoke() 和 .stream() |
config={"callbacks": [...]} |
支持回调机制,如 Langfuse、日志记录等 |
可扩展性强 | 可以加入中间处理步骤,例如过滤、重试、缓存等 |
使用 LCEL 构建一个完整的 LangChain 流程:
ChatPromptTemplate
定义提示ChatOpenAI
调用大模型StrOutputParser
解析输出RunnableSequence
链接整个流程langfuse
回调追踪调用过程import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langfuse.callback import CallbackHandler
# 配置 API 易环境
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"
# 配置 Langfuse 回调处理器
langfuse_handler = CallbackHandler(
public_key="pk-lf-xxx",
secret_key="sk-lf-xxx",
host="http://192.168.1.21:3000"
)
# 1. 定义 Prompt 模板
prompt = ChatPromptTemplate.from_messages([
("system", "{system_message}"),
("user", "{user_input}")
])
# 2. 创建 LLM 模型
model = ChatOpenAI(model="gpt-3.5-turbo")
# 3. 创建输出解析器
parser = StrOutputParser()
# 4. 使用 LCEL 构建 RunnableSequence 链条
chain = prompt | model | parser
# 5. 定义输入内容
input_data = {
"system_message": "请将以下诗句翻译为英文:",
"user_input": "无人扶我青云志,我自踏雪至山巅"
}
# 6. 调用链并获取结果
response = chain.invoke(
input_data,
config={"callbacks": [langfuse_handler]}
)
# 7. 打印结果
print("翻译结果:", response)
翻译结果:No one supports my lofty ambitions; I will tread through the snow to reach the mountain peak on my own.
Runnable
接口定义了几个关键方法,这些方法构成了LangChain 链式调用的基础:方法 | 说明 |
---|---|
.invoke(input, config) |
同步调用,处理单个输入并返回结果 |
.batch(inputs, config) |
批量处理多个输入 |
.stream(input, config) |
流式处理,逐块输出结果(适用于聊天机器人、流式生成等场景) |
.astream(input, config) |
异步流式处理 |
.bind(**kwargs) |
绑定参数,用于部分应用(partial application) |
.with_config(config) |
设置配置(如回调、超时等) |
类型 | 说明 |
---|---|
RunnableLambda |
将任意 Python 函数封装为 Runnable |
RunnableMap |
并行执行多个 Runnable,常用于字段映射 |
RunnableBranch |
条件分支,根据条件选择不同的 Runnable 分支 |
RunnableWithMessageHistory |
支持带消息历史记录的 Runnable |
RunnableParallel |
并行执行多个 Runnable |
RunnableGenerator |
支持流式输出的 Runnable |
RunnableSerializable |
可序列化的 Runnable,可用于 API 服务中传输 |
chain = prompt | model | parser
def add_prefix(text):
return "Prefix: " + text
chain = prompt | model | parser | add_prefix
for chunk in chain.stream({"topic": "dogs"}):
print(chunk, end="", flush=True)
RunnableWithMessageHistory
和 ChatMessageHistory
实现记忆功能。from langchain_core.runnables import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
chain = prompt | model | parser
with_message_history = RunnableWithMessageHistory(
chain,
lambda session_id: message_history, # 获取历史记录
input_messages_key="input",
history_messages_key="history"
)
response = with_message_history.invoke(
{"input": "What's the weather like today?", "session_id": "abc123"}
)
特性 | 描述 |
---|---|
一致性 | 所有组件都遵循相同的接口(invoke/batch/stream),易于组合 |
可扩展性 | 支持自定义 Runnable,便于集成第三方服务 |
可组合性 | 多种组合方式(串行、并行、分支) |
可观察性 | 支持回调机制(如 Langfuse、日志记录) |
异步支持 | 支持 async/await 编程范式 |
RunnableLambda
,从而加入到链中:from langchain_core.runnables import RunnableLambda
def to_upper(s: str) -> str:
return s.upper()
chain = prompt | model | parser | RunnableLambda(to_upper)
由于每个 Runnable 都是独立的单元,你可以单独测试每个步骤:
# 单独测试 prompt
print(prompt.invoke({"topic": "cats"}))
# 单独测试 model
print(model.invoke(prompt.invoke({"topic": "cats"})))
# 整体调用
print(chain.invoke({"topic": "cats"}))
特性 | 描述 |
---|---|
低延迟体验 | 用户无需等待完整响应,可以边生成边显示 |
适用于对话系统 | 在聊天界面中实现“打字效果” |
节省内存资源 | 不需要一次性加载全部结果 |
兼容性强 | 支持 LCEL、回调处理器(如 Langfuse)、中间处理函数等 |
stream()
方法.stream()
方法用于启动流式调用。for chunk in chain.stream(input_data):
print(chunk, end="", flush=True)
Runnable
接口.stream()
的对象都实现了 Runnable
接口。ChatPromptTemplate
, ChatOpenAI
, StrOutputParser
等。stream=True
)。flush=True
强制刷新输出缓冲区。langfuse_handler
回调。import os
from langchain_openai import ChatOpenAI
from langfuse.callback import CallbackHandler
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 设置环境变量
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"
# 配置Langfuse
langfuse_handler = CallbackHandler(
public_key="pk-xxx",
secret_key="sk-xxx",
host="http://192.168.1.21:3000"
)
# 定义 Prompt 模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的翻译官,请将以下内容翻译成英文:"),
("user", "{input}")
])
# 创建模型和解析器
model = ChatOpenAI(model="gpt-3.5-turbo")
parser = StrOutputParser()
# 构建链
chain = prompt | model | parser
# 输入数据
input_data = {"input": "无人扶我青云志,我自踏雪至山巅"}
# 启动同步流式处理
print("流式输出:")
for chunk in chain.stream(input_data,config={"callbacks": [langfuse_handler]}):
print(chunk, end="", flush=True) #
# 启动异步流式处理
print("流式输出:")
async for chunk in chain.astream(input_data, config={"callbacks": [langfuse_handler]}):
print(chunk, end="", flush=True)
import asyncio
# 定义一个异步函数来处理流式输出
async def stream_output():
print("流式输出:")
async for chunk in chain.astream(input_data, config={"callbacks": [langfuse_handler]}):
print(chunk, end="", flush=True)
# 调用异步函数
asyncio.run(stream_output())
on_llm_start
, on_llm_end
, on_llm_error
等等,这些事件对应了 LLM 调用的不同阶段。import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.callbacks.base import BaseCallbackHandler
from langchain.callbacks.manager import CallbackManager
from langfuse.callback import CallbackHandler as LangfuseCallbackHandler
# 自定义回调处理器
class MyCustomHandler(BaseCallbackHandler):
def on_llm_start(self, serialized, prompts, **kwargs):
print("LLM 开始运行...")
def on_llm_end(self, response, **kwargs):
print("\nLLM 结束运行.")
def on_llm_new_token(self, token: str, **kwargs):
print(token, end="", flush=True)
def on_llm_error(self, error: Exception, **kwargs):
print(f"\n发生错误:{error}")
# 设置环境变量
os.environ["OPENAI_API_KEY"] = "hk-xxx"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"
# 配置 Langfuse 回调处理器
langfuse_handler = LangfuseCallbackHandler(
public_key="pk-lf-xxx",
secret_key="sk-lf-xxx",
host="http://192.168.1.21:3000"
)
# 自定义回调处理器
custom_handler = MyCustomHandler()
# 创建回调管理器
callback_manager = CallbackManager([custom_handler, langfuse_handler])
# 定义 Prompt 模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的翻译官,请将以下内容翻译成英文:"),
("user", "{input}")
])
# 创建模型和解析器
model = ChatOpenAI(model="gpt-3.5-turbo", callback_manager=callback_manager)
parser = StrOutputParser()
# 构建链
chain = prompt | model | parser
# 输入数据
input_data = {"input": "无人扶我青云志,我自踏雪至山巅"}
# 启动流式处理
print("流式输出:")
async for chunk in chain.astream_events(input_data, config={"callbacks": [custom_handler, langfuse_handler]}):
print(chunk, end="", flush=True)