AI Agent白手起家27: LangChain 提示词模板原理与实践
纲要
- 提示词在大模型应用中的核心地位
- 提示词模板的工作原理
- 提示词模板的优势
- 从自然语言到结构化输出的完整链路
- 优质提示词的基本要素
- LangChain 中的两种模板
PromptTemplateChatPromptTemplate
- 实战:使用
ChatPromptTemplate构建一个旅游攻略生成器 - 完整可运行代码
- 总结
提示词:大模型应用的“控制面板”
对于任何基于大语言模型的应用而言,提示词(Prompt)是最主要的人机交互方式。即便不进行应用开发,我们日常使用 ChatGPT、DeepSeek 等工具时,本质上就是在不断撰写提示词。在 LangChain 的组件体系中,提示词模板被提升到了一个可工程化、可复用的层次,成为连接用户意图与模型能力的核心桥梁。
一个大模型应用的典型 IO 流程如下:
- 提示词模板将动态内容抽象为变量,将不变的部分固化,类似于填空题。
- 大模型接收完整的提示词,进行推理并返回自然语言。
- 输出解析器将自然语言转换为程序可读的结构化数据(如 JSON),供下游系统使用。
这个过程清晰地展示了提示词在整个系统中的关键作用:它既是模型的输入源,也是影响输出质量最重要的可控因素。
提示词模板的工作原理
在没有模板的情况下,我们每次调用模型都要手动拼接完整的提示词,不仅重复劳动,还难以维护和版本控制。提示词模板通过占位符将可变部分抽离:
- 模板: “{role},请为我规划一个{theme}的旅行攻略,预算{budget}元。”
- 变量: role=“导游”, theme=“海南”, budget=“10000”
- 格式化后: “导游,请为我规划一个海南的旅行攻略,预算10000元。”
在 LangChain 中,这一过程通过format或invoke方法完成,模板会自动处理变量的注入,生成最终提交给模型的字符串或消息列表。
提示词模板的核心优势
- 复用性:同一个模板可以填入不同的变量值,生成多样化的提示词。
- 可维护性:集中管理提示词逻辑,修改模板一处即可同步所有调用。
- 版本控制:模板作为代码的一部分,可以纳入 Git 进行团队协作和历史追溯。
- 安全性:可对变量进行校验,防止注入恶意内容。
好提示词的要素
优质提示词通常包含以下结构(对非推理模型尤其重要):
- 角色设定:赋予模型一个专家身份,引导其进入特定领域语境。
- 背景信息:提供上下文,说明问题的来龙去脉。
- 明确目标:清晰描述希望达成的结果。
- 约束条件:指明格式、语气、禁忌等要求。
例如,一个糟糕的提示词:
“帮我做一份旅行攻略。”
而一个高质量的提示词:
“假设你是一名资深导游,我要和两位朋友去海南玩七天,预算一万元。我们不喜欢行程太赶,也不喜欢网红景点,更偏爱有文化底蕴的地方。请推荐景点并附上门票价格。”
后者给出了明确的角色、约束和期望,模型响应质量会显著提升。
LangChain 中的两种模板
LangChain 为不同模型类型提供了对应的模板类:
| 模板类 | 适用模型 | 输出格式 |
|---|---|---|
PromptTemplate | 传统 LLMs(纯文本补全) | 字符串 |
ChatPromptTemplate | ChatModels(对话型) | 消息列表(支持 system, human, ai 等角色) |
目前绝大多数模型都已转向 Chat 模式,因此推荐优先使用ChatPromptTemplate。它支持系统消息、人类消息的独立构建,并将模板变量分别注入。
实战:使用 ChatPromptTemplate 构建旅游攻略生成器
下面通过一个完整示例,展示如何用 LangChain 的提示词模板构建一个可复用的旅行攻略助手。我们将定义一个包含系统角色和用户模板的ChatPromptTemplate,并调用模型生成结构化回答。
项目结构
├── main.py └── requirements.txt依赖安装
pipinstalllangchain-openai langchain-core完整可运行代码
importosfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplate# 1. 初始化模型llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7,api_key=os.getenv("OPENAI_API_KEY"),)# 2. 定义提示词模板template=ChatPromptTemplate.from_messages([("system","你是一位资深的旅行规划师,擅长制定个性化的旅行方案。"),("human",("我要和{num_people}位朋友去{destination}玩{days}天,""总预算{budget}元。我们不喜欢行程太紧凑,也不喜欢网红景点,""更偏爱有文化底蕴的景点。请推荐景点并尽量附上门票价格。")),])# 3. 填入具体变量prompt=template.invoke({"num_people":"两","destination":"海南","days":"7","budget":"10000",})print("生成的提示词消息:")print(prompt.to_string())print("\n"+"="*50+"\n")# 4. 调用模型response=llm.invoke(prompt)print("模型回答:")print(response.content)ifresponse.usage_metadata:print("\nToken 用量:",response.usage_metadata)运行说明:
- 需要设置环境变量
OPENAI_API_KEY为有效的 OpenAI API 密钥。 - 代码使用 GPT-3.5-turbo 进行演示,成本低且足以完成规划任务。
- 可根据需要调整模板中的系统消息和人类消息,增加更多约束或角色细节。
- 若想接入本地模型(如 Ollama),将
ChatOpenAI替换为ChatOllama并修改base_url即可,模板部分完全通用。
总结
- 提示词是连接人类意图和模型能力的唯一通道,其质量直接决定应用效果。
- LangChain 的提示词模板通过变量和格式化实现了提示词的工程化管理,提升了复用性、可维护性和安全性。
ChatPromptTemplate是目前最推荐的模板类型,支持多角色消息构建,适配绝大多数模型。- 好的提示词应包含角色、背景、目标和约束四个要素,这是 AI Agent 开发的基本功。