LangChain使用之Model IO(提示词模版之FewShotPromptTemplate)

1、说明

在构建提示词时,可以通过少量样本示例来进一步格式化,在一些情况下可以显著提高模型的性能。少量示例提示模版由一组示例或一个负责从定义的集合中选择一部分示例的示例选择器构建。

  • FewShotPromptTemplate:与PromptTemplate组合使用;
  • FewShotChatMessagePromptTemplate:与ChatPromptTemplte使用;
  • Example selectors(示例选择器)。

2、FewShotPromptTemplate的使用

2.1 未提供示例情况

python 复制代码
import os
import dotenv
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
chat_model = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.4
)

res = chat_model.invoke("2 🦜 9是多少?")
print(res.content)

2.2 使用FewShotPromptTemplate

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

# 创建PromptTemplate实例
example_prompt = PromptTemplate.from_template(
    template = "input:{input}\output:{output}"
)

# 提供一些示例
examples = [
    {"input":"北京天气怎么样","output":"北京市"},
    {"input":"南京下雨吗","output":"南京市"},
    {"input":"武汉热吗","output":"武汉市"}
]

# 创建FewShotPromptTemplate实例
few_shot_template = FewShotPromptTemplate(
    example_prompt = example_prompt,
    examples = examples,
    suffix = "input:{input}\output:", # 声明在示例后面的提示词模版
    input_variables = ["input"],
)

few_prompt = few_shot_template.invoke(input = {"input":"天津会下雨吗?"})
print(few_prompt)

2.3 调用大模型使用

python 复制代码
import os
import dotenv
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
chat_model = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.4
)

response = chat_model.invoke(few_prompt)
print(response.content)

另一个示例:

python 复制代码
#1、创建提示模板
from langchain_core.prompts import PromptTemplate

# 创建提示模板,配置一个提示模板,将一个示例格式化为字符串
prompt_template = "你是一个数学专家,算式: {input} 值: {output} 使用: {description} "
# 这是一个提示模板,用于设置每个示例的格式
prompt_sample = PromptTemplate.from_template(prompt_template)
#2、提供示例
examples = [
    {"input": "2+2", "output": "4", "description": "加法运算"},
    {"input": "5-2", "output": "3", "description": "减法运算"},
]
#3、创建一个FewShotPromptTemplate对象
from langchain_core.prompts import FewShotPromptTemplate
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=prompt_sample,
    suffix="你是一个数学专家,算式: {input}  值: {output}",
    input_variables=["input", "output"]
)
print(prompt.invoke({"input":"2*5", "output":"10"}))
python 复制代码
result = chat_model.invoke(prompt.invoke({"input":"2*5", "output":"10"}))
print(result.content)

3、FewShotChatMessagePromptTemplate的使用

FewShotChatMessagePromptTemplate是专门为 聊天对话场景 设计的少样本提示模板。

3.1 未提供示例

python 复制代码
from langchain_core.prompts import FewShotChatMessagePromptTemplate,ChatPromptTemplate
# 1.示例消息格式
examples = [
    {"input":"1+1等于几?","output":"1+1等于2"},
    {"input":"法国的首都是?","output":"巴黎"}
]

# 2.定义示例的消息格式提示词模版
msg_example_prompt = ChatPromptTemplate.from_messages([
    ("human","{input}"),
    ("ai","{output}"),
])

# 3.定义FewShotChatMessagePromptTemplate对象
few_shot_prompt = FewShotChatMessagePromptTemplate(
    example_prompt=msg_example_prompt,
    examples=examples
)
# 4.输出格式化后的消息
print(few_shot_prompt.format())

示例2:

python 复制代码
# 1.导入相关包
from langchain_core.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate

# 2.定义示例组
examples = [
    {"input": "2🦜2", "output": "4"},
    {"input": "2🦜3", "output": "8"},
]

# 3.定义示例的消息格式提示词模版
example_prompt = ChatPromptTemplate.from_messages([
    ('human', '{input} 是多少?'),
    ('ai', '{output}')
])
# 4.定义FewShotChatMessagePromptTemplate对象
few_shot_prompt = FewShotChatMessagePromptTemplate(
    examples=examples,  # 示例组
    example_prompt=example_prompt,# 示例提示词词模版
)
# 5.输出完整提示词的消息模版
final_prompt = ChatPromptTemplate.from_messages(
    [
        ('system', '你是一个数学奇才'),
        few_shot_prompt,
        ('human', '{input}'),
    ]
)
#6.提供大模型import os
import dotenv
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
chat_model = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.4)
chat_model.invoke(final_prompt.invoke(input="2🦜4")).content

4、Example selectors(示例选择器)

示例选择策略:语义相似选择、长度选择、最大边际相关实例选择等。

