一、前言:什么是prompt工程

提示词工程(Prompt Engineering),也称为In-Context Prompting,是指在不更新模型权重的情况下,通过设计、优化输入文本,引导大模型精准输出符合预期的结果,充分挖掘模型能力,属于人和大模型交互的核心技术

核心目标:可控、准确、格式统一、减少幻觉

在人工智能领域,Prompt指的是用户给大型语言模型发出的指令

·例如,“[讲个笑话]”、“[用Python编个贪吃蛇游戏]”、“[写封情书]”等

·虽然看似简单,但实际上,Prompt的设计对于模型的结果影响很大,因此如何设计prompt,进而与模型更好的交互,是研究人员必备的必不可少的技能(提示词工程)

二、JSON数据格式

在讲解prompt工程之前,先补充一下JSON数据格式的知识,在prompt工程中,JSON极为重要,能够约束大模型输出格式→让AI返回的数据能直接被代码自动解析,实现程序与大模型无缝对接,是开发AI后端、RAG系统必不可少的手段。

1.两大基础结构

-JSON对象

{

"key": value,

"key": value

}

key必须是字符串,value可以是数字、字符串、列表、JSON对象或JSON数组

-JSON数组

[{}, {}, {}, ...] 有序值列表

-JSON对象→Python字典,JSON数组→Python列表内含多个字典

2.Python中使用JSON

Python中使用JSON主要完成:

·将Python字典、列表转换为JSON字符串

·读取JSON字符串,转换为Python字典或列表

主要使用Python内置的json库

·json.dumps(字典或列表,ensure_ascii=False):将字典或列表转换为JSON字符串

·ensure_ascii参数确保中文能正常显示

·返回值:JSON字符串

·json.loads(JSON字符串):将JSON字符串转换为Python字典或列表

·返回值:Python字典或Python列表

三、基础万能Prompt框架(CRISPE)

1.角色(Capacity):赋予模型身份

| 你是一名资深Java后端工程师

2.背景(Role):交代场景上下文

| 现在需要给学生讲解计算机网络四次挥手

3.指令(Instruction):明确任务

| 使用生活化比喻,通俗易懂总结知识点

4.输出格式(Output):规定返回样式

| 使用分点结构,禁止长篇大段文字

5.约束(Experiment):划定边界、禁忌

| 不使用复杂公式,例子贴合学生学习场景

四、主流Prompt基础技巧

1.零样本提示Zero-shot

基于模型训练阶段学习的属性/语义关联,去迁移到未知的新类别,无提示,语言描述任务,依赖模型预训练知识回答

2.少样本提示Few-shot(最常用)

基于少量样本,快速泛化识别新样本,给与模型少量示例,引导模型对齐示例输出结果

LangChain框架内置的少样本提示模板(FewShotPromptTemplate)

·example_prompt:示例数据的提示词模板

·examples:示例数据,list,内套字典

·prefix:组装提示词,示例数据前内容

·suffix:组装提示词,示例数据后内容

·input_variables:列表,注入的变量列表

3.思维链Chain

LangChain中链是一种将各个组件串联在一起,按顺序执行,前一个组件的输出作为下一个组件的输入

·可以通过 “|” 符号来让各个组件形成链

·成链的各个组件,需是Runnable接口的子类

·形成的链是RunnableSerializable对象(Runnable接口子类)

·可通过链调用invoke或stream触发整个链条的执行

五、PrompTemplate

提示词优化在模型应用中非常重要,LangChain提供了PromptTemplate类,用来协助优化提示词。

PromptTemplate表示提示词模板,可以构建一个自定义的基础提示词模板,支持变量的注入,最终生成所需的提示词。

# 调用.format方法注入信息即可
# prompt_text = prompt_template.format()
#
# model=    
# res = model.invoke(input=prompt_text)
# print(res)

六、ChatPromptTemplate

ChatPromptTemplate:支持注入任意数量的历史会话信息

·通过from_messages方法,从列表中获取多轮次会话作为聊天的基础模板

·ps:前面PromptTemplate类用的from_template仅能接入一条消息,而from_messages可以接入一个list的消息

历史会话信息并不是静态的(固定的),而是随着对话的进行不停地积攒,即动态的。

所以,历史会话信息需要支持动态注入。

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import MessagesPlaceholder
chat_template = ChatPromptTemplate.from_messages(
[
("system", "......")
("ai", "......")
MessagesPlaceholder("history")
("human", "......")
]
)
history_data = [
("human", "......")
("ai", "......")
("human", "......")
("ai", "......")
]
prompt_value = chat_template.invoke({"history": history_data})

-MessagesPlaceholder作为占位

-提供history作为占位的key

-基于invoke动态注入历史会话记录(必须是invoke,format无法注入)

七、模板类的format和invoke方法

区别 format invoke
功能 纯字符串替换,解析占位符生成提示词 Runnable接口标准方法,解析占位符生成提示词
返回值 字符串 PromptValue类对象
传参 .format(k=v, k=v, ...) .invoke({"k":v, "k":v, ...})
解析 支持解析{}占位符 支持解析{}占位符和MessagesPlaceholder结构化占位符

八、总结

本文系统性地介绍了提示词工程(Prompt Engineering)的核心知识体系,为开发者提供了从基础到实践的完整指引。主要内容总结如下:

1. 提示词工程核心价值

提示词工程是在不更新模型权重的前提下,通过精心设计输入文本来引导大模型精准输出的关键技术。其核心目标包括:

  • 可控性:确保模型输出符合预期方向
  • 准确性:减少错误信息和幻觉
  • 格式统一:便于程序自动化处理
  • 效率提升:最大化挖掘模型潜力

2. JSON数据格式的关键作用

JSON作为约束模型输出的重要工具,能够:

  • 强制模型返回结构化数据,便于代码解析
  • 实现程序与大模型的无缝对接
  • 在AI后端和RAG系统中发挥核心作用
  • 通过Python的json库轻松实现转换与处理

3. CRISPE万能Prompt框架

CRISPE框架提供了系统化的提示词设计方法论:

  • 角色(Capacity):赋予模型特定身份
  • 背景(Role):交代任务场景上下文
  • 指令(Instruction):明确具体任务要求
  • 输出格式(Output):规定返回样式结构
  • 约束(Experiment):划定边界和禁忌

4. 主流Prompt技巧

  • 零样本提示(Zero-shot):依赖模型预训练知识,无示例直接描述任务
  • 少样本提示(Few-shot):提供少量示例引导模型对齐输出,最常用
  • 思维链(Chain):将多个组件串联执行,前序输出作为后续输入

5. LangChain模板工具

  • PromptTemplate:基础提示词模板,支持变量注入
  • ChatPromptTemplate:支持动态注入多轮历史会话信息
  • FewShotPromptTemplate:内置少样本提示模板
  • format与invoke方法:format用于纯字符串替换,invoke支持结构化占位符解析

6. 实践建议

在实际应用中,建议:

  1. 从CRISPE框架开始,系统化设计提示词
  2. 优先使用JSON格式约束输出,便于程序集成
  3. 根据任务复杂度选择零样本或少样本提示
  4. 利用LangChain模板工具提升开发效率
  5. 通过思维链将复杂任务分解为多个步骤

掌握这些提示词工程技术,能够显著提升与大模型的交互效果,为开发高质量的AI应用和RAG系统奠定坚实基础。随着大模型技术的不断发展,提示词工程将继续在AI应用开发中扮演越来越重要的角色。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