大模型速通学习笔记(33)
本集聚焦 LangChain 提示词模板的进阶应用,核心解决 “多角色对话适配、少样本精准引导、动态场景响应” 三大复杂需求,通过高阶模板类型与组件联动,让提示词从 “静态填空题” 升级为 “智能工作流引擎”,适配多轮对话、意图识别、个性化交互等复杂场景。
·
LangChain 提示词模板进阶:动态场景与复杂交互实战指南
一、核心主题定位
本集聚焦 LangChain 提示词模板的进阶应用,核心解决 “多角色对话适配、少样本精准引导、动态场景响应” 三大复杂需求,通过高阶模板类型与组件联动,让提示词从 “静态填空题” 升级为 “智能工作流引擎”,适配多轮对话、意图识别、个性化交互等复杂场景。
二、进阶模板核心价值
- 多角色精细化管理:明确区分系统、用户、AI 角色,适配聊天模型的原生交互格式,提升对话逻辑连贯性。
- 少样本精准引导:通过动态示例注入,让模型快速理解任务模式,大幅提升分类、问答等任务的准确性。
- 动态场景自适应:支持根据输入参数、对话历史、任务类型切换模板结构,实现 “千人千面” 的个性化输出。
- 组件联动深度整合:与 Memory、Chain、向量存储无缝对接,打通 “模板生成→模型调用→结果解析” 的完整闭环。
三、核心进阶模板类型与实操
1. ChatPromptTemplate:多角色对话专属模板
- 核心场景:适配 Chat 模型(如 GPT-4o、Qwen-Chat)的多轮对话,支持系统指令、用户输入、历史对话的结构化组合。
- 关键特性:
- 角色标准化:仅支持
system/human/ai/assistant四种角色,确保模型可识别。 - 历史动态插入:通过
MessagesPlaceholder占位符自动注入对话历史,无需手动拼接。
- 角色标准化:仅支持
- 代码示例(多轮对话场景):
python
运行
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.messages import SystemMessage, HumanMessage from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory # 1. 定义多角色模板(含历史对话占位符) chat_template = ChatPromptTemplate.from_messages([ ("system", "你是专业的技术顾问,回答简洁明了,仅围绕技术问题展开"), MessagesPlaceholder(variable_name="history"), # 对话历史占位符 ("human", "{query}") # 用户当前查询 ]) # 2. 配置记忆模块与模型 memory = ConversationBufferMemory(return_messages=True) llm = ChatOpenAI(model_name="gpt-4o", temperature=0.3) # 3. 构建对话链 conversation_chain = chat_template | llm - 调用流程:
python
运行
# 首次对话 memory.save_context({"input": "什么是LangChain的Runnable特性?"}, {"output": ""}) result = conversation_chain.invoke({ "history": memory.load_memory_variables({})["history"], "query": "什么是LangChain的Runnable特性?" }) print(result.content) # 多轮对话(自动携带历史) memory.save_context({"input": "什么是LangChain的Runnable特性?"}, {"output": result.content}) next_result = conversation_chain.invoke({ "history": memory.load_memory_variables({})["history"], "query": "它能解决什么问题?" })
2. FewShotPromptTemplate:少样本引导模板
- 核心场景:分类、意图识别、格式约束等需要模型快速理解任务模式的场景,通过示例注入提升准确性。
- 两种实用模式:
- 固定示例模式:手动指定一组示例,适用于任务模式固定的场景。
- 动态示例模式:通过
ExampleSelector根据输入语义动态选择最相关示例,避免冗余。
- 代码示例(动态示例选择):
python
运行
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate from langchain.prompts.example_selector import SemanticSimilarityExampleSelector from langchain_community.embeddings import BGEEmbeddings from langchain_community.vectorstores import Chroma # 1. 定义基础示例集 examples = [ {"question": "如何优化RAG检索精度?", "answer": "启用混合检索(向量+BM25)+ 分块优化"}, {"question": "如何降低LLM调用成本?", "answer": "使用缓存+轻量化模型+批处理"}, {"question": "如何解决对话历史过长?", "answer": "使用ConversationSummaryMemory压缩历史"} ] # 2. 定义示例格式化模板 example_prompt = PromptTemplate.from_template( "问题:{question}\n答案:{answer}" ) # 3. 配置动态示例选择器(语义相似度匹配) example_selector = SemanticSimilarityExampleSelector.from_examples( examples, BGEEmbeddings(model_name="BAAI/bge-small-zh-v1.5"), # 中文Embedding模型 Chroma, # 向量存储 k=1 # 每次选择1个最相似示例 ) # 4. 创建FewShot模板 few_shot_template = FewShotPromptTemplate( example_selector=example_selector, example_prompt=example_prompt, prefix="请参考以下示例格式,简洁回答问题:", suffix="问题:{query}\n答案:", input_variables=["query"] ) # 调用示例 print(few_shot_template.format(query="如何优化RAG的响应速度?"))
3. 条件分支模板:动态场景自适应
- 核心场景:根据输入参数(如用户类型、任务类型)切换模板结构,实现个性化适配。
- 实现方式:通过自定义模板类或
ConditionalPromptTemplate,根据条件动态选择模板逻辑。 - 代码示例(按用户类型适配):
python
运行
from langchain_core.prompts import PromptTemplate class ConditionalTaskPrompt: def __init__(self): # 定义不同场景的模板 self.expert_template = PromptTemplate.from_template( "作为技术专家,请深入解析:{question}\n要求:包含原理、实操步骤、注意事项" ) self.basic_template = PromptTemplate.from_template( "用通俗语言解释:{question}\n要求:不超过3句话,避免专业术语" ) def format(self, user_type: str, **kwargs): # 根据用户类型动态切换模板 if user_type == "expert": return self.expert_template.format(**kwargs) elif user_type == "basic": return self.basic_template.format(** kwargs) else: raise ValueError("仅支持expert(专家)和basic(普通用户)类型") # 调用示例 conditional_prompt = ConditionalTaskPrompt() # 专家用户提问 expert_prompt = conditional_prompt.format( user_type="expert", question="RAG系统中Embedding模型的选型逻辑" ) # 普通用户提问 basic_prompt = conditional_prompt.format( user_type="basic", question="RAG系统中Embedding模型的选型逻辑" )
四、进阶模板联动核心场景
1. 模板 + Memory:多轮对话上下文管理
- 核心逻辑:通过
MessagesPlaceholder与ConversationBufferMemory/ConversationSummaryMemory联动,自动注入历史对话。 - 优势:避免手动拼接历史字符串,支持历史压缩(长对话场景),提升模板复用性。
2. 模板 + 向量存储:动态示例检索
- 核心逻辑:
FewShotPromptTemplate结合VectorStoreRetrieverMemory,将示例存储在向量库中,根据输入语义检索相关示例。 - 适用场景:示例集庞大时,避免模板冗余,提升示例与输入的相关性。
3. 模板 + Chain + 解析器:完整工作流
- 核心逻辑:模板生成结构化提示词 → 模型生成结果 → 输出解析器格式化结果,形成闭环。
- 代码示例:
python
运行
from langchain_core.output_parsers import CommaSeparatedListOutputParser from langchain.chains import LLMChain # 1. 定义带格式约束的模板 template = "列出3个{topic}的核心优势,用逗号分隔:" prompt_template = PromptTemplate.from_template(template) # 2. 配置输出解析器(解析为列表) output_parser = CommaSeparatedListOutputParser() # 3. 构建完整链 chain = LLMChain( llm=llm, prompt=prompt_template, output_parser=output_parser ) # 调用结果直接为列表格式,无需手动解析 result = chain.invoke({"topic": "LangChain提示词模板"}) print(result) # 输出:["多角色适配", "动态示例注入", "组件联动"]
五、进阶使用避坑指南
1. 常见错误与解决方案
- 角色名错误:ChatPromptTemplate 的角色仅支持
system/human/ai/assistant,自定义角色名(如 “boss”)会导致模型无法识别,需统一使用标准角色。 - 参数重复赋值:使用
PromptTemplate.from_template()时,模板变量会自动解析为input_variables,无需手动指定,否则会引发TypeError。 - 变量不匹配:模板中的变量名需与
invoke传入的参数键完全一致,遗漏变量会触发ValidationError,建议开启模板校验(默认开启)。 - 历史对话过载:多轮对话中历史信息过长会导致 Token 溢出,需改用
ConversationSummaryMemory压缩历史,或限制历史存储长度。
2. 核心优化技巧
- 模板版本管理:使用 MLflow 注册模板,避免修改后无法回滚,保障生产环境稳定性。
- 防御性设计:结合
OutputFixingParser自动修复模型输出格式偏差,拦截无效结果。 - 变量显式声明:复杂模板建议通过
input_variables明确指定变量,避免冗余变量干扰。
更多推荐


所有评论(0)