说明:本套资源源于B站尚硅谷教程,视频链接:https://www.bilibili.com/video/BV1rv7A6oEeP?spm_id_from=333.788.videopod.episodes&vd_source=bba5be243325ecee1f55ec265557fedd
第一章内容:LangChain1.2学习第一章——知识储备-CSDN博客
第二章内容:LangChain1.2学习第二章—— 调用大模型-CSDN博客
目录
4.2.1 方式1:调用from_messages()——推荐
4.3.1 invoke()-返回ChatPromptValue
4.3.3 使用format_messages()—返回消息列表
4.4.5 MessagePromptTemplate列表类型
4.4.6 BaseChatPromptTemplate列表类型
一、LangSmith概述
LangSmith 是 LangChain 生态系统中专门用于 LLM(大语言模型)应用调试、监控、评估和管理 的平台。
- 追踪(tracing):记录每次 LLM 调用的详细信息
- 监控(monitoring):实时查看应用性能
- 调试(debug):排查问题和优化性能
- 评估(evaluate):系统化测试 LLM 应用
1.1 具体功能
功能1:核心应用与开发
Tracing(追踪):
- 功能:这是 LangSmith 最核心的功能。它会完整记录你大模型应用的每一次调用链路(Trace)。
- 当你的 Agent(智能体)或 RAG 系统运行变慢或报错时,点击进入对应的项目,你可以看到每一步具体的 Prompt 是什么、模型返回了什么、消耗了 多少 Token,以及每一个链条节点的耗时,非常方便排查 Bug 和优化性能。
Monitoring(监控):
- 功能:提供生产环境的高级数据可视化看板。
- 作用:帮你从宏观角度监控应用在一段时间内的运行状况。你可以看到 Token 消耗趋势、 QPS(每秒请求数)、错误率、平均延迟(Latency)以及成本预估。适合应用上线后观察系统的 稳定性和开销。
Datasets & Experiments(数据集与实验):
- 功能:用于管理测试数据集并运行对比实验。
- 作用:你可以把用户的真实输入、特定的边界情况(Edge Cases)存为数据集。当你修改了 Prompt 或更换了底层大模型时,可以在这里运行自动化对比测试,直观看到新旧版本在同一批测 试集上的表现差异。
Evaluators(评估器):
- 功能:配置和自动化评估任务。
- 作用:大模型的输出往往难以用传统的断言(Assert)来测试。这里允许你配置基于规则(如关键 词匹配)或基于模型(LLM-as-a-judge)的评估指标(如:答案相关性、是否包含幻觉等),对追 踪到的数据或实验结果进行自动打分。
Annotation Queues(标注队列):
- 功能:人工反馈与数据清洗工具。
- 作用:在应用开发或初上线阶段,你可以把一部分痕迹(Traces)发送到标注队列中,让团队中的 核心成员、业务专家或人工客服进行手动打分、纠正回答或贴标签,这些高质量的人工标注数据后 续可直接用于微调模型或充当测试集。
功能2:提示词与调试工具
Prompts(提示词管理):
- 功能:类似“提示词版的 GitHub”。
- 作用:把 Prompt 从代码中解耦出来,统一在云端管理。你可以在这里对 Prompt 进行版本控制 (如 v1、v2),直接在代码中通过 API 动态拉取最新的提示词。它还支持团队协作和 Prompt 的分享。
Playground(演练场):
- 功能:一个网页端的模型交互界面。
- 作用:无需写任何代码,直接在这里选择不同的模型(如 OpenAI、Anthropic 或是本地模型), 快速微调并测试你的 Prompt 效果,还可以一键将调整好的 Prompt 保存到上方的 Prompts 仓库 中。
Studio(工作室):
- 功能:通常与 LangGraph 深度集成,提供可视化的图形交互界面。
- 作用:如果你的应用是基于图结构(Graph-based)的复杂复杂 Agent 架构,Studio 可以让你可 视化地看到状态机(State)在各个节点之间的流转,甚至支持在某个节点“暂停”,手动修改数据 后再继续向下执行,是调试复杂智能体交互的利器。
Context Hub(上下文中心):
- 功能:管理全局上下文或通用组件配置。
- 作用:用于存放可在多个项目或 Prompt 中复用的公共上下文模板、全局变量或系统预设提示。
功能3:部署与沙盒
Deployments(部署):
- 功能:一键将你的 LangChain 应用或 LangGraph Agent 部署为线上可用的 API 服务(通常依托于 LangGraph Cloud)。
- 作用:提供开箱即用的生产端点,帮你处理高并发、队列管理和状态持久化,让你专注于编写业务 逻辑。
Sandboxes(沙盒):
- 功能:提供轻量级的在线运行和测试环境。
- 作用:在不污染生产环境的前提下,供开发人员安全地试运行、测试新部署的 Agent 或执行自动化 脚本。
建议:现阶段大家可以重点关注 Tracing(观察你的项目里的调用细节)和 Playground(快速调 优提示词)。当你的应用结构开始走向复杂(比如引入了复杂的 RAG 检索或多 Agent 协同)时, 再逐步引入 Datasets 进行量化评估,并利用 Studio 进行可视化调试。
二、调用大模型,查看监控指标
账号准备:请自行到LangSmith申请API-KEY。
修改.env 配置文件
# 是否启用Langsmith监控功能 LANGSMITH_TRACING=true # Langsmith监控WebUI地址 LANGSMITH_ENDPOINT=https://api.smith.LangChain.com # 创建的API_KEY LANGSMITH_API_KEY=xxx # 自定义项目名称,可以在Langsmith WebUI监控页面根据名称查看对应的运行记录 LANGSMITH_PROJECT="langsmith-test"
from langchain_qwq import ChatQwen
from dotenv import load_dotenv
import os
load_dotenv(override=True)
qwen_model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
messages = [
"请介绍侯莫陈崇",
"在平定安史之乱中,谁的功能最大",
"秦始皇的功与过"
]
response = qwen_model.batch_as_completed(messages)
for result in response:
print(f" {result}")
本地运行后,查看监控指标


