【LangChain系列 8】Prompt模版——少样本prompt模版(二)

原文地址:【LangChain系列 8】Prompt模版------少样本prompt模版(二)

本文速读:

  • 固定少样本prompt模版

  • 动态少样本prompt模版

在上篇文章中介绍了少样本模版的基本用法,本文将介绍 对话模型(chat model) 中 少样prompt模版的用法。LangChain封装了一些像FewShotChatMessagePromptTemplate的少样本prompt模版,在此基础上我们可以灵活的设计我们需要的 少样本prompt模版。少样本prompt模版 的目标就是可以根据输入去动态地选择样本,然后将选择的样本格式化到最后的prompt中去。

01 固定少样本prompt模版

最基本的少样本prompt技术是使用固定的prompt样本,所以对于一个少样本prompt模版至少要包含:

  • examples:用于prompt的样本数据

  • example_prompt:将每个样本数据转换成message

话不多说,下面将通过一个示例来介绍 固定少样本prompt模版 的使用。

  1. 导入相关模块
javascript 复制代码
from langchain.prompts import (
    FewShotChatMessagePromptTemplate,
    ChatPromptTemplate,
)
  1. 定义examples
ini 复制代码
examples = [
    {"input": "2+2", "output": "4"},
    {"input": "2+3", "output": "5"},
]
  1. 定义example_prompt
ini 复制代码
# This is a prompt template used to format each individual example.
example_prompt = ChatPromptTemplate.from_messages(
    [
        ("human", "{input}"),
        ("ai", "{output}"),
    ]
)
few_shot_prompt = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples,
)

print(few_shot_prompt.format())

执行代码,输出结果:

yaml 复制代码
  Human: 2+2  AI: 4  Human: 2+3  AI: 5
  1. 拼装最终的prompt
css 复制代码
final_prompt = ChatPromptTemplate.from_messages(
    [        ("system", "You are a wondrous wizard of math."),        few_shot_prompt,        ("human", "{input}"),    ]
)

from langchain.chat_models import ChatAnthropic

chain = final_prompt | ChatAnthropic(temperature=0.0)

chain.invoke({"input": "What's the square of a triangle?"})

ChatAnthropic是一个对话大语言模型,将最终的prompt输入给它,然后得到一个回答。执行代码,输出结果:

vbnet 复制代码
AIMessage(content=' Triangles do not have a "square". A square refers to a shape with 4 equal sides and 4 right angles. Triangles have 3 sides and 3 angles.\n\nThe area of a triangle can be calculated using the formula:\n\nA = 1/2 * b * h\n\nWhere:\n\nA is the area \nb is the base (the length of one of the sides)\nh is the height (the length from the base to the opposite vertex)\n\nSo the area depends on the specific dimensions of the triangle. There is no single "square of a triangle". The area can vary greatly depending on the base and height measurements.', additional_kwargs={}, example=False)

02 动态少样本prompt模版

有时我们可能需要从所有样本中动态选择更加符合要求的样本,此时我们只需要把examples替换成example_selector就可以了;那么动态的少样本prompt模版包含:

  • example_selector:根据输入从所有样本中选择部分样本数据

  • example_prompt:将每个样本数据转换成message

下面将介绍如何使用动态少样本prompt模版。

  1. 导入相关包
javascript 复制代码
from langchain.prompts import SemanticSimilarityExampleSelector
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
  1. 定义example,并向量化
ini 复制代码
examples = [
    {"input": "2+2", "output": "4"},
    {"input": "2+3", "output": "5"},
    {"input": "2+4", "output": "6"},
    {"input": "What did the cow say to the moon?", "output": "nothing at all"},
    {
        "input": "Write me a poem about the moon",
        "output": "One for the moon, and one for me, who are we to talk about the moon?",
    },
]

to_vectorize = [" ".join(example.values()) for example in examples]
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(to_vectorize, embeddings, metadatas=examples)
  1. 创建example_selector
bash 复制代码
example_selector = SemanticSimilarityExampleSelector(
    vectorstore=vectorstore,
    k=2,
)

# The prompt template will load examples by passing the input do the `select_examples` method
example_selector.select_examples({"input": "horse"})

    [{'input': 'What did the cow say to the moon?', 'output': 'nothing at all'},
     {'input': '2+4', 'output': '6'}]
  1. 创建prompt模版
ini 复制代码
from langchain.prompts import (
    FewShotChatMessagePromptTemplate,
    ChatPromptTemplate,
)

# Define the few-shot prompt.
few_shot_prompt = FewShotChatMessagePromptTemplate(
    # The input variables select the values to pass to the example_selector
    input_variables=["input"],
    example_selector=example_selector,
    # Define how each example will be formatted.
    # In this case, each example will become 2 messages:
    # 1 human, and 1 AI
    example_prompt=ChatPromptTemplate.from_messages(
        [("human", "{input}"), ("ai", "{output}")]
    ),
)

输出结果:

yaml 复制代码
  Human: 2+3  AI: 5  Human: 2+2  AI: 4

few_shot_prompt会根据input,动态地从examples中去选择合适的example数据。

  1. 拼装最终的prompt
css 复制代码
final_prompt = ChatPromptTemplate.from_messages(
    [        ("system", "You are a wondrous wizard of math."),        few_shot_prompt,        ("human", "{input}"),    ]
)



from langchain.chat_models import ChatAnthropic

chain = final_prompt | ChatAnthropic(temperature=0.0)

chain.invoke({"input": "What's 3+3?"})

运行代码,输出结果:

ini 复制代码
AIMessage(content=' 3 + 3 = 6', additional_kwargs={}, example=False)

本文小结

本文主要介绍了在对话模型(chat model)中,使用少样本prompt模版的两种方式:固定样本和动态样本。动态样本可以根据用户输入,动态地选择合适的样本,最终组成prompt输入给LLM,从而LLM可以更好地理解prompt,给出更加符合要求的答案。

相关推荐
suaizai_1 分钟前
LangChain+LangGraph实战:从Agent到可控工作流
人工智能
2601_949950637 分钟前
练题簿:把备考资料装进小程序,随时开启高效在线刷题
人工智能·小程序·刷题·练习·小程序推荐
nagualky1238 分钟前
AI Agent上线后怎么升级?先建立一套可回滚的变更控制
人工智能·机器学习·语言模型·软件工程
浅思科技集8 分钟前
AI软件工厂是什么?2026年企业如何构建智能化软件研发体系?
人工智能
码农学院10 分钟前
零售电商GEO踩坑复盘:商品列表页懒加载让 AI 爬虫只抓到八分之一的商品,前端改造全程记录
人工智能·geo优化·ai优化aio
IT_陈寒11 分钟前
Java序列化坑了我三天,原来问题出在这个默认方法
前端·人工智能·后端
该逃避避12 分钟前
网页数据采集是什么?需要准备哪些东西?
chatgpt
YOLO数据集集合28 分钟前
渔船船只检测数据集 | 船只检测 渔船识别 拖船检测 海事监管 目标检测 YOLO格式 深度学习数据集 计算机视觉9076期
人工智能·深度学习·yolo·目标检测·计算机视觉
stereohomology29 分钟前
一个可能有用的经验:api key在Workbuddy或Trae IDE上使用
人工智能·llm·薅羊毛
小刘快学习33 分钟前
企业提示词资产如何集中治理:AI网关的提示词管理能力
人工智能