提示词工程


提示词工程

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

作者|江南一点雨
来源|江南一点雨
事无巨细,提示词模板这块松哥也和大家做一个详细介绍。
本文基于langchain。
什么样的提示词算优秀?
松哥的经验是四点:
立角色
讲问题
定目标
补要求
立角色就是指定回答者的身份(如专家、教师、程序员),提升专业性。
无角色提问:“写一封投诉回复信。”→回答可能缺乏针对性。
角色设定提问:“作为资深客服主管,用专业且不失温和的语气,写一封针对物流延迟的投诉回复邮件。”→回答会更符合客服场景,包含解决方案(如补偿措施)和礼貌用语。
这个好理解,讲明白你的问题产生背景,你的具体问题。
问题要足够具体,最好能够结构化输出,这样模型也会结构化回答。
举个简单的例子:
无结构提问:“如何准备面试?”→回答可能冗长杂乱。
结构化提问:“分三点说明:技术面试前需要准备的编程知识、沟通技巧、公司背景调研。”→回答会按点分类,清晰易读。
告诉AI你的需求,以及你希望完成的目标。
补充要求,告诉AI回答的注意事项,以及限制条件,也可以给出回答示例。
举个简单例子:
无示例提问:“写一份简历。”→生成内容可能格式混乱。
示例提问:“参考以下简历格式,写一份突出数据分析技能的简历:【姓名】【教育背景】学校、专业、时间【工作经验】公司、职位、成果(量化数据)→模型会严格按示例格式生成内容,并强调数据相关成果。
老实说,这些点其实都很简单,甚至有些幼稚。但是!!!网上铺天盖地的提示词课程,已经说明了这个问题虽然简单,还是有很多人不懂。一个简单的例子,前后端同事接口联调的时候,无论哪方出问题了,另一方能否一次性把问题讲明白?如果能,我相信他和AI对话也会做的很好;如果不能,那么他和AI对话估计也会差点意思。
通过占位符{}动态插入变量,生成标准提示词。
适用场景:单一变量替换的简单提示。
输出:
同时处理多个变量,支持复杂逻辑组合。
适用场景:需要多条件控制的提示生成。
输出:
从外部文件读取模板,实现代码与内容分离。
适用场景:需要频繁修改模板的场景。
步骤1:创建story_prompt.txt文件:
步骤2:代码加载模板:
输出:
预先填充部分变量,延迟填充剩余变量。
适用场景:需要分阶段构建提示的流程。
输出:
结合示例数据生成教学式提示。
适用场景:需要示例引导模型输出的场景。
输出:
通过拼接多个模板生成复杂提示。
适用场景:需要模块化构建的大型提示系统。
输出:
变量命名规范:使用snake_case命名变量(如user_name)
错误处理:始终用try/except包裹format()调用
模板版本控制:对模板文件使用Git管理
性能优化:对高频使用的模板进行缓存(如functools.lru_cache)
很明显,这个是针对聊天场景的提示词模板。
使用不同角色的消息模板(系统、用户、助手)构建对话结构。
适用场景:创建包含多角色消息的标准聊天提示。
输出:
使用MessagesPlaceholder插入对话历史上下文。
适用场景:需要维护多轮对话的场景。
输出:
通过示例对话指导模型输出格式。
适用场景:需要示例引导回答风格的场景。
输出:
提前固定部分参数,动态填充剩余参数。
适用场景:需要复用基础配置的场景。
输出:
就这些玩法~
总结下,ChatPromptTemplate的核心优势在于:
支持多角色消息编排
灵活管理对话历史
可组合不同类型模板
内置验证和部分填充功能
在实际应用场景中,我们还可以在如上两种模板基础之上,自定义提示词模板。自定义模板,就可以实现参数校验等等不同的逻辑。
假设我现在有这样一个需求,我希望传入一个函数名,系统能够据此读取出函数的内容,并给出解释。
那么我的代码如下:
最终执行结果如下:
另外,Python里边还提供了两种模板,这个小伙伴们可以自行了解下,有Java基础这个应该很好懂:
jinja2
f-string
通过将提示词分解为策略层→逻辑层→执行层的三层架构,实现复杂任务的模块化控制。其设计原理类似于我们Java的MVC分层模式:
层级
作用
控制颗粒度
修改频率
定义任务目标与边界
宏观

控制推理流程与规则
中观

实现具体操作步骤
微观

