LangChain:提示词模板与少样本提示功能

目录

[一、 提示词模板](#一、 提示词模板)

[1.1 概念](#1.1 概念)

[1.2 用法](#1.2 用法)

[1.2.1 字符串模板](#1.2.1 字符串模板)

[1.2.2 聊天消息模板](#1.2.2 聊天消息模板)

[1.2.3 消息占位符](#1.2.3 消息占位符)

[1.3 使用 LangChain Hub 的提示词模板](#1.3 使用 LangChain Hub 的提示词模板)

[二、 少样本提示](#二、 少样本提示)

[2.1 概念](#2.1 概念)

[2.2 实现少样本提示](#2.2 实现少样本提示)

[2.3 使用案例](#2.3 使用案例)

[2.3.1 推理引导](#2.3.1 推理引导)


一、 提示词模板

1.1 概念

提示词模板是 LangChain 的核心抽象之一,它被广泛应用于构建大语言模型应用的各个环节。

简单来说,只要是需要动态、批量、或有结构地向大语言模型【发送请求】的地方,几乎都会用到提示词模板。

一个简单的例子,假设我们想根据一个城市名询问 LLM 其历史,按照之前的做法,我们可以定义HumanMessage("请介绍上海的历史")HumanMessage("请介绍西安的历史")消息等等。可以发现每次询问都会描写重复的消息内容:请介绍xxx的历史

在 LangChain 中,针对这种情况,可以定义一个模板:

  • 固定文本(模板): "请介绍{city}的历史。"
  • 输入变量: ["city"]

定义好后,可以使用该模板:

  • 当我们需要查询北京时,就将 city 变量赋值为 "北京"。模板引擎会生成: "请介绍北京的历史。"
  • 当我们需要查询上海时,就将 city 变量赋值为 "上海"。模板引擎会生成: "请介绍上海的历史。"

由此可得:提示词模板就是一个可复用的提示词蓝图,它允许我们动态地生成提示词,而不是每次都手动编写完整的提示词。它类似于编程中的字符串格式化功能。你创建一个带有 "占位符" 的模板,然后在运行时,用具体的值(变量)填充这些占位符,从而生成一个最终发送给 LLM 的完整提示词。

提示词模板解决了以下几个核心问题:

  1. 可复用性:只需定义一个模板,就可以用于无数个类似的查询。
  2. 关注点分离:将提示词的结构和逻辑与具体的内容和数据分离开。提示工程师可以专注于优化模板,而应用程序则负责提供变量值。
  3. 一致性:确保发送给 LLM 的提示词结构统一,这有助于获得更稳定、可预测的输出结果。
  4. 可维护性:如果需要修改提示词的风格或结构,只需修改一个模板文件,而不用在代码的无数个地方进行修改。

1.2 用法

1.2.1 字符串模板

LangChain 提供了 PromptTemplate 类来轻松实现这一功能。PromptTemplate 实现了标准的 Runnable 接口。示例如下:

python 复制代码
from langchain_core.prompts import PromptTemplate

#创建一个提示词模板,language1与language2为占位符
prompt_template=PromptTemplate.from_template("请将{language1}翻译为{language2}")

#invoke的时候显式地给两个占位符传递参数实例化出提示词
print(prompt_template.invoke({"language1": "英文", "language2": "中文"}))

说明: class langchain_core.prompts.prompt.PromptTemplate 类,其参数如下:

  • template:提示模板
  • input_variables:需要其值作为提示输入的变量的名称列表。

内置方法: from_template():从模板定义提示模板。方法返回了一个 PromptTemplate 实例

因此除了上面示例中 PromptTemplate.from_template 定义提示模板的方式外,下面这种方法也可以直接初始化模板:

python 复制代码
#template指定提示词,input_variables指定提示词中地占位符后续invoke需要传递参数
prompt_template=PromptTemplate(
    template="请将{language1}翻译为{language2}",
    input_variables=["language1", "language2"]
)

#invoke的时候显式地给两个占位符传递参数实例化出提示词
print(prompt_template.invoke({"language1": "英文", "language2": "中文"}))

1.2.2 聊天消息模板

ChatPromptTemplate 模板:专为 LangChain 聊天模型设计。可以方便地构建包含 SystemMessageHumanMessageAIMessage 的消息模板。如下代码所示:

python 复制代码
from langchain_core.prompts import PromptTemplate,ChatPromptTemplate
from langchain_deepseek import ChatDeepSeek

#定义消息模板
chat_template=ChatPromptTemplate(
    [
        ("system","将用户输入的语言翻译为{language2}"),
        ("user","{text}")
    ]
)

#显式地传入参数,实例化出消息列表
messages=chat_template.invoke({"language2": "中文", "text": "how are you?"})

#将消息列表传递给对应的大模型
model=ChatDeepSeek(model="deepseek-chat")

print(messages)
print("\n")
print(model.invoke(messages).content)

实例化后的消息列表:

python 复制代码
messages=[SystemMessage(content='将用户输入的语言翻译为中文', additional_kwargs={}, response_metadata={}), HumanMessage(content='how are you?', additional_kwargs={}, response_metadata={})]

运行结果:

由于ChatPromptTemplate 同样也实现了标准的 Runnable 接口,因此我们还可以通过链来完成上述调用达到一样的效果。如下所示:

python 复制代码
chat_template=ChatPromptTemplate(
    [
        ("system","你只是一个翻译器作用是将用户输入的语句翻译为{language2}"),
        ("user","{text}")
    ]
)

model=ChatDeepSeek(model="deepseek-chat")

chain=chat_template | model

print(chain.invoke({"language2": "中文", "text": "what are you doing?"}).content)

运行结果:

1.2.3 消息占位符

在上面的 ChatPromptTemplate 中,我们看到了如何格式化两条消息,每条消息都是一个字符串。但如果我们希望将消息插入特定位置怎么办?使用MessagesPlaceholder

MessagesPlaceholder 负责在特定位置添加消息列表。代码如下:

python 复制代码
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder
from langchain_deepseek import ChatDeepSeek

chat_template=ChatPromptTemplate(
    [
        "system","你是一个人工智能助手",
        MessagesPlaceholder("holder")
    ]
)

messages=[
    HumanMessage("我叫王小明"),
    AIMessage("你好"),
    HumanMessage("你知道我国的首都在哪里吗?")
]

model=ChatDeepSeek(model="deepseek-chat")

chain=chat_template | model

print(chain.invoke({"holder":messages}).content)

1.3 使用 LangChain Hub 的提示词模板

LangChain Hub 是一个用于上传、浏览、拉取和管理提示词 (prompts) 的地方。

随着 LLM 的发展,提示变得越来越重要。LangChain 正在打造一个与像 GitHub 这样的传统平台,GitHub 长期以来一直是共享和协作代码的首选平台。于是推出了 LangChain Hub 平台。

LangChain Hub 创建一个分享和发现 Prompt 的平台,使得开发者可以更容易地发现新用例和精炼提示。这一举措使提示工程师更容易合作,重复使用现有的提示,并对其进行微调以实现特定的结果,从而加速对话代理和其他基于语言的应用程序的开发和部署。早期的时候 LangChain Hub 有 Prompt、Chain、Agent,现在只有 Prompt。

LangChain Hub 官网地址:LangSmith。通过登录到 Hub 来探索所有现有提示。

目前收藏最高的提示词模板是:hardkothari/prompt‑maker 。我们就以它为示例,演示一下如何使用 LangChain Hub 上的提示。

Prompt Maker 模板是一个【提示生成器】,它可以自动化优化提示的过程,从而提高语言模型在各种应用中的质量和效果。

在这里可以看到他的使用效果和调用方式:

要想使用该能力,需要先申请并配置 LangSmith 环境变量:LANGSMITH_API_KEY="你的 LangSmith API Key"。接着,需要从 hub 拉取相应的提示,并使用,代码如下:

python 复制代码
# Create a LangSmith API in Settings > API Keys
# Make sure API key env var is set:
# import os; os.environ["LANGSMITH_API_KEY"] = "<your-api-key>"
from langchain_deepseek import ChatDeepSeek
from langsmith import Client

client = Client()
prompt = client.pull_prompt("hardkothari/prompt-maker",dangerously_pull_public_prompt=True)


model=ChatDeepSeek(model="deepseek-chat")

chain= prompt | model

while True:
    mytask=input("你要执行的任务是什么?(按quit退出)")
    if(mytask=="quit"):
        break
    prompt=input("当前你的提示词是什么?(按quit退出)")
    if(prompt=="quit"):
        break
    realprompt=chain.invoke({"lazy_prompt": prompt, "task": mytask})
    print(realprompt.content)

运行结果:也就是优化后的提示词

XML 复制代码
你要执行的任务是什么?(按quit退出)用中文介绍一个地区
当前你的提示词是什么?(按quit退出)从政治经济文化三个方面介绍一下北京
作为一名资深城市研究专家,请从政治、经济、文化三个维度,系统性地介绍中国的首都------北京。

**要求:**

- 内容需详实、专业、有深度,并兼具可读性
- 每个维度需涵盖历史背景、现状特征、代表性案例(如机构、产业、文化活动)
- 结构清晰,建议以分段或加粗标题区分三个维度
- 篇幅控制在800-1200字,语言正式但不晦涩,可以融入少量生动的城市印象
- 结尾可补充一个简要片段,总结北京作为首都的综合定位与未来发展趋势

**补充引导(可选):**
- 政治:强调其作为国家政治中心、国际交往中心的功能,可提及中南海、人民大会堂、外国驻华使馆区等
- 经济:说明其从传统工业向现代服务业、科技创新转型,可提及中关村、金融街、CBD、总部经济及"高精尖"产业
- 文化:突出其历史遗产(故宫、胡同、中轴线)与现代文化(798艺术区、国家大剧院、高校聚集、文化创意产业)

**示例开头:**
"北京,作为中国的政治心脏、经济枢纽与文化圣地,承载着三千年的建城史与八百余年的建都史......"

如果需要获得最终的业务处理结果需要再调用一次model,并把优化后的提示词传递给model:

python 复制代码
realprompt_text=realprompt.content
print(model.invoke([HumanMessage(content=realprompt_text)]).content)

最终业务结果:

XML 复制代码
**北京:作为首都的三重维度**

北京,作为中国的政治心脏、经济枢纽与文化圣地,承载着三千年的建城史与八百余年的建都史。它不仅是地理意义上的国都,更是国家意志的集中表达、经济转型的先锋试验场与文明传承的活态博物馆。若以城市研究者的视角剖析,北京的魅力与复杂性,正深藏于政治、经济、文化三重维度的交织与张力之中。

### 一、政治维度:国家意志的具象化

**历史背景**:自元代起,北京便以"大都"之名成为全国权力的中心。明成祖迁都后,紫禁城的红墙黄瓦确立了"天子守国门"的政治象征。1949年开国大典的礼炮声,则让北京完成了从封建帝都向社会主义首都的质变。

**现状特征**:今日北京的核心功能定位是"四个中心"------政治中心、文化中心、国际交往中心、科技创新中心。其中,政治是灵魂。中南海象征着国家决策中枢,人民大会堂则承载着人民代表大会制度的庄严运作。沿长安街向西,中共中央、国务院、全国人大等核心机关密集分布,形成了"权力走廊"。更独特的景观是建国门外与三里屯的使馆区,160余座外国驻华使馆与众多国际组织驻地,使北京成为全球外交网络的重要节点。每年全国两会期间,数千名代表委员汇聚于此,这里是国家治理体系的物理坐标。

**代表性案例**:中南海的"海"与"台"不仅是地名,更是中国政治决策的隐喻;北京城市副中心(通州)的启用,则标志着首都功能疏解与国家治理现代化的新探索。此外,北京奥运会、APEC峰会、"一带一路"国际合作高峰论坛等主场外交活动,持续强化着其"国际会客厅"的角色。

### 二、经济维度:从工业重镇到创新策源

**历史背景**:计划经济时代,北京是北方重要的工业基地,首钢的钢花与燕山石化的塔罐曾是城市经济的支柱。然而,重工业带来的污染与城市病,迫使北京在21世纪初踏上痛苦的转型之路。

**现状特征**:今天的北京经济图谱由"高精尖"主导。2023年全市GDP超4.3万亿元,第三产业占比高达80%以上。金融街聚集了中国人民银行及众多全国性金融总部,管理着全国近一半的金融资产;CBD(国贸---大望路)是跨国公司地区总部与国际律师事务所、咨询机构扎堆的"世界办公室";而中关村,这个从"电子一条街"演变而来的科技创新特区,已成为中国硅谷的代名词------字节跳动、百度、小米等科技巨头在此孵化成长。与此同时,北京还承担着建设国家服务业扩大开放综合示范区的重要使命。

**代表性案例**:中关村软件园的信息技术产业集群,与怀柔科学城、未来科学城共同构成"三城一区"的科创布局。2024年,北京研发投入强度(R&D经费占GDP比重)超6%,居全球前列。值得注意的是,北京正主动引导制造业外迁(如首钢搬迁至曹妃甸),腾退空间置换出高端生产性服务业与数字经济,展现了后工业城市的理想路径。

### 三、文化维度:古都文脉与当代创造

**历史背景**:北京拥有七处世界文化遗产(故宫、天坛、颐和园、长城、十三陵、大运河、中轴线),是联合国教科文组织认定的"博物馆之都"。胡同与四合院构成了"棋盘式"的市民文化肌理。

**现状特征**:文化北京呈现出"双轴共生"的局面。传统轴线上,中轴线申遗成功(2024年)将永定门至钟鼓楼的7.8公里串联为"露天历史博物馆";故宫年接待游客超1900万,但"数字故宫"正以VR技术拓展着体验边界。现代轴线上,798艺术区从废弃电子工厂蜕变为当代艺术地标,国家大剧院的椭圆穹顶下奏响中西交融的乐章。此外,北京汇聚了北大、清华等90余所高校,在校生超百万,形成全球罕见的"智力资本高地",由此衍生出活跃的文化创意产业------从京味话剧到科幻电影,从数字新媒体到文创IP开发,年产值已突破万亿元。

**代表性案例**:南锣鼓巷的改造平衡了商业活力与历史肌理;首钢园在冬奥会的契机下,以高炉为背景的滑雪大跳台成为"工业遗产活化"的全球典范。

### 结语:首善之区的未来想象

北京的三重维度并非割裂,而是互相赋能:政治地位吸引总部经济与智库资源,文化底蕴为科技创新提供审美与精神土壤,经济繁荣反哺文化遗产保护。展望未来,北京将紧扣"减量提质"主线,推动城市副中心与雄安新区形成"两翼齐飞",同时建设全球数字经济标杆城市。这座千年古都,正以"都"的定力与"城"的活力,在历史与未来之间书写着独特的首都样本。它不再仅仅是地图上的一个点,而是中国式现代化的时空投射------庄严而鲜活,厚重而轻盈。

二、 少样本提示

2.1 概念

少样本提示是一种通过向 LLM 提供少量具体示例或样本,来教会它如何执行某项特定任务的技术。提高模型性能的最有效方法之一是给出一个【模型示例】指导大模型你想做什么、怎么做。下面用一个例子解释少样本提示的作用。

  • 参考之前学习的内容,我们可以将其想象为 "零样本提示":直接给模型一道考题,不给任何例子。模型会凭借已有的知识直接回答。例如我们输入"3 🦜 9是多少?"
    ,答案可能是:

从这里可以看出大模型并不知道🦜代表什么运算所以只能靠自己猜测并给出它所猜测的运算符号运算后的结果。但是这个结果可能并不符合我们的预期。

少样本提示则是在给出考题前,先给它看几道类似的、附有正确答案的例题。添加示例输入和预期输出的技术给到模型提示,让模型通过例题来理解任务应该怎么做。

例如以下样例,模型通过样例后可以发现🦜与➕含义相似,便可以按照此规则得出3 🦜 9是多少?的结果是12:

python 复制代码
examples = [
    {"input": "2 🦜 2", "output": "4"},
    {"input": "2 🦜 3", "output": "5"},
]

这能解决什么问题?LLM 虽然知识渊博,但有时我们需要它以非常特定的格式、风格或逻辑来回答问题。提供正确的示例可以减少模型 "胡说八道" 或犯低级错误的概率,将其输出约束在你提供的范例范围内。举个例子更能理解:

  1. 强制要求模型以特定的格式 (如 JSON、XML、特定的列表样式) 输出结果。样例可以当作格式样板。
  2. 有些任务很难用文字指令清晰描述 (例如:"请用莎士比亚的风格写作")。提供几个例子比写长篇大论的指令更有效。
  3. 对于需要多步推理的复杂任务,示例可以展示出思考链,引导模型遵循类似的推理路径。

2.2 实现少样本提示

实现少样本提示的第一步也是最重要的一步是提出一个好的示例数据集。好的示例应该在运行时相关、清晰、信息丰富,并提供模型尚不知道的信息。

python 复制代码
examples=[
    {"input":"1 🦜 2是多少?","output":"1 🦜 2的运算结果为3"},
    {"input":"4 🦜 5是多少?","output":"4 🦜 5的运算结果为9"},
]

如何让大模型看懂这份示例呢?

之前我们说过聊天模型读的是聊天消息。因此,接下来我们需要将示例集实例化成聊天模型可以读懂的聊天消息。对于 LangChain 就需要创建一个FewShotChatMessagePromptTemplate对象来实例化示例集,用法如下所示:

python 复制代码
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder, FewShotPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_deepseek import ChatDeepSeek

chat_prompt_template = ChatPromptTemplate(
    [
        ("user","{input}"),
        ("ai","{output}")
    ]
)

examples=[
    {"input":"1 🦜 2是多少?","output":"1 🦜 2的运算结果为3"},
    {"input":"4 🦜 5是多少?","output":"4 🦜 5的运算结果为9"},
]

few_shot_chat_mess=FewShotChatMessagePromptTemplate(
    example_prompt=chat_prompt_template,
    examples=examples,
)

realmess=few_shot_chat_mess.invoke({}).to_messages()

realmess.extend([
    HumanMessage("3 🦜 9是多少?")
])

model=ChatDeepSeek(model="deepseek-chat")

print(model.invoke(realmess).content)

在这段代码中我们首先使用ChatPromptTemplate构建了一个聊天消息模板,然后构建了一个实例集examples。然后我们使用FewShotChatMessagePromptTemplate将聊天消息模板与实例集关联起来实例化出一个消息列表realmess。然后将用户自己的HumanMessage添加到realmess中并传递给大模型,此时大模型就可以根据前面的示例判断出来 🦜 所代表的运算符号,并计算出结果:

这里需要注意的是FewShotChatMessagePromptTemplate类的使用方式与接口:

类初始化参数说明:

  • examples:样本示例。
  • example_prompt:ChatPromptTemplate,用于格式化单个示例

类方法说明:

  • .invoke() 方法:此方法与其他 Runnable 实例的 .invoke() 方法类似。输入一个字典给它,返回完整的提示内容PromptValue
    • PromptValueto_string() 方法可以将提示值作为【字符串】返回。
    • PromptValueto_messages() 方法可以将提示作为【消息列表】返回。

最后,得到示例集消息列表后,就可以带上一起发起请求。

2.3 使用案例

2.3.1 推理引导

我们希望输入: 《教父》和《星球大战》的导演来自同一个国家吗?

让聊天模型可以先分析再得出结论,而不是直接得出结论。分析过程需要展示出来,示例如下:

python 复制代码
examples = [
    {
        "question": "李白和杜甫,谁更长寿?",
        "answer": """
        是否需要后续问题:是的。
        后续问题:李白享年多少岁?
        中间答案:李白享年61岁。
        后续问题:杜甫享年多少岁?
        中间答案:杜甫享年58岁。
        所以最终答案是:李白
        """,
    },
    {
        "question": "腾讯的创始人什么时候出生?",
        "answer": """
        是否需要后续问题:是的。
        后续问题:腾讯的创始人是谁?
        中间答案:腾讯由马化腾创立。
        后续问题:马化腾什么时候出生?
        中间答案:马化腾出生于1971年10月29日。
        所以最终答案是:1971年10月29日
        """,
    },
]

所以我们也要要求大模型按照我们所给出的示例与思考流程完成问题的回答与答案的总结。首先我们需要创建一个字符串模板:

python 复制代码
prompt_template=PromptTemplate.from_template("Question:{question}\n{answer}")

注意这里我们用到的是PromptTemplate类的from_template方法,参数有两个分别是{question}与{answer}。需要注意的是这里的参数必须与你所定义的examples列表中定义的参数保持严格一致,因为后续会将examples中的question与answer后面的内容传递给

"Question:{question}\n{answer}"字符串并按照其格式实例化出一批提示词。

如何将我们定义的字符串模板与示例集联系起来并按照模板示例化出一批提示词呢,这里我们使用

FewShotPromptTemplate类来完成这个功能:

python 复制代码
few_shot_chat_mess=FewShotPromptTemplate(
    example_prompt=prompt_template,
    examples=examples,
    suffix="",
)

来看下 class langchain_core.prompts.few_shot.FewShotPromptTemplate,它也实现了标准的 Runnable 接口。

类初始化参数说明:

  • examples:样本示例。
  • example_prompt:PromptTemplate,用于格式化单个示例
  • prefix:放在示例前面的提示模板字符串。
  • suffix:放在示例之后的提示模板字符串(必填)。
  • input_variables:变量的名称列表,这些变量的值需要作为提示词的输入。

类方法说明:

  • .invoke() 方法:此方法与其他 Runnable 实例的 .invoke() 方法类似。输入一个字典给提示符模板,返回完整的提示内容 PromptValue
    • PromptValueto_string() 方法可以将提示值作为【字符串】返回。
    • PromptValueto_messages() 方法可以将提示作为【消息列表】返回。

将根据示例集实例化出的提示词打印出来:

python 复制代码
mess=few_shot_chat_mess.invoke({})

print(mess.to_string())
python 复制代码
Question:李白和杜甫,谁更长寿?

        是否需要后续问题:是的。
        后续问题:李白享年多少岁?
        中间答案:李白享年61岁。
        后续问题:杜甫享年多少岁?
        中间答案:杜甫享年58岁。
        所以最终答案是:李白
        

Question:腾讯的创始人什么时候出生?

        是否需要后续问题:是的。
        后续问题:腾讯的创始人是谁?
        中间答案:腾讯由马化腾创立。
        后续问题:马化腾什么时候出生?
        中间答案:马化腾出生于1971年10月29日。
        所以最终答案是:1971年10月29日

但是实例化后的提示词是有了,但是我们的问题是:《教父》和《星球大战》的导演来自同一个国家吗?,之前我们使用FewShotChatMessagePromptTemplate的时候会获得一个消息列表然后我们可以将自己的问题作为HumanMessage插入进去并将整个消息列表喂给大模型就可以了。但是这里是不一样的,我们实例化后的并不是一个消息列表而是一个字符串。这里就会体现出FewShotPromptTemplate与FewShotChatMessagePromptTemplate的不同之处了:

FewShotPromptTemplate除了

  • examples:样本示例。
  • example_prompt:PromptTemplate,用于格式化单个示例

参数之外还提供了其他几个参数比如:

  • prefix:放在示例前面的提示模板字符串。
  • suffix:放在示例之后的提示模板字符串(必填)。
  • input_variables:变量的名称列表,这些变量的值需要作为提示词的输入。

prefix参数用来告诉大模型他的定位以及工作内容,与消息列表中的SystemMessage类似。

suffix参数则填写我们需要大模型具体要做什么,也就是填我们自己的问题

input_variables则表示一个参数列表,如果我们suffix参数传递的是一个字符串模板则需要将其中的参数列举在其中,并之后一一进行填充实例化出最终传递给suffix参数的问题。

我们要求大模型做的工作是根据所给的实例回答相应的问题,所以这里FewShotPromptTemplate的参数需要这样填:

python 复制代码
few_shot_chat_mess=FewShotPromptTemplate(
    example_prompt=prompt_template,
    examples=examples,
    prefix="根据所给的实例,按照格式与思考流程回答相应问题",
    suffix="《教父》和《星球大战》的导演来自同一个国家吗?" #直接写明相应的问题
)
python 复制代码
根据所给的实例,按照格式与思考流程回答相应问题

Question:李白和杜甫,谁更长寿?

        是否需要后续问题:是的。
        后续问题:李白享年多少岁?
        中间答案:李白享年61岁。
        后续问题:杜甫享年多少岁?
        中间答案:杜甫享年58岁。
        所以最终答案是:李白
        

Question:腾讯的创始人什么时候出生?

        是否需要后续问题:是的。
        后续问题:腾讯的创始人是谁?
        中间答案:腾讯由马化腾创立。
        后续问题:马化腾什么时候出生?
        中间答案:马化腾出生于1971年10月29日。
        所以最终答案是:1971年10月29日
        

《教父》和《星球大战》的导演来自同一个国家吗?

或者:

python 复制代码
few_shot_chat_mess=FewShotPromptTemplate(
    example_prompt=prompt_template,
    examples=examples,
    prefix="根据所给的实例,按照格式与思考流程回答相应问题",
    suffix="Question:{question}",        #给出一个字符串模板,后续invoke的时候再传入相应问题
    input_variables=[{"question"}]
)

mess=few_shot_chat_mess.invoke({"question":"《教父》和《星球大战》的导演来自同一个国家吗?"})

print(mess.to_string())

mess=few_shot_chat_mess.invoke({"question":"《教父》和《阿凡达》的导演来自同一个国家吗?"})

print(mess.to_string())

最后我们只需要将所有的提示词传递给大模型即可:

完整代码:

python 复制代码
from langchain_core.prompts import PromptTemplate,  FewShotPromptTemplate
from langchain_deepseek import ChatDeepSeek

prompt_template=PromptTemplate.from_template("Question:{question}\n{answer}")

examples = [
    {
        "question": "李白和杜甫,谁更长寿?",
        "answer": """
        是否需要后续问题:是的。
        后续问题:李白享年多少岁?
        中间答案:李白享年61岁。
        后续问题:杜甫享年多少岁?
        中间答案:杜甫享年58岁。
        所以最终答案是:李白
        """,
    },
    {
        "question": "腾讯的创始人什么时候出生?",
        "answer": """
        是否需要后续问题:是的。
        后续问题:腾讯的创始人是谁?
        中间答案:腾讯由马化腾创立。
        后续问题:马化腾什么时候出生?
        中间答案:马化腾出生于1971年10月29日。
        所以最终答案是:1971年10月29日
        """,
    },
]

few_shot_chat_mess=FewShotPromptTemplate(
    example_prompt=prompt_template,
    examples=examples,
    prefix="根据所给的实例,按照格式与思考流程回答相应问题",
    suffix="Question:{question}",
    input_variables=["question"]
)

mess=few_shot_chat_mess.invoke({"question":"《教父》和《星球大战》的导演来自同一个国家吗?"})

model=ChatDeepSeek(model="deepseek-chat")

print(model.invoke(mess).content)
相关推荐
lisw052 小时前
MySQL 数据库:概念、历史、内容与展望!
数据库·mysql
2301_780789663 小时前
CDN提供商常用的DDoS缓解技术与策略
linux·运维·服务器·人工智能·架构
智塑未来3 小时前
常用的在线ping测试工具有哪些
服务器·开发语言·php
foolishlee3 小时前
Neon proxy云端控制面
数据库
小蒜学长4 小时前
借助于大模型工具Cursor的中药材交易系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
底层玩家老张4 小时前
数据库上K8s,运维为什么反而更累了?从StatefulSet到Operator的复盘
数据库·kubernetes·operator·数据库运维·架构选型
Tisfy5 小时前
LeetCode 2058.找出临界点之间的最小和最大距离:遍历+遇到极值则更新(这种题谁空间复杂度不是O(1)啊)
linux·数据库·leetcode·链表·题解·模拟·遍历
数据库小学妹5 小时前
MySQL死锁排查:锁机制原理、死锁日志与information_schema定位
运维·数据库·mysql
liulilittle5 小时前
REALITY 代理隧道的有效检测方法: 被动、主动与确定性三层实证研究
linux·服务器·网络·网络协议·安全·网络安全·通信