007.用 LangChain 构建 Few-Shot 对话示范

该教程旨在带大家从 0 起步,掌握用 Python 开发大模型应用的技能。若当前内容让你感到晦涩,可回溯本合集的前期文章,降低学习难度。


1. 小样本提示(Few-Shot Prompting)回顾

传统做法 模板化做法
手动拼 N 条示例 + 1 条用户提问 模板+变量,示例与用户提问一次生成
复制粘贴易出错、难维护 改一个列表即可增删示例
示例格式固定,仅值不同 用同一模板重复渲染

2. 核心类:FewShotChatMessagePromptTemplate

位置:langchain.prompts.few_shot.FewShotChatMessagePromptTemplate

作用:把示例对话转成消息列表,并可与最终用户提问无缝拼接。

构造参数

• example_prompt:单条示例的模板(ChatPromptTemplate)

• examples:示例数据,列表套字典


3. 动手实战:年龄格式化机器人

3.1 安装 & 环境

shell 复制代码
pip install langchain langchain-deepseek
export DEEPSEEK_API_KEY=sk-xxxxxxxx

3.2 定义单条示例模板

python 复制代码
from langchain.prompts import ChatPromptTemplate

# 一条示例 = 用户问 + AI 答
example_prompt = ChatPromptTemplate.from_messages([
    ("human", "我叫{name},今年{age}岁,来自{city}。"),
    ("ai", "{name},{age}岁,{city}市{province}人")
])

3.3 准备若干示例数据

python 复制代码
examples = [
    {"name": "张三", "age": 23, "city": "合肥", "province": "安徽"},
    {"name": "李四", "age": 31, "city": "深圳", "province": "广东"},
    {"name": "王五", "age": 19, "city": "成都", "province": "四川"},
]

3.4 创建 Few-Shot 模板

python 复制代码
from langchain.prompts import FewShotChatMessagePromptTemplate

few_shot_tmpl = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples
)

3.5 加入最终用户提问

python 复制代码
final_prompt = ChatPromptTemplate.from_messages([
    few_shot_tmpl,                       # 3 条示例
    ("human", "{input}")                # 真正的用户提问
])

4. 渲染并调用 DeepSeek

python 复制代码
from langchain_deepseek import ChatDeepSeek

llm = ChatDeepSeek(model="deepseek-chat", temperature=0)

prompt_value = final_prompt.invoke({
    "input": "我叫赵六,今年27岁,来自杭州"
})

messages = prompt_value.messages
print(messages)

response = llm.invoke(messages)
print(response.content)

5. 动态增删示例

只需改 examples 列表即可:

python 复制代码
examples.append(
    {"name": "孙七", "age": 42, "city": "武汉", "province": "湖北"}
)

无需改动模板代码。


6. 完整代码

python 复制代码
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import FewShotChatMessagePromptTemplate
from langchain_deepseek import ChatDeepSeek

# 一条示例 = 用户问 + AI 答
example_prompt = ChatPromptTemplate.from_messages([
    ("human", "我叫{name},今年{age}岁,来自{city}。"),
    ("ai", "{name},{age}岁,{city}市{province}人"),
])

# 准备示例数据
examples = [
    {"name": "张三", "age": 23, "city": "合肥", "province": "安徽"},
    {"name": "李四", "age": 31, "city": "深圳", "province": "广东"},
    {"name": "王五", "age": 19, "city": "成都", "province": "四川"},
]

# Few Shot 模版
few_shot_tmpl = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples
)

# 最终提示词
final_prompt = ChatPromptTemplate.from_messages([
    few_shot_tmpl,
    ("human", "{input}")
])

# 调用deepseek
llm = ChatDeepSeek(model="deepseek-chat", temperature=0)

prompt_value = final_prompt.invoke({
    "input": "我叫赵六,今年27岁,来自杭州"
})

# 消息列表
messages = prompt_value.messages
print(messages)

response = llm.invoke(messages)
print(response.content)

7. 常见坑 & 小贴士

  1. 变量名必须一致:模板里的 {}examples 字典键一一对应。
  2. 顺序即对话:示例按列表顺序渲染,确保 humanai 交替出现。
  3. token 开销:示例越多,消耗越长;可在 examples 里做截断或选样。
  4. 调试技巧:先打印 prompt_value.messages,确认格式正确再发模型。

8. 速查表

步骤 关键代码
单条示例模板 ChatPromptTemplate.from_messages([...])
组合示例 FewShotChatMessagePromptTemplate(...)
拼接用户提问 ChatPromptTemplate.from_messages([few_shot_tmpl, ("human", "{input}")])
渲染 prompt = chat_tmpl.invoke({"input": "..."})
发模型 ChatDeepSeek().invoke(prompt.messages)
相关推荐
墨香幽梦客21 分钟前
API集成技术规范:RESTful与GraphQL在企业系统对接中的应用对比
后端·restful·graphql
刀法如飞1 小时前
AI编程时代,为什么35岁以上程序员会更吃香?
人工智能·后端·ai编程
小码哥_常2 小时前
Spring Boot 遇上 HMAC-SHA256,API 安全大升级!
后端
小码哥_常2 小时前
10分钟极速掌握!SpringBoot+Vue3整合SSE实现实时消息推送
后端
大黄说说3 小时前
深入 Go 语言 GMP 调度模型:高并发的秘密武器
后端
云原生指北4 小时前
Omnipub E2E 测试文章 - 自动化验证
后端
IT_陈寒4 小时前
SpringBoot自动配置揭秘:5个让开发效率翻倍的隐藏技巧
前端·人工智能·后端
添尹4 小时前
Go语言基础之数组
后端·golang
luom01026 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
黄俊懿6 小时前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计