具体监控请自行学习
三、认识消息
大模型没有记忆,它的输出只和输入模型的内容有关(上下文)。很多大模型API服务也没有在服务端维 护会话历史,是“ 无状态”的。因此,如果应用需要“记住”对话历史,需要在程序中维护消息列表。

在 LangChain 中,Message(消息)是模型交互的最基本单元。它既代表模型接收到的 (Input) ,也代表模型生成的 输出(Output) 。
每一轮与大模型的对话,都由一条或多条 Message 构成。每个 Message 不仅包含 文字内容,还 携带描述上下文状态的 元信息(metadata) ,用于保持对话的一致性和可追踪性。比如,模型 在多轮交互中理解“谁在说话”、“说了什么”、“这条信息属于哪一轮对话”。
LangChain 在 1.0 中提供了跨模型统一的 Message 标准。无论你使用的是 OpenAI、Anthropic、 Gemini 还是本地模型,这一标准都能保持一致的行为。好处:
- 兼容性强:不同模型的消息格式自动对齐。
- 可扩展性高:方便添加多模态内容或自定义字段。
- 可追踪性好:为 LangSmith 等调试工具提供一致的上下文数据结构。
3.1 消息的内部结构
LangChain的消息(Message)对象包含三种字段:
- Role:消息所属的角色或类型,如 system 、user、assistant。
- Content:消息内容
- Metadata:(可选)元数据,存储额外信息。如:消息ID、响应时间、token消耗量、消息标签等。
3.2 消息的类型
LangChain定义了很多消息类型,通过 role 区分。常用的有四种。
1、系统消息
也称为系统提示词,用于在对话开始时为模型设定角色、行为准则和上下文背景。它像是给AI助手的一 份工作说明书,决定了其回答问题的风格、领域和专业范围。
{"role": "system", "content": "你是个精通编程的软件架构师"}
2、用户消息
也称为用户提示词,在多轮对话中,它表示用户的一次输入。可以包含简单的文本问题,也可以是复杂 的多模态内容(如图片、音频、文档等)。
{"role": "user", "content": "你好啊~"}
3、助手(AI)消息
代表模型的回复,包括生成的文本、工具调用、元数据等。
{"role": "assistant", "content": "我也很高兴认识你"}
4、工具调用消息
工具调用结果匹配的消息类型。将此消息返回给模型,让模型基于这个结果继续生成回复。在Tools一节 详细介绍。
{"role": "tool",
"content": "今天天气很好",
"tool_call_id": "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"}
问题:为什么使用不同的消息类型?
- 明确角色:清晰区分系统提示、用户输入和 AI 回复
- 控制行为:通过 SystemMessage 精确控制 AI 的行为
- 对话历史:构建完整的多轮对话上下文
- 调试友好:更容易追踪和调试对话流程
3.3 消息格式
LangChain支持两种消息格式。
格式1:JSON格式
1、系统消息
{"role": "system", "content": "你是个善解人意的助手"}
2、用户消息
{"role": "user", "content": "你好啊~"}
3、助手消息
{"role": "assistant", "content": "我也很高兴认识你"}
4、工具调用消息
{"role": "tool",
"content": "",
"tool_call_id": "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"}
格式2:
1、系统消息
SystemMessage(content="你是个善解人意的助手")
2、用户消息
HumanMessage(content="你好啊~")
3、助手消息
AIMessage("我也很高兴认识你")
4、工具调用消息
ToolMessage(
content="",
tool_call_id="call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s" # 一定要和AI消息中的调用ID匹 配)
示例
from langchain_core.messages import (
HumanMessage, # 用户消息
AIMessage, # AI 消息
SystemMessage, # 系统消息
ToolMessage # 工具返回消息
)
# 消息列表示例
messages = [
SystemMessage(content="你是一个助手"),
HumanMessage(content="你好"),
AIMessage(content="你好!有什么可以帮你?"),
HumanMessage(content="天气怎么样?"),
AIMessage(content="让我查询一下..."),
ToolMessage(content="北京:晴天", tool_call_id="call_123"),
AIMessage(content="北京今天是晴天")
]
小结

3.4 开发示例
json格式
from langchain_qwq import ChatQwen
from dotenv import load_dotenv
import os
load_dotenv(override=True)
model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
messages = [
{"role":"system","content":"你是一位历史学家。"},
{"role":"user","content":"你好"},
{"role":"assistant","content":"你好,我能帮助你什么?"},
{"role":"user","content":"请简单介绍李弼"}
]
print(model.invoke(messages))

对象格式
from langchain.messages import SystemMessage,HumanMessage,AIMessage
from dotenv import load_dotenv
import os
load_dotenv(override=True)
model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
messages = [
SystemMessage("你是一位历史学家。"),
HumanMessage("你好"),
AIMessage("你想问什么问题?"),
HumanMessage("请为我介绍于谨")
]
print(model.invoke(messages).content)

3.5 实战练习
3.5.1 对话历史管理
关键规则:每次调用必须传递完整的对话历史!
也就是说:
第 1 轮:
[system, user] → AI回复 → 保存回复
第 2 轮:
[system, user, assistant, user] → AI回复 → 保存回复
第 3 轮:
[system, user, assistant, user, assistant, user] → AI回复
注意:每次对话都要在原有的消息列表中添加新消息,不可重新创建新的列表。
错误示例1:
# 第一次
response1 = model.invoke("我叫张三")
# 第二次(没传历史)
response2 = model.invoke("我叫什么?") # AI 不记得!
错误示例2:
conversation = [{"role": "user", "content": "问题1"}]
response1 = model.invoke(conversation)
conversation = [{"role": "user", "content": "问题2"}] # 重新创建!
response2 = model.invoke(conversation) # 丢失了历史
错误示例3:
conversation = []
conversation.append({"role": "user", "content": "问题1"})
response1 = model.invoke(conversation) # 忘记保存 response1.content! conversation.append({"role": "user", "content": "问题2"})
response2 = model.invoke(conversation) # AI 不知道之前的回答
正确做法:
conversation = []
# 第一次
conversation.append({"role": "user", "content": "我叫张三"})
response1 = model.invoke(conversation)
# 关键:保存 AI 回复
conversation.append({"role": "assistant", "content": response1.content})
# 第二次(传递完整历史)
conversation.append({"role": "user", "content": "我叫什么?"})
response2 = model.invoke(conversation) # AI 记得
示例代码:
from langchain.messages import SystemMessage,HumanMessage,AIMessage
from dotenv import load_dotenv
import os
load_dotenv(override=True)
model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
messages = [
HumanMessage("我叫张三")
]
response1 = model.invoke(messages).content
messages.append(AIMessage(response1))
messages.append(HumanMessage("我叫什么"))
print(model.invoke(messages).content)

3.5.2 优化对话历史
问题:对话历史会越来越长,消耗大量 tokens 和成本。
解决方案:只保留最近 N 轮对话。具体的:
- 总是保留 system 消息(定义角色)
- 只保留最近 N 轮对话,丢弃更早的历史
代码:
from langchain.messages import SystemMessage,HumanMessage,AIMessage
from dotenv import load_dotenv
import os
load_dotenv(override=True)
model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
#定义函数,用于保留最近的对话轮数
def keep_recent_messages(messages,max_pairs=3):
# max_pairs:指定要保留的几轮对话.每轮 = user + assistant
#分离 system 对话
system_messages = [m for m in messages if(m.type == "system")]
#非 system 对话
other_messages = [m for m in messages if(m.type != "system")]
# 保留最近2轮对话
result_messages = other_messages[-(max_pairs * 2):]
#返回 system + 最近对话
return system_messages + result_messages
#初始化
messages = [SystemMessage("你是一位Python老师")]
#第一轮对话
messages.append(HumanMessage("请用一句话解释什么是列表"))
r1 = model.invoke(messages).content
# 保存第一轮对话
messages.append(AIMessage(r1))
#第二轮对话
messages.append(HumanMessage("请用一句话解释是什么是字典"))
r2 = model.invoke(messages).content
messages.append(AIMessage(r2))
#第三轮
messages.append(HumanMessage("请解释列表和字典的区别"))
r3 = model.invoke(messages).content
messages.append(AIMessage(r3))
print(f"原始消息数量:{len(messages)}")
#只保留最近两轮对话
result = keep_recent_messages(messages,max_pairs=2)
print(f"优化后的消息数量是:{len(result)}")
print(f"优化后的消息内容是:{result}")
#新一轮提问
messages.append(HumanMessage("我的最后一个问题是什么"))
r4 = model.invoke(messages).content
print(r4)

3.5.3 多轮对话—聊天机器人
from langchain.messages import SystemMessage,HumanMessage,AIMessage
from dotenv import load_dotenv
from langchain_qwq import ChatQwen
import os
load_dotenv(override=True)
model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
#基础配置
MAX_PAIRS_HISTORY = 10
EXIT_WORD = "quit"
#定义函数,用于保留最近的对话轮数
def keep_recent_messages(messages,max_pairs=3):
# max_pairs:指定要保留的几轮对话.每轮 = user + assistant
#分离 system 对话
system_messages = [m for m in messages if(m.type == "system")]
#非 system 对话
other_messages = [m for m in messages if(m.type != "system")]
# 保留最近2轮对话
result_messages = other_messages[-(max_pairs * 2):]
#返回 system + 最近对话
return system_messages + result_messages
messages = [
SystemMessage("你是一位历史老师,也是一名耐心、友好的智能助手。我会用自然、清晰的方式回答用户问题。")
]
#启动提示
print(f"请输入你的问题,按{EXIT_WORD}退出。")
#多轮对话主循环
i = 1
while True:
print("\n", "=" * 10, f'-> 第 {i} 轮对话开始 <-', "=" * 10, "\n")
user_input = input("请输入你的问题:")
if user_input.lower() == EXIT_WORD:
print("对话已结束")
break
#追加用户信息
messages.append(HumanMessage(user_input))
#流式输出
print("老师说:",end="",flush=True)
reply_content = ""
#管理历史记忆
memory_messages = keep_recent_messages(messages,MAX_PAIRS_HISTORY)
for chunk in model.stream(memory_messages):
if chunk.content:
print(chunk.content,end="",flush=True)
reply_content += chunk.content
print("\n", "=" * 10, f'-> 第 {i} 轮对话结束 <-', "=" * 10, "\n")
i += 1
#追加AI回复
messages.append(AIMessage(reply_content))

四、提示词模板—Prompt Templates
4.1 为什么推荐提示词模板?
在 LangChain 开发中,构造提示词既可以直接使用 Python 字符串拼接(如 f-string、format() 或 +),也可以使用 LangChain 提供的 PromptTemplate或 ChatPromptTemplate。
示例1:字符串拼接方式
# 字符串拼接
topic = "Python"
difficulty = "初学者"
# 难以维护,容易出错
prompt_str = f"你是一个{difficulty}级别的编程导师。请用简单易懂的语言解释{topic}。"
response = model.invoke(prompt_str)
print(f"AI 回复:{response.content}...\n")
优点:
- 简单直接,上手快
- 适合临时 demo
- 无额外学习成本
缺点:
- 可读性差(变量多时混乱)
- 不易维护(修改容易出错)
- 无变量校验(容易漏/拼错)
- 难以支持复杂场景(多轮对话 / RAG / Few-shot)
示例2:提示词模板
from dotenv import load_dotenv
from langchain_qwq import ChatQwen
from langchain_core.prompts import ChatPromptTemplate
import os
load_dotenv(override=True)
model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
prompt_template = ChatPromptTemplate([
("system","你是一个AI开发工程师. 你的名字是 {name}"),
("user","{user_input}")
])
prompt = prompt_template.invoke({"name":"张三","user_input":"请为我推荐一份Python学习课程"})
print(prompt)
优点:
- 结构清晰(变量占位)
- 易维护、可复用
- 自动变量校验(更安全)
- 支持复杂场景(对话 / RAG / Agent)
- 可与 LangChain 生态无缝集成
- 便于调试与日志追踪
缺点:
- 有一定学习成本
- 初期写法略复杂
- 对极简单场景略“重"
选择建议:
- 小项目 / 临时用 → 字符串拼接
- 正式开发 / AI应用 → 提示词模板(必选)
ChatModel+ChatPromptTemplate(输入与输出均为消息列表)
① 模型接口:对应 LangChain 1.0 的主流接口 ChatModel。
② 工作方式:现代聊天模型 API 已原生 支持角色概念。它们不再接受单一字符串, 而是要求输入 一个结构化的消息列表。为构建复杂、可靠的多轮对话智能体系统奠定了坚实的基础。
③ Prompt 工具: ChatPromptTemplate 因此成为LangChain 1.0 中最核心的 Prompt工具。它的职 责是接收变量,并输出一个 List「BaseMessage](消息列表),该列表可直接传递给聊天模型。
4.2 ChatPromptTemplate的使用
在LangChain 1.0中,ChatPromptTemplate 是用于生成消息列表的核心组件。
ChatPromptTemplate是创建 聊天消息列表的提示模板。它比普通 PromptTemplate 更适合处理多角 色、多轮次的对话场景。支持 System / Human /AI 等不同角色的消息模板。
消息类型:

有两种实现方式:
ChatPromptTemplate 可以通过 AI 的回复(用于对话历史) 初始化方法或 from_messages 方法来实例化提示词模板。实例化 时需要传入 messages参数 。常见类型是:tuple构成的列表,参数类型(role : str,content : str )
4.2.1 方式1:调用from_messages()——推荐
该方法允许传入一个由元组(Tuple)构成的列表,列表中的每一个元组都代表一条具有特定角色的消息。
from langchain_core.prompts import ChatPromptTemplate
from dotenv import load_dotenv
from langchain_qwq import ChatQwen
chat_template = ChatPromptTemplate.from_messages(
[
("system","你是一位历史老师,你叫{name}"),
("user","你好,你最熟悉哪些历史?"),
("ai","我最熟悉西晋历史"),
("human","{user_input}")
]
)
# 格式化聊天提示词模板中的变量
prompt = chat_template.invoke({"name":"王老师","user_input":"请为我介绍西晋八王之乱"})
print(format(prompt))

4.2.2 方式2:使用实例初始化方法
from langchain_core.prompts import ChatPromptTemplate
chat_template = ChatPromptTemplate(
[
# {role},{content}的方式
("system","你是一位历史老师,你叫{name}"),
("user","你好,你最熟悉哪些历史?"),
("ai","我最熟悉西晋历史"),
("human","{user_input}")
]
)
prompt = chat_template.invoke({"name":"王老师","user_input":"请为我介绍西晋八王之乱"})
print(format(prompt))

说明:from_messages()的底层,也是调用的类的__init()__方法
4.3 模板调用的3种方式
对比:invoke()、format()、format_messages()
4.3.1 invoke()-返回ChatPromptValue
from langchain_core.prompts import ChatPromptTemplate
chat_template = ChatPromptTemplate(
[
# {role},{content}的方式
("system","你是一位历史老师,你叫{name}"),
("user","你好,你最熟悉哪些历史?"),
("ai","我最熟悉西晋历史"),
("human","{user_input}")
]
)
prompt = chat_template.invoke({"name":"王老师","user_input":"请为我介绍西晋八王之乱"})
print(type(prompt))
print(len(prompt.messages))
print(prompt)

4.3.2 使用format()—返回字符串
from langchain_core.prompts import ChatPromptTemplate
chat_template = ChatPromptTemplate(
[
# {role},{content}的方式
("system","你是一位历史老师,你叫{name}"),
("user","你好,你最熟悉哪些历史?"),
("ai","我最熟悉西晋历史"),
("human","{user_input}")
]
)
prompt = chat_template.format(name = "李老师",user_input = "请为我介绍西晋八王之乱")
print(type(prompt))
print(len(prompt))
print(prompt)

4.3.3 使用format_messages()—返回消息列表
from langchain_core.prompts import ChatPromptTemplate
chat_template = ChatPromptTemplate(
[
# {role},{content}的方式
("system","你是一位历史老师,你叫{name}"),
("user","你好,你最熟悉哪些历史?"),
("ai","我最熟悉西晋历史"),
("human","{user_input}")
]
)
prompt = chat_template.format_messages(name = "李老师",user_input = "请为我介绍西晋八王之乱")
print(type(prompt))
print(len(prompt))
print(prompt)

4.3.4 调用大模型接口
from dotenv import load_dotenv
from langchain_qwq import ChatQwen
from langchain_core.prompts import ChatPromptTemplate
import os
load_dotenv(override=True)
model = ChatQwen(
model="qwen-plus",
api_key=os.getenv("QWEN_API_KEY"),
base_url=os.getenv("QWEN_BASE_URL")
)
chat_template = ChatPromptTemplate(
[
# {role},{content}的方式
("system","你是一位历史老师,你叫{name}"),
("human","{user_input}")
]
)
prompt = chat_template.format(name = "李老师",user_input = "请为我介绍西晋八王之乱")
result = model.invoke(prompt)
print(result.content)

4.4 丰富的初始化参数类型
前面讲了ChatPromptTemplate的两种创建方式。我们看到不管使用实例初始化方法,还是使用 from_messages(),参数类型都是列表类型。列表中的元素可以是多种类型,前面我们主要测试了元 组类型。
源码:
def __init__(self,
messages: Sequence[BaseMessagePromptTemplate | BaseMessage |
BaseChatPromptTemplate | tuple[str | type, str | list[dict] | list[object]] |
str | dict[str, Any]],
*,
template_format: Literal["f-string", "mustache", "jinja2"] = "f
string",
**kwargs: Any) -> None
@classmethod def from_messages(cls,
messages: Sequence[BaseMessagePromptTemplate | BaseMessage
| BaseChatPromptTemplate | tuple[str | type, str | list[dict] | list[object]]
| str | dict[str, Any]],
template_format: Literal["f-string", "mustache", "jinja2"]
= "f-string")-> ChatPromptTemplate
结论:参数是列表类型,列表的元素可以是字符串、字典、字符串构成的元组、消息类型、提示词模板 类型、消息提示词模板类型等。
4.4.1 str列表类型
列表参数格式是str类型(不推荐),因为默认角色都是human。
#1.导入相关依赖
from langchain_core.prompts import ChatPromptTemplate
# 2.定义聊天提示词模版
chat_template = ChatPromptTemplate.from_messages(
[
"Hello, {name}!" # 等价于 ("human", "Hello, {name}!")
]
)
# 3. 使用invoke执行
messages = chat_template.invoke({"name":"小谷AI"})
# 4.打印格式化后的聊天提示词模版内容
print(messages)
4.4.2 tuple列表类型
列表参数格式是元组类型
# 示例: 元组形式的消息
prompt = ChatPromptTemplate.from_messages([
("system", "你的名字是{role}."),
("human", "很高兴认识你"),
])
print(prompt.invoke({"role":"小智"}))
4.4.3 dict列表类型
# 示例: 字典形式的消息
prompt = ChatPromptTemplate.from_messages([
{"role": "system", "content": "你的名字是{role}."},
{"role": "human", "content":"很高兴认识你"},
])
print(prompt.invoke({"role":"小智"}))
4.4.4 Message列表类型
from langchain_core.messages import SystemMessage,HumanMessage
chat_prompt_template = ChatPromptTemplate.from_messages([
SystemMessage(content="我是一个贴心的智能助手"),
HumanMessage(content="我的问题是:人工智能英文怎么说?")
])
messages = chat_prompt_template.invoke({})
print(messages)
print(type(messages))
注意:在XxxMessage中不能有占位符。即:
from langchain_core.messages import SystemMessage,HumanMessage
chat_prompt_template = ChatPromptTemplate.from_messages([
SystemMessage(content="我是一个贴心的智能助手"),
HumanMessage(content="我的问题是:{word}英文怎么说?")
])
messages = chat_prompt_template.invoke({"word":"人工智能"})
print(messages)
print(type(messages))
4.4.5 MessagePromptTemplate列表类型
LangChain提供不同类型的MessagePromptTemplate。最常用的是 SystemMessagePromptTemplate 、 HumanMessagePromptTemplate 和 AIMessagePromptTemplate ,分别创建系统消息、人工消息和AI消息。
基本概念:
HumanMessagePromptTemplate,专用于生成 用户消息(HumanMessage) 的模板类
- 模板化:支持使用变量占位符,可以在运行时填充具体值
- 格式化:能够将模板与输入变量结合生成最终的聊天消息
- 输出类型:生成 HumanMessage 对象( content + role="human" )
- 设计目的 :简化用户输入消息的模板化构造,避免重复定义角色
SystemMessagePromptTemplate、AIMessagePromptTemplate:类似于上面,不再赘述
from langchain_core.prompts import ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate,AIMessagePromptTemplate
#创建消息模板
system_message = SystemMessagePromptTemplate.from_template("你是一个{role}")
user_message = HumanMessagePromptTemplate.from_template("请为我解答{content}")
#组装成提示词模板
chat_template = ChatPromptTemplate.from_messages(
[
system_message,
user_message
]
)
#格式化提示
formatted_messages = chat_template.invoke({"role":"历史老师","content":"南宋历史"})
print(formatted_messages)

4.4.6 BaseChatPromptTemplate列表类型
使用 BaseChatPromptTemplate,可以理解为ChatPromptTemplate里嵌套了 ChatPromptTemplate。
from langchain_core.prompts import ChatPromptTemplate
message1 = ChatPromptTemplate.from_messages(
[("system","你是一位{role}")]
)
message2 = ChatPromptTemplate.from_messages(
[("human","{content}")]
)
message = ChatPromptTemplate.from_messages(
[message1,message2]
)
result = message.invoke({"role":"历史老师","content":"南宋历史"})
print(result)
五、高级特性
5.1 部分变量预填充:partial()
预填充某些固定不变的变量,创建模板的变体。
使用场景:
- 某些变量在所有调用中都相同
- 需要为不同用户/场景创建定制模板
from langchain_core.prompts import ChatPromptTemplate
# 原始模板
template = ChatPromptTemplate.from_messages(
[("system","你是{role},目标用户是{audience}"),
("user","{task}")]
)
# 部分填充
support_template = template.partial(
role="客服专员",
audience="消费者"
)
#只需要提供task
message = support_template.invoke({"task":"请退款"})
print(message)


401

被折叠的 条评论
为什么被折叠?