解耦与复用
各层独立修改,例如调整执行层细节不会影响策略层
可复用中间层模块(如将逻辑层用于相似任务)
可控性增强
通过分层隔离风险,避免「蝴蝶效应」
每层可单独添加验证机制
可解释性提升
分阶段调试更容易定位问题
生成过程可视化程度高
扩展性优化
新增功能只需扩展对应层级
便于集成外部工具/数据
定义任务目标和整体约束,相当于「需求文档」。
控制分析流程和推理规则,相当于「算法流程图」。
具体操作步骤和格式规范,相当于「代码实现」。
假设使用传统单层提示:
这种提示词存在几个问题:
修改数据来源需要重写整个提示
无法复用趋势分析模块到其他行业
风险条款遗漏时难以定位
格式调整可能破坏内容逻辑
通过三层架构设计,可使复杂提示词的维护成本降低约60%(根据Anthropic2023年工程实践数据),同时生成质量稳定性提升2-3倍。这种设计尤其适合需要长期迭代的AI应用场景。
1.安装依赖:
2.示例YAML文件(prompts/config.yaml):
功能:加载简单文本模板
输出:
功能:加载多角色对话配置
输出:
功能:实现模板的层次化继承
YAML配置(advanced_prompt.yaml):
实现代码:
输出:
当然,利用Python对JSON、TXT等不同格式文件的读取能力,我们一样也可以将提示词管理在这些格式的文件中。
在大语言模型(LLM)应用开发中,当提示词(Prompt)中包含大量示例时,可能会超出模型的上下文窗口限制(如GPT-4的128Ktoken限制)。直接截断示例会导致信息缺失,而固定数量的示例则无法灵活适应不同长度的输入。
LengthBasedExampleSelector的作用是动态调整示例数量:
对于较短的输入,自动包含更多示例以增强模型理解;
对于较长的输入,减少示例数量以避免超出长度限制。
生成中文词语的反义词,根据输入长度动态选择示例数量。
定义示例集:包含多个词语及其反义词的字典列表;
创建模板:格式化每个示例的展示方式;
初始化选择器:设置最大长度阈值;
构建动态提示模板:结合选择器生成最终提示词。
参数
作用
默认值
格式化后提示词的最大字符数(含输入内容)
必填
自定义长度计算逻辑(如按token数计算)
控制单个示例的格式化方式
必填
在自然语言处理任务中,传统相似度检索可能返回高度重复的相似结果。例如在构建反义词提示词模板时,若直接选择前k个最相似示例,可能得到多个同类型词汇(如多个情绪类词汇),而无法覆盖其他语义类别。
MMR算法通过平衡相关性与多样性解决此问题,其核心公式为:
其中sim1衡量与问题的相关性,sim2衡量与已选结果的冗余度,λ参数控制多样性权重(默认0.5)。
示例选择:构建Few-shot提示模板时避免示例同质化
推荐系统:电商商品/内容推荐需兼顾相关性与多样性
文本摘要:提取关键句时避免语义重复
参数
说明
最终返回的示例数量(建议3-5)
预筛选候选集大小(需≥k)
多样性权重(0-1,默认0.5。值越大相关性越重要,值越小多样性越优先)
当查询词为”energetic”时:
传统相似度检索可能返回:
MMR算法检索可能返回:
嵌入模型选择:建议使用text-embedding-3-large等高维模型提升区分度
数据预处理:对示例进行词性标注/分类,辅助评估多样性
计算资源考量:MMR时间复杂度为O(kN),大数据集需配合ANN算法加速
在RAG(检索增强生成)场景中,提示词工程需要根据用户输入动态选择最相关的知识库示例。最大余弦相似度通过计算向量空间中文本的语义相似性,可有效筛选与当前问题最匹配的参考示例,从而提升生成结果的质量。
余弦相似度的核心原理是将文本映射为高维向量(如1536维),通过向量夹角的余弦值衡量语义相似性。当值为1时表示语义完全一致,0表示无关,-1则完全相反。
本案例需要首先安装chromadb依赖:
构建反义词生成系统,根据输入词语动态选择最相关的示例构建提示词模板。
向量化处理:通过OpenAIEmbeddings将示例文本转换为向量。
相似度计算:Chroma向量库自动计算输入query与所有示例的余弦相似度。
动态筛选:k=2参数确保每次选择相似度最高的前2个示例构建上下文。
多模态问答:将问题与知识库QA对进行相似度匹配
文档排序:在检索阶段使用余弦相似度筛选TopN相关文档
个性化推荐:根据用户历史对话选择相似案例生成回复
向量模型选择:不同模型(如text-embedding-3-smallvsada-002)会影响相似度计算精度
阈值设定:可添加相似度阈值过滤低质量匹配(如仅保留>0.8的示例)
计算效率:大规模数据建议采用FAISS等高性能向量库
好啦,提示词就和大伙聊这些。本文中的所有代码案例均可以直接运行。
好啦,今天的内容分享就到这,感觉不错的同学记得分享点赞哦!
PS:程序员好物馆持续分享程序员学习、面试相关干货,不见不散!
点分享
点收藏
点点赞
点在看


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录