AI 大模型提示词:结构化输出、多轮对话与思维链

1. 限定输出格式

1.1 为什么需要结构化输出

在实际开发中,我们经常需要 AI 输出结构化的数据,比如 JSON 格式,这样更方便程序处理。

1.1.1 场景举例
场景 自然语言输出 结构化输出(JSON)
订单系统 “订单123是John Smith买的鞋子” {"order_id": "123", "customer_name": "John Smith"}
信息提取 “用户电话是1234567890” {"phone": "1234567890"}
批量生成 需要手动整理数据 直接得到可用的数据列表

好处

  • 程序可以直接解析,无需复杂的文本处理
  • 数据格式统一,便于存储和传输
  • 可以轻松转换为 DataFrame、数据库记录等

1.2 生成 JSON 格式的订单数据示例

代码示例:

from openai import OpenAI
import json

# 初始化客户端
client = OpenAI()

# 构建提示词,明确要求返回 JSON 格式
prompt = """生成一个由三个虚构的订单信息所组成的列表,以JSON格式进行返回。
JSON列表里的每个元素包含以下信息:
order_id, customer_name, order_item, phone.
所有信息都是字符串。

【重要规则】
1. 只返回纯JSON,不要添加任何其他文字、注释或标记
2. 必须以 [ 开头,以 ] 结尾
3. 不要使用markdown代码块标记(如 ```json)
4. 直接输出JSON内容
"""

# 调用 API
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "user",
            "content": prompt
        }
    ]
)

# 打印 AI 返回的内容
print(content)

# 将 JSON 字符串解析为 Python 对象
json.loads(content)

# 从字典中取出 key 为 "phone" 的值,取列表中的第一个元素
json.loads(content)[0]["phone"]

运行结果:

print返回的内容:
[
  {
    "order_id": "ORD1001",
    "customer_name": "李华",
    "order_item": "智能手表",
    "phone": "13812345678"
  },
  {
    "order_id": "ORD1002",
    "customer_name": "张伟",
    "order_item": "蓝牙耳机",
    "phone": "13987654321"
  },
  {
    "order_id": "ORD1003",
    "customer_name": "王芳",
    "order_item": "电子书阅读器",
    "phone": "13711223344"
  }
]

json.loads(content)返回的内容:
[{'order_id': 'ORD1001',
  'customer_name': '李华',
  'order_item': '智能手表',
  'phone': '13812345678'},
 {'order_id': 'ORD1002',
  'customer_name': '张伟',
  'order_item': '蓝牙耳机',
  'phone': '13987654321'},
 {'order_id': 'ORD1003',
  'customer_name': '王芳',
  'order_item': '电子书阅读器',
  'phone': '13711223344'}]
  
json.loads(content)[0]["phone"]返回的内容:
'13812345678'

image.png

2. 多轮对话与上下文学习

2.1 单轮对话(无上下文)

每次请求都是独立的,AI 不会记住之前的对话。

例如:

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "user",
            "content": "格式化以下信息: \n姓名 -> 张三\n年龄 -> 27\n客户ID -> 001"
        }
    ]
)

print(response.choices[0].message.content)

输出:

姓名: 张三
年龄: 27
客户ID: 001

2.2 多轮对话(带上下文)

通过 messages 数组传递完整的对话历史,AI 可以理解上下文。

代码示例:

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        # 第一轮:用户提问
        {
            "role": "user",
            "content": "格式化以下信息: \n姓名 -> 张三\n年龄 -> 27\n客户ID -> 001"
        },
        # 第一轮:AI 回答(演示了格式)
        {
            "role": "assistant",
            "content": "##客户信息\n - 客户姓名: 张三\n - 客户年龄: 27岁\n - 客户ID: 001"
        },
        # 第二轮:用户提问
        {
            "role": "user",
            "content": "格式化以下信息: \n姓名 -> 李四\n年龄 -> 42\n客户ID -> 002"
        },
        # 第二轮:AI 回答
        {
            "role": "assistant",
            "content": "##客户信息\n - 客户姓名: 李四\n - 客户年龄: 42岁\n - 客户ID: 002"
        },
        # 第三轮:用户提问(没有 AI 回答,需要生成)
        {
            "role": "user",
            "content": "格式化以下信息: \n姓名 -> 王五\n年龄 -> 32\n客户ID -> 003"
        }
    ]
)