使用示例选择器,从大量候选示例中选取最相关的示例子集。

示例1:

python 复制代码
# 1.导入相关包
from langchain_community.vectorstores import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
import os
import dotenv
from langchain_openai import OpenAIEmbeddings
dotenv.load_dotenv()
# 2.定义嵌入模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")

embeddings_model = OpenAIEmbeddings(
    model="text-embedding-ada-002"
)
# 3.定义示例组
examples = [
    {
        "question": "谁活得更久,穆罕默德·阿里还是艾伦·图灵?",
        "answer": """
        接下来还需要问什么问题吗?
        追问:穆罕默德·阿里去世时多大年纪?
        中间答案:穆罕默德·阿里去世时享年74岁。
        """,
    },
    {
        "question":"craigslist的创始人是什么时候出生的?",
        "answer":"""
        接下来还需要问什么问题吗?
        追问:谁是craigslist的创始人?
        中级答案:Craigslist是由克雷格·纽马克创立的。
        """,
    },
    {
        "question":"谁是乔治·华盛顿的外祖父?",
        "answer":"""
        接下来还需要问什么问题吗?
        追问:谁是乔治·华盛顿的母亲?
        中间答案:乔治·华盛顿的母亲是玛丽·鲍尔·华盛顿。
        """,
    },
    {
        "question":"《大白鲨》和《皇家赌场》的导演都来自同一个国家吗?",
        "answer":"""
        接下来还需要问什么问题吗?
        追问:《大白鲨》的导演是谁?
        中级答案:《大白鲨》的导演是史蒂文·斯皮尔伯格。
        """,
    },
]
# 4.定义示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    # 这是可供选择的示例列表
    examples,
    # 这是用于生成嵌入的嵌入类,用于衡量语义相似性
    embeddings_model,
    # 这是用于存储嵌入并进行相似性搜索的 VectorStore 类
    Chroma,
    # 这是要生成的示例数量
    k=1,
)
# 选择与输入最相似的示例
question = "玛丽·鲍尔·华盛顿的父亲是谁?"
selected_examples = example_selector.select_examples({"question": question})
print(f"与输入最相似的示例:{selected_examples}")

示例2:结合 FewShotPromptTemplate 使用

python 复制代码
# 1.导入相关包
from langchain_community.vectorstores import FAISS
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import OpenAIEmbeddings

# 2.定义示例提示词模版
example_prompt = PromptTemplate.from_template(
    template="Input: {input}\nOutput: {output}",
)
# 3.创建一个示例提示词模版
examples = [
    {"input": "高兴", "output": "悲伤"},
    {"input": "高", "output": "矮"},
    {"input": "长", "output": "短"},
    {"input": "精力充沛", "output": "无精打采"},
    {"input": "阳光", "output": "阴暗"},
    {"input": "粗糙", "output": "光滑"},
    {"input": "干燥", "output": "潮湿"},
    {"input": "富裕", "output": "贫穷"},
]

# 4.定义嵌入模型
embeddings = OpenAIEmbeddings(
    model="text-embedding-ada-002"
)
# 5.创建语义相似性示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    embeddings,
    FAISS,
    k=2,
)
# 6.定义小样本提示词模版
similar_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="给出每个词组的反义词",
    suffix="Input: {word}\nOutput:",
    input_variables=["word"],
)
response = similar_prompt.invoke({"word":"忧郁"})
print(response.text)
相关推荐
小雅痞2 分钟前
[Java][Leetcode hard] 42. 接雨水
java·开发语言·leetcode
We་ct6 分钟前
AI辅助开发术语体系深度剖析
开发语言·前端·人工智能·ai·ai编程
code_pgf7 分钟前
Llama 3 / Qwen / Mistral / DeepSeek 对比详解
人工智能·知识图谱·llama
t***5447 分钟前
Dev-C++中哪些选项可以设置
开发语言·c++
去伪存真13 分钟前
Superpowers 从“调教提示词”转向“构建工程规范”
前端·agent
輕華15 分钟前
PyQt5入门实战:安装、QtDesigner设计与PyUIC转换完整指南
开发语言·qt
AI先驱体验官17 分钟前
BotCash:Nvidia企业级Agent生态,智能体平台战争的新变量
大数据·人工智能·深度学习·重构·aigc
nap-joker20 分钟前
优化的局部定向韦伯图样与更快的区域卷积神经网络的集成,以增强医学图像检索和分类能力
人工智能·神经网络·cnn
jr-create(•̀⌄•́)21 分钟前
Deep Learning入门---神经网络概念
人工智能·深度学习·神经网络
AI先驱体验官24 分钟前
臻灵:数字人+大模型,实时交互的技术临界点在哪里
大数据·人工智能·深度学习·microsoft·重构·开源·交互