LangChain 提示词工程核心组件详解
本文深入解析 LangChain 框架中的提示词(Prompt)工程模块,涵盖 PromptTemplate、ChatPromptTemplate、FewShotPromptTemplate 等核心模板类型。通过代码示例演示如何构建字符串与聊天消息模板,利用 Few-Shot 学习提升模型回答质量,并介绍示例选择器优化 Token 开销的方法。内容旨在帮助开发者掌握 LangChain 中提示词的设计与复用技巧,从而更高效地开发 AI 应用。

本文深入解析 LangChain 框架中的提示词(Prompt)工程模块,涵盖 PromptTemplate、ChatPromptTemplate、FewShotPromptTemplate 等核心模板类型。通过代码示例演示如何构建字符串与聊天消息模板,利用 Few-Shot 学习提升模型回答质量,并介绍示例选择器优化 Token 开销的方法。内容旨在帮助开发者掌握 LangChain 中提示词的设计与复用技巧,从而更高效地开发 AI 应用。

在构建基于大语言模型(LLM)的应用时,提示词(Prompt)工程是连接用户意图与模型能力的桥梁。尽管 AutoGen、LlamaIndex 等框架提供了丰富的编排能力,但 Prompt Engineering 依然是决定应用效果的核心要素。本文将深入探讨 LangChain 框架中用于管理提示词的核心组件,帮助开发者更系统地设计和复用提示词。
LangChain 提供了多种提示词模板类,旨在方便复用、接收参数及定制不同场景下的输入。根据用途,主要分为 String 和 Chat 两类:
input_variables 和 partial_variables。Prompts 是 LangChain 的核心模块,我们可以从 Prompts 模块导入以上各种类型的模块。
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import (
ChatMessagePromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
# 当然直接从 langchain 引入也可以
from langchain import PromptTemplate
PromptTemplate 适用于非聊天的文本生成任务。它允许定义一个模板字符串,其中包含占位符(如 {variable}),并在运行时填充具体值。
可以通过 from_template 方法快速创建模板对象,也可以直接调用构造函数。
from langchain import PromptTemplate
template = """\
你是一位资深咨询顾问。
你给一个在线销售{product}的电商公司,取个好的名字?
"""
prompt = PromptTemplate.from_template(template)
print(prompt.format(product="干货"))
上述代码中,{product} 是占位符。调用 format 方法后,变量会被替换生成最终的提示词。这种方式让 AI 程序能够适应更多应用场景。
除了基本变量,还可以使用 partial_variables 来固定部分参数,减少每次调用的重复输入。
prompt = PromptTemplate(
input_variables=["product", "age"],
template="你是一位资深咨询顾问。对于一个面向{age}市场的,专注于销售{product}的公司,你会推荐哪个名字?"
)
# 注意:这里需要传入正确的变量名,例如 market 应改为 age 以匹配 input_variables
print(prompt.format(product="干货", age="老年"))
聊天模板的核心在于区分不同的角色(系统、用户和助理)。首条信息通常是系统信息,用于设置助理的身份或行为;后续交互由用户提问,助手回答。传给大模型的通常是消息对象的数组。
import openai
# 模拟 OpenAI API 调用结构
messages=[
{"role": "system", "content": "你是一位专业食疗医生"},
{"role": "user", "content": "请问血糖比较高午餐应该怎么吃?"},
{"role": "assistant", "content": "一般情况下,血糖高的人午餐吃粗粮、高纤维的食物"},
{"role": "user", "content": "高纤维的食物有哪些?"}
]
# 实际使用时需结合 LangChain 的 ChatMessage 对象进行封装
在 LangChain 中,可以使用 ChatPromptTemplate 来管理这些消息序列,确保格式符合模型要求。
机器学习中存在 Few-Shot(少量样本)、One-Shot(单样本)和 Zero-Shot(零样本)的概念。Zero-Shot 依赖模型自身理解,而 Few-Shot 则通过提供示例来引导模型。
FewShotPromptTemplate 允许我们将 examples 和 template 分离,便于组装。
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
examples = [
{
"food_type": "黑木耳",
"season": "夏季",
"benefit": "木耳生长在潮湿阴凉的环境中,可以消除血液中的热毒,起到清热解毒的功效。"
},
{
"food_type": "海带",
"season": "春季",
"benefit": "海带有丰富的膳食纤维,有助于促进肠胃"
}
]
template = "干货类型:{food_type}\n季节:{season}\n文案:{benefit}"
prompt_example = PromptTemplate(input_variables=["food_type", "season", "benefit"], template=template)
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=prompt_example,
suffix="干货类型:{food_type}\n季节:{season}",
input_variables=["food_type", "season"]
)
print(prompt.format(food_type="白木耳", season="夏季"))
当示例较多时,可以使用 example_selector 减少 Token 开销并提高业务匹配性。常用的有基于语义相似度的选择器。
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
Chroma,
k=1
)
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=prompt_example,
suffix="干货类型:{food_type}\n季节:{season}",
input_variables=["food_type", "season"]
)
print(prompt.format(food_type="墨鱼", season="秋季"))
partial_variables 保存通用上下文。通过深入理解提示词模板,开发者可以更灵活地控制大模型的行为,提升 AI 应用的质量与效率。在实际项目中,建议结合 LangChain 的 Chain 机制,将提示词作为中间件嵌入到完整的业务流程中,以实现更复杂的功能逻辑。同时,关注模型版本的更新,及时调整提示词策略以适应新的模型特性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online