print(response.choices[0].message.content)

输出:

'## 客户信息\n- 客户姓名:王五\n- 客户年龄:32岁\n- 客户ID:003'

2.3 核心概念:Messages 数组

messages 是一个列表,包含对话中的所有消息。每条消息都有两个关键属性:

属性 说明 示例
role 角色类型 system、user、assistant
content 消息内容 具体的文本内容
2.3.1 三种角色
messages = [
    {"role": "system", "content": "你是一个专业的格式化助手"},  # 系统设定
    {"role": "user", "content": "格式化以下信息..."},           # 用户消息
    {"role": "assistant", "content": "#客户信息\n - ..."}       # AI 回复
]

角色 作用
system 设定 AI 的行为、性格、专业领域(可选)
user 用户发送的消息
assistant AI 生成的消息(用于提供上下文)

2.4 上下文学习(In-Context Learning)

2.4.1 什么是上下文学习

上下文学习是指:通过提供示例,让 AI 学会你想要的格式和风格,而不需要重新训练模型。

在上面的例子中,我们通过提供两个完整的对话示例(user + assistant),让 AI 学会了格式化客户信息的方式。

AI 看到前两轮对话后,学会了:

  • 输出格式是##客户信息 开头
  • 每行用 - 开头
  • 年龄后面加
  • 字段名是"客户姓名"、“客户年龄”、“客户ID”
2.4.2 最佳实践

messages 数组越长,消耗的 Token 越多,费用越高,所以我们需要合理控制对话历史长度。
示例数量建议:

  • 简单任务:1-2 个示例
  • 复杂格式:2-3 个示例
  • 特殊规则:3-5 个示例

3. 思维链(Chain of Thought)与分步骤思考

在让 AI 解决复杂问题时,直接提问往往得到不够准确的答案。但如果我们引导 AI 一步一步思考,结果会准确得多。

这就是 思维链(Chain of Thought,CoT) 技术——让 AI 展示推理过程,而不是直接给出答案。

3.1 什么是思维链

思维链(Chain of Thought) 是一种提示技术,通过引导 AI 展示中间推理步骤,来提高复杂问题的准确率。

简单来说:让 AI 像人一样,把思考过程写出来,再给出答案。

例如:

方式 提示词 AI 回答
直接回答 “这些奇数加起来是偶数吗?” “答案为否”(可能对,可能错)
思维链 “让我们分步骤思考” 先列出奇数 → 求和 → 判断奇偶 → 给出结论
3.1.1 实例一:标准多轮对话(无详细推理)
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "user",
            "content": "该组中的奇数加起来为偶数:4、8、9、15、12、2、1,对吗?"
        },
        {
            "role": "assistant",
            "content": "所有奇数相加等于25。答案为否。"
        },
        {
            "role": "user",
            "content": "该组中的奇数加起来为偶数:17、10、19、4、8、12、24,对吗?"
        },
        {
            "role": "assistant",
            "content": "所有奇数相加等于36。答案为是。"
        },
        {
            "role": "user",
            "content": "该组中的奇数加起来为偶数:15、12、5、3、72、17、1,对吗?"
        }
    ]
)

print(response.choices[0].message.content)

输出:

所有奇数相加等于53。答案为否。

分析:

  • ✅ AI 给出了正确结论
  • ⚠️ 但没有展示计算过程
  • ⚠️ 如果计算错误,我们无法知道错在哪
3.1.2 实例二:增加详细推理(展示计算过程)
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "user",
            "content": "该组中的奇数加起来为偶数:4、8、9、15、12、2、1,对吗?"
        },
        {
            "role": "assistant",
            "content": "所有奇数(9、15、1)相加,9 + 15 + 1 = 25。答案为否。"
        },
        {
            "role": "user",
            "content": "该组中的奇数加起来为偶数:17、10、19、4、8、12、24,对吗?"
        },
        {
            "role": "assistant",
            "content": "所有奇数(17、19)相加,17 + 19 = 36。答案为是。"
        },
        {
            "role": "user",
            "content": "该组中的奇数加起来为偶数:15、12、5、3、72、17、1,对吗?"
        }
    ]
)

print(response.choices[0].message.content)

输出:

所有奇数(15、5、3、17、1)相加,15 + 5 + 3 + 17 + 1 = 41。答案为否。

分析:

  • ✅ 明确列出了哪些是奇数
  • ✅ 展示了完整的求和过程
  • ✅ 结论有据可查
3.1.3 实例三:主动引导分步骤思考
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "user",
            "content": "该组中的奇数加起来为偶数:15、12、5、3、72、17、1,对吗?让我们来分步骤思考。"
        }
    ]
)

print(response.choices[0].message.content)

输出:

是的,让我们来分步骤思考这个问题。

首先,我们将奇数从该组中提取出来,这些数字是:15、5、3、17、1。

然后,我们将这些奇数相加:15 + 5 + 3 + 17 + 1 = 41。

最后,我们检查41这个结果是否为偶数。因为41是奇数,所以该组中的奇数加起来不为偶数。

所以,该组中的奇数加起来不为偶数。

分析:

  • ✅ 主动分步骤思考
  • ✅ 步骤清晰:提取 → 求和 → 判断 → 结论
  • ✅ 即使没有示例,也能正确推理
3.1.4 三种方式对比
方式 优点 缺点
方式一:直接答案 简洁 缺乏可解释性,出错难排查
方式二:带推理的示例 有过程,可学习格式 需要提供示例
方式三:引导分步骤思考 主动推理,通用性强 需要合适的提示词

3.2 思维链的核心技巧

3.2.1 关键提示词

在提示词中加入以下短语,可以激活思维链:

中文提示	英文提示
"让我们分步骤思考"	"Let's think step by step"
"请一步步推理"	"Please reason step by step"
"首先...然后...最后..."	"First... then... finally..."
"请展示你的思考过程"	"Show your reasoning process"
3.2.2 结构化提示模板

3.3 思维链的应用场景

3.3.1 数学计算
python
prompt = """
计算:123 × 456 = ?让我们分步骤思考。
"""
# AI 会展示:
# 步骤1:123 × 400 = 49200
# 步骤2:123 × 50 = 6150
# 步骤3:123 × 6 = 738
# 步骤4:49200 + 6150 + 738 = 56088
3.3.2 逻辑推理
prompt = """
如果所有的A都是B,所有的B都是C,那么所有的A都是C吗?让我们分步骤推理。
"""
# AI 会展示逻辑链条
3.3.3 代码调试
prompt = """
以下代码报错了,请分步骤分析原因:

def calculate(x):
    return x + 1

print(calculate("10"))

让我们一步步分析:
1. 函数期望什么类型的参数?
2. 实际传入的是什么类型?
3. 错误发生在哪里?
4. 如何修复?
"""
3.3.4 复杂决策
prompt = """
我应该买燃油车还是电动车?请分步骤帮我分析:
1. 列出两种车的优缺点
2. 对比使用成本
3. 考虑我的用车场景(每天通勤50公里)
4. 给出建议
"""

3.4 思维链的工作原理

3.4.1 为什么有效?

原因 说明
分解复杂问题 将大问题拆解为小步骤,降低难度
减少幻觉 每一步都有依据,减少凭空捏造
可验证性 可以检查每一步是否正确
错误定位 出错了可以知道在哪一步

3.4.2 可视化流程
传统方式:
用户提问 → AI 直接生成答案 → 结果(可能对可能错)

思维链方式:
用户提问 → AI 分步骤推理 → 展示中间结果 → 生成答案 → 结果(准确率更高)

3.5 最佳实践建议

3.5.1 何时使用思维链
适用场景 不适用场景
数学计算 简单事实问答
逻辑推理 日常闲聊
代码调试 快速确认
复杂决策 单一信息查询
3.5.2 提示词设计技巧
# ❌ 不好的提示
"这个对吗?"

# ✅ 好的提示
"这个对吗?让我们一步步推理:
1. 列出所有奇数
2. 计算总和
3. 判断奇偶性
4. 得出结论"
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