资讯动态

LangChain 1.0 入门(五):提示词工程、partial变量、ChatPromptTemplate、Hub模板库

发布时间:2026/8/31 6:20:41 来源:尧图企业网站定制
系列文章LangChain 1.0 入门一Runnable 统一接口全解析含完整代码逐行输出解读LangChain 1.0 入门二LangChain 全模型标准化接入最佳实践小白参数详解版LangChain 1.0 入门三稳定性双核心——重试机制速率限速器参数详解与实战LangChain 1.0 入门四 Messages 深度解析——大模型对话上下文核心单元LangChain 1.0 入门五提示词工程、partial变量、ChatPromptTemplate、Hub模板库LangChain 1.0 入门六标准化内容块 Content Blocks——彻底解决多模型、多模态适配痛点全代码实战版前言提示词工程Prompt Engineering是大模型应用开发的核心环节手写字符串拼接提示词难以维护、无法迭代调优。LangChain‑Core 的 Prompt 模板体系就是把提示词工程代码化、工程化。本文先讲解提示词工程基础方法论再结合 RAG知识库问答、代码助手、企业客服、Agent 系统指令真实业务场景讲解API、核心参数、partial半成品模板、对话模板、LangSmith Hub模板仓库、生产踩坑与最佳实践附带完整可运行Python示例。环境依赖langchain‑core0.2.xLangChain1.0生态适配RAG、智能客服、内部助手、文档解析业务。导入提醒LangChain1.0全部从langchain_core导入废弃旧路径langchain.promptsfromlangchain_core.promptsimportPromptTemplate,ChatPromptTemplate一、提示词工程(Prompt Engineering)基础介绍1.1 什么是提示词工程提示词工程指通过设计、编写、调优输入给大模型的指令文本引导大模型按照预期的格式、逻辑、约束输出结果而不是单纯写一句提问。大模型本身不理解业务它的行为完全由输入提示词来定义你告诉它是什么角色、要做什么事、遵循什么规则、输出什么格式模型就会对应产出内容。传统方式直接硬编码字符串写Prompt适合Demo工程化方式使用模板组件管理Prompt适合线上业务系统。1.2 高质量提示词五大核心要素一套生产可用的提示词通常包含5部分这也是我们写模板时需要拆解的模块角色设定(Role)AI是什么身份例如后端代码评审专家、企业知识库客服、技术文档摘要助手任务指令(Instruction)明确告诉模型要完成的具体工作不能模糊上下文输入(Context)外部输入信息用户问题、检索知识库、待处理文档、代码片段约束规则(Constraints)边界条件禁止编造、输出格式、字数限制、语气风格输出示例(Few‑shot)给1~2个输入输出样例引导模型对齐输出格式。反面案例差的提示词帮我分析这段代码没有角色没有约束输出不可控正面案例高质量提示词你是Python后端代码评审专家【角色】 任务对传入代码做安全与性能评审输出问题清单和修复代码【指令】 待评审代码{code_snippet}【上下文】 约束只输出Markdown格式不做无关闲聊没有问题就输出“代码无明显风险”【约束】1.3 提示词工程面临的工程痛点手工写Prompt在项目迭代中会遇到现实问题这就是PromptTemplate要解决的问题提示词五大要素混杂在业务代码角色、规则散落在各个接口修改一处要改多处部分内容固定不变角色、约束规则部分内容每次请求动态变化用户问题、检索上下文每次调用重复拼接Few‑shot示例很长硬编码在业务代码可读性极差无法版本管理提示词调优Prompt只能改代码发布RAG、Agent场景system系统指令反复复制粘贴容易漏写某一条约束造成模型输出异常很难复用社区已经调优好的成熟提示词。Prompt模板的本质把提示词工程的五大要素进行拆分管理固定内容预填充动态内容做变量插值。二、为什么要使用Prompt模板在项目中直接使用f‑string拼接提示词生产环境痛点系统角色、输出格式散落在业务各处修改Prompt需要多处改代码RAG场景系统指令固定用户问题、检索上下文每次动态变化重复传参极易漏参对话模型需要维护system/human/ai消息数组字符串拼接极易出错Prompt无法版本管理无法复用社区经过调优的成熟提示词变量内容包含换行、特殊符号手动拼接容易出现格式错乱。Prompt模板核心目标提示词与业务逻辑解耦模板可复用、可维护、可版本管理实现提示词工程落地。三、PromptTemplate 普通字符串模板适用于非对话大模型、文本生成、摘要、关键词提取等文本处理场景模板内部使用{变量名}作为占位符。3.1 from_template 快速创建调试、原型开发自动解析模板中大括号占位符自动推导input_variables适合快速验证提示词工程想法。业务示例场景文档摘要生成fromlangchain_core.promptsimportPromptTemplate# 业务对输入文档片段做内容摘要max_words控制摘要字数prompt_templatePromptTemplate.from_template(【角色】文档摘要助手 【任务指令】请对下面文档片段做内容摘要 【约束】摘要控制在{max_words}字以内保留核心技术信息不要冗余描述 【待处理文档】 {document_content} 【输出摘要】)# format填充业务变量渲染出最终prompt字符串formatted_promptprompt_template.format(max_words150,document_contentLangChain‑Core是LangChain1.0的核心基础库提供Prompt模板、消息结构、LCEL链式原语不绑定任何大模型可以对接各类国产以及海外大模型用于快速搭建LLM应用。)print(formatted_prompt)3.2 显式对象实例化生产环境推荐手动显式声明input_variables代码可读性强启动阶段校验模板合法性。PromptTemplate核心参数表参数说明input_variables必填变量列表.format()必须传入一般为用户输入、检索文档、业务数据template原始提示词模板字符串使用{var}占位插值存放角色、指令、约束、占位上下文partial_variables预填静态固定变量模板定义阶段赋值后续可以被.partial()覆盖validate_template布尔校验占位符和变量是否匹配开发环境建议Truetemplate_format模板语法默认f‑string可选mustache业务示例内部技术文档关键词提取fromlangchain_core.promptsimportPromptTemplate templatePromptTemplate(input_variables[doc_text,extract_count],template 【角色】技术文档关键词提取助手 【任务】从下面技术文档中提取{extract_count}个核心业务关键词 【约束】只输出关键词逗号分隔不要多余解释 【文档内容】 {doc_text} 关键词输出,validate_templateTrue)prompt_texttemplate.format(doc_text昇腾NPU基于CANN算子库支持vLLM推理框架通过Docker容器部署大模型服务。,extract_count4)print(prompt_text)⚠️注意点占位符必须是英文大括号{var}中文全角无法识别如果需要输出字面{}符号写双大括号转义{{ }}。四、partial_variables / partial() 半成品模板生产高频提示词工程利器结合提示词工程五要素来看固定不变部分角色设定、任务指令、约束规则、Few‑shot示例几乎不会随每次请求变化动态变化部分用户query、检索上下文、待处理文档每次请求都不一样。partial能力提前填充角色、指令、约束这些固定提示词片段得到半成品模板只把动态业务内容留给后续format传入。避免每次调用重复传入一大段系统提示词。两种用法构造对象partial_variables{...}静态预填固定值运行时.partial(**kwargs)支持覆盖旧值支持传入函数做动态变量。4.1 静态partial_variables 模板定义时预填业务场景企业内部技术问答助手角色、输出约束固定仅用户问题动态传入fromlangchain_core.promptsimportPromptTemplate templatePromptTemplate(input_variables[user_query],template 【角色】公司内部技术知识库问答助手 【任务】回答员工技术问题 {answer_rule} 用户提问{user_query} 回答 ,partial_variables{answer_rule:【约束】 1. 只基于已有知识库内容回答不知道直接回复“知识库未收录该问题” 2. 条理清晰分点作答不要编造信息 3. 技术问题优先给出可执行操作步骤})# format 仅需要传入动态的 user_queryprompttemplate.format(user_query昇腾环境如何安装vLLM)print(prompt)4.2 .partial() 运行时覆盖预填变量同一套模板不同业务场景动态切换提示词约束对内技术人员输出详细对外业务人员输出通俗。# 覆盖预设回答规则切换面向普通业务人员模式prompttemplate.partial(answer_rule【约束】 1. 语言通俗易懂尽量少用专业术语 2. 不知道直接回复“知识库未收录该问题” ).format(user_query昇腾环境如何安装vLLM)print(prompt)4.3 partial高级用法传入函数生成动态变量重要partial_variables静态字典不支持函数只有.partial()支持传入函数。典型场景注入当前时间、链路TraceId丰富提示词上下文信息。fromdatetimeimportdatetimefromlangchain_core.promptsimportPromptTemplatedefget_current_datetime():获取当前服务时间模板渲染时自动执行returndatetime.now().strftime(%Y‑%m‑%d %H:%M:%S)base_templatePromptTemplate(input_variables[question],template 【请求时间】{server_time} 【角色】业务咨询助手 用户业务咨询{question} 回答)# partial传入函数渲染时自动调用执行partial_tplbase_template.partial(server_timeget_current_datetime)final_promptpartial_tpl.format(question如何查询接口调用报错日志)print(final_prompt)input_variables 与 partial变量对比项目input_variablespartial_variables / .partial()是否必须format传入✅必须❌不需要填入时机.format()每次业务调用模板定义 / 运行时.partial()是否支持覆盖✅✅后调用覆盖先前值是否支持函数❌✅仅.partial()支持函数提示词工程对应模块上下文、用户输入角色、任务指令、约束规则、Few‑shot示例✅生产最佳实践RAG、Agent把角色、任务、约束规则全部放到partial预填业务调用只传用户输入和检索结果减少漏参bug。五、ChatPromptTemplate对话消息模板项目首选现在绝大多数LLM都是对话接口接收消息数组天然对应提示词工程的模块拆分system存放角色、全局任务指令、约束规则提示词工程核心固定部分human存放用户输入、待处理上下文aiFew‑shot示例历史对话回复ChatPromptTemplate.from_messages()组装消息列表每条消息内部同样支持{变量}插值。关键区分PromptTemplate.format()返回字符串ChatPromptTemplate.format_messages()返回消息对象列表直接喂给聊天模型model.invoke(messages)。业务示例场景代码审查助手fromlangchain_core.promptsimportChatPromptTemplate chat_templateChatPromptTemplate.from_messages([(system, 【角色】后端Python代码评审专家 【任务】对代码做安全、异常捕获、资源泄漏、代码规范评审 【约束】输出Markdown格式列出风险点给出修改后的完整代码 ),(human,待评审代码片段\npython\n{code_snippet}\n),(ai,【问题摘要】1.缺少异常捕获2.文件句柄未做安全关闭),# Few‑shot输出示例(human,{user_follow_command})])messageschat_template.format_messages(code_snippet def read_file(file_path): f open(file_path,r) return f.read() ,user_follow_command请输出修复之后完整可运行代码同时逐条说明改动点)# 打印消息结构formsginmessages:print(f\n【角色】{msg.type})print(f【内容】\n{msg.content})# response model.invoke(messages)元组简写映射(system, 内容)→SystemMessage(human, 内容)→HumanMessage(ai, 内容)→AIMessageChatPromptTemplate同样支持.partial()预填system里面的角色、约束规则RAG开发中非常高频。六、LangSmith Hub 拉取社区成熟Prompt模板提示词工程不一定全部从零手写大量经过调优的提示词存放在LangSmith HubRAG、文本分类、摘要、Agent提示词直接拉取使用支持版本标记方便迭代提示词。官网https://smith.langchain.com/hub前置准备注册LangSmith账号获取LANGSMITH_API_KEY安装依赖pip install langsmith python‑dotenv.env配置环境变量。业务示例拉取官方标准RAG提示词官方模板内部已经封装好角色、任务、约束规则importosfromdotenvimportload_dotenvfromlangsmithimportClient load_dotenv()clientClient(api_keyos.getenv(LANGSMITH_API_KEY))# 拉取官方RAG提示模板 rlm/rag‑prompt线上不要每次请求拉取应用启动阶段拉取一次promptclient.pull_prompt(rlm/rag‑prompt)formatted_promptprompt.format(contextvLLM是一款高性能大模型推理服务框架支持PagedAttention大幅提升吞吐量可以在昇腾NPU上通过vLLM‑Ascend适配部署。,questionvLLM推理框架核心优势是什么)print(formatted_prompt)# response model.invoke(formatted_prompt)⚠️生产注意事项pull_prompt是网络IO禁止每次HTTP业务请求调用拉取应用启动时全局拉取一次缓存使用版本号锁定模板例如rlm/rag‑prompt:v1避免官方模板更新导致业务逻辑突变include_modelTrue会附带模型配置国产大模型建议关闭该参数增加try‑except捕获网络超时异常。七、LCEL链式调用结合Prompt模板线上标准写法模板不需要手动调用format_messages直接通过管道符|和模型组成chain输入字典自动填充模板变量。fromlangchain_core.promptsimportChatPromptTemplate# from langchain_openai import ChatOpenAI# llm ChatOpenAI(modelgpt‑4o‑mini)# RAG问答模板partial预填system中角色、任务、约束提示词工程固定部分rag_chat_promptChatPromptTemplate.from_messages([(system, 【角色】企业内部知识库助手 【任务】基于检索到的上下文回答用户问题 {limit_rule}),(human,参考上下文\n{context}\n用户问题{question})]).partial(limit_rule 【约束】 1. 仅依赖上下文信息回答 2. 不知道就如实说明禁止编造知识库不存在信息 3. 回答分点简洁输出。 )# LCEL构建链路# rag_chain rag_chat_prompt | llm# resp rag_chain.invoke({# context:检索回来的知识库文本……,# question:用户实际提问# })八、提示词工程 PromptTemplate高频踩坑清单提示词五要素缺失只写问题缺少角色、约束模型输出不可控变量名大小写敏感占位符key与传入字典key不一致直接抛出KeyError区分format()返回字符串、format_messages()返回消息对象对话模型误用format会导致报错partial_variables静态字典不能放函数动态函数变量只能用.partial(funcxxx)字面输出{}符号使用双大括号{{}}转义.partial()多次调用后调用的同名变量覆盖前面可以用来动态切换提示词约束Hub拉取模板要做启动缓存不能每一次请求走网络检索上下文context为大文本时要做长度截断防止超出模型上下文窗口Few‑shot示例不要硬编码在业务逻辑放到system消息或者partial预填。九、业务选型建议表业务场景推荐组件文本摘要、关键词提取、非对话模型PromptTemplate对话大模型、RAG问答、智能客服、代码助手ChatPromptTemplate优先角色、任务、约束规则固定仅输入动态变化ChatPromptTemplate .partial()预填提示词固定片段复用社区调优Prompt、提示词需要版本管理LangSmith Hub pull_prompt启动缓存十、总结提示词工程核心通过角色、任务指令、上下文、约束规则、Few‑shot示例引导大模型输出符合业务预期PromptTemplate用于普通字符串模板ChatPromptTemplate处理system/human/ai结构化消息是LLM业务开发首选在模板体系中partial()专门存放提示词工程的角色、指令、约束规则input_variables存放动态上下文实现提示词的模块化LangSmith Hub可以复用成熟提示词但线上必须缓存规避网络开销Prompt模板工程化的核心思想就是把提示词工程从零散字符串变成可维护、可调试、可版本迭代的业务组件。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价