拓冰建站拓冰建站
首页 / 资讯中心 / 正文

LangChain1.2学习第三章—— LangSmith、提示词模板、历史对话、消息

说明本套资源源于B站尚硅谷教程视频链接https://www.bilibili.com/video/BV1rv7A6oEeP?spm_id_from333.788.videopod.episodesvd_sourcebba5be243325ecee1f55ec265557fedd第一章内容LangChain1.2学习第一章——知识储备-CSDN博客第二章内容LangChain1.2学习第二章—— 调用大模型-CSDN博客目录一、LangSmith概述1.1 具体功能二、调用大模型查看监控指标三、认识消息3.1 消息的内部结构3.2 消息的类型3.3 消息格式3.4 开发示例3.5 实战练习3.5.1 对话历史管理3.5.2 优化对话历史3.5.3 多轮对话—聊天机器人四、提示词模板—Prompt Templates4.1 为什么推荐提示词模板4.2 ChatPromptTemplate的使用4.2.1 方式1调用from_messages()——推荐4.2.2 方式2使用实例初始化方法4.3 模板调用的3种方式4.3.1 invoke()-返回ChatPromptValue4.3.2 使用format()—返回字符串4.3.3 使用format_messages()—返回消息列表4.3.4 调用大模型接口4.4 丰富的初始化参数类型4.4.1 str列表类型4.4.2 tuple列表类型4.4.3 dict列表类型4.4.4 Message列表类型4.4.5 MessagePromptTemplate列表类型4.4.6 BaseChatPromptTemplate列表类型五、高级特性5.1 部分变量预填充partial()一、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_TRACINGtrue # Langsmith监控WebUI地址 LANGSMITH_ENDPOINThttps://api.smith.LangChain.com # 创建的API_KEY LANGSMITH_API_KEYxxx # 自定义项目名称可以在Langsmith WebUI监控页面根据名称查看对应的运行记录 LANGSMITH_PROJECTlangsmith-testfrom langchain_qwq import ChatQwen from dotenv import load_dotenv import os load_dotenv(overrideTrue) qwen_model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.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支持两种消息格式。格式1JSON格式1、系统消息{role: system, content: 你是个善解人意的助手}2、用户消息{role: user, content: 你好啊~}3、助手消息{role: assistant, content: 我也很高兴认识你}4、工具调用消息{role: tool,content: ,tool_call_id: call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s格式21、系统消息SystemMessage(content你是个善解人意的助手)2、用户消息HumanMessage(content你好啊~)3、助手消息AIMessage(我也很高兴认识你)4、工具调用消息ToolMessage(content,tool_call_idcall_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_idcall_123), AIMessage(content北京今天是晴天) ]小结3.4 开发示例json格式from langchain_qwq import ChatQwen from dotenv import load_dotenv import os load_dotenv(overrideTrue) model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.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(overrideTrue) model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.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 不记得错误示例2conversation [{role: user, content: 问题1}]response1 model.invoke(conversation)conversation [{role: user, content: 问题2}] # 重新创建response2 model.invoke(conversation) # 丢失了历史错误示例3conversation []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(overrideTrue) model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.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(overrideTrue) model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.getenv(QWEN_BASE_URL) ) #定义函数用于保留最近的对话轮数 def keep_recent_messages(messages,max_pairs3): # 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_pairs2) 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(overrideTrue) model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.getenv(QWEN_BASE_URL) ) #基础配置 MAX_PAIRS_HISTORY 10 EXIT_WORD quit #定义函数用于保留最近的对话轮数 def keep_recent_messages(messages,max_pairs3): # 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,flushTrue) 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,flushTrue) reply_content chunk.content print(\n, * 10, f- 第 {i} 轮对话结束 -, * 10, \n) i 1 #追加AI回复 messages.append(AIMessage(reply_content))四、提示词模板—Prompt Templates4.1 为什么推荐提示词模板在 LangChain 开发中构造提示词既可以直接使用 Python 字符串拼接如 f-string、format() 或 也可以使用 LangChain 提供的 PromptTemplate或 ChatPromptTemplate。示例1字符串拼接方式# 字符串拼接 topic Python difficulty 初学者 # 难以维护容易出错 prompt_str f你是一个{difficulty}级别的编程导师。请用简单易懂的语言解释{topic}。 response model.invoke(prompt_str) print(fAI 回复{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(overrideTrue) model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.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应用 → 提示词模板必选ChatModelChatPromptTemplate输入与输出均为消息列表① 模型接口对应 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 : strcontent : 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()-返回ChatPromptValuefrom 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(overrideTrue) model ChatQwen( modelqwen-plus, api_keyos.getenv(QWEN_API_KEY), base_urlos.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) - Noneclassmethod 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 rolehuman 设计目的 简化用户输入消息的模板化构造避免重复定义角色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)
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门