Bootstrap

langchain(基础)二--prompts高级

1.zero-shot(零样本学习)

# 导入PromptTemplate类,用于创建和管理提示模板
from langchain.prompts import PromptTemplate

# 定义一个提示模板字符串,其中包含一个占位符{subject},用于后续的故事主题
template = "给我将一个关于{subject}的故事"
# 创建PromptTemplate实例,传入模板字符串和输入变量列表
# 此处的输入变量即是我们之前定义的模板中的占位符,用于在生成提示时替换具体值
prompt = PromptTemplate(template=template, input_variables=["subject"])
# 使用.format()方法将特定主题(老虎)填入模板,生成具体的提示文本
prompt_text = prompt.format(subject="老虎")
# 打印生成的提示文本
print(prompt_text)

2.few-shot(少样本学习)

# 导入LangChain核心提示库中的FewShotPromptTemplate和PromptTemplate类
from langchain_core.prompts import FewShotPromptTemplate
from langchain_core.prompts import PromptTemplate

# 示例
examples = [
    {'word': '大', 'antonym': '小'},
    {'word': '黑', 'antonym': '白'},
    {'word': '高', 'antonym': '低'},
    {'word': '强', 'antonym': '弱'},
]

# 样例
prompt_template = '{word}的反义词是{antonym}'

# 创建一个PromptTemplate对象,用于具体示例的呈现
example_prompt = PromptTemplate(input_variables=['word', 'antonym'], template=prompt_template)

# 初始化一个FewShotPromptTemplate对象,用于基于少量示例进行提示
# 指定例子、提示格式、前缀说明、后缀提问格式、输入变量和例子分隔符
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,# 模型训练的案例
    example_prompt=example_prompt,# 样例
    prefix='请帮我找出每个单词的反义词',# 提示前缀
    suffix='请找出{word}的反义词',# 提示后缀
    input_variables=['word'],
    example_separator='\n'
)

# 使用few_shot_prompt生成最终提示,并指定要查询反义词的单词
print(few_shot_prompt.format(word='早'))

# 导入通义大模型的Tongyi类
from langchain_community.llms.tongyi import Tongyi

# 创建一个通义大模型的实例,配置模型类型、温度和最大令牌数
llm = Tongyi(
    model='gpt-3.5-turbo-16k',
    temperature=0.4,
    max_tokens=1024
)

# 使用模型处理生成的提示,寻找指定单词的反义词
print(llm(few_shot_prompt.format(word='女')))

3.长度示例选择器

import re

# 导入PromptTemplate类,用于创建和管理提示模板
from langchain.prompts import PromptTemplate
# 导入FewShotPromptTemplate类,用于创建少量示例提示模板,这种模板会在提示中包含几个示例
from langchain.prompts import FewShotPromptTemplate
# 导入LengthBasedExampleSelector类,用于根据示例的长度来选择要包含在提示中的示例
from langchain.prompts.example_selector import LengthBasedExampleSelector

# 导入通义大模型
from langchain_community.llms import Tongyi

# 定义一组示例,用于 FewShot 学习,每个示例包含输入和预期输出
examples = [
    {"input": "患者如何在家测量血压?", "output": "患者可以在家使用电子血压计测量血压,遵循说明书上的步骤,通常在早上和晚上各测量一次。"},
    {"input": "糖尿病患者的饮食应该注意什么?", "output": "糖尿病患者应该注意饮食中的糖分和碳水化合物摄入,多食用蔬菜、全谷物和瘦肉,避免高糖和高脂肪食物。"},
    {"input": "儿童发烧时应该如何处理?", "output": "儿童发烧时,应首先测量体温,如果超过38.5°C,可以使用退烧药,并给孩子多喝水,保持通风,适当减少衣物。"},
    {
        "input": "我喜欢科幻电影,有什么推荐的吗?",
        "output": "如果您喜欢科幻电影,可以观看《星际穿越》或《银翼杀手2049》,这两部电影都以其深刻的主题和视觉效果著称。"
    },
    {
        "input": "我想看一些悬疑推理的电影,有什么建议?",
        "output": "对于悬疑推理爱好者,推荐您观看《盗梦空间》或《福尔摩斯》,这些电影以其复杂的剧情和出人意料的结局而受到好评。"
    },
    {
        "input": "我喜欢浪漫喜剧,有什么电影推荐?",
        "output": "如果您偏好浪漫喜剧,可以尝试观看《当哈利遇到莎莉》或《爱情与灵药》,这些电影以其幽默的对话和温馨的爱情故事而受到喜爱。"
    }
]


# 创建一个 Prompt 模板,用于格式化输入和输出
# 创建一个名为example_prompt的PromptTemplate对象,用于定义一个特定格式的模板
# 该模板用于将输入和输出参数按照指定的格式进行格式化
example_prompt = PromptTemplate(
    input_variables=["input", "output"],  # 模板中使用的输入变量为"input"和"output"
    template="输入:{input}\n输出:{output}"  # 模板的具体格式,将输入和输出变量插入到指定位置
)


# 定义计算长度的函数
def get_length(text):
    # print('text', text)
    return len(re.split("\n| ", text))


# 创建一个基于长度的示例选择器,用于动态选择最相关的示例
# 创建一个基于长度的示例选择器实例,用于根据最大长度限制选择合适的示例集合
example_selector = LengthBasedExampleSelector(
    examples=examples,  # 输入的示例集合
    example_prompt=example_prompt,  # 示例提示,用于指示如何使用这些示例
    max_length=20,  # 设置的最大长度限制,选择的示例总长度不会超过这个值
    # get_text_length=get_length  # 获取文本长度的函数,用于计算示例的长度
    # 该函数需要能够接受一个字符串作为输入,并返回其长度
)


# 使用动态示例选择器创建 FewShot 提示模板
# 创建一个动态提示模板,用于根据描述确定病情
dynamic_prompt = FewShotPromptTemplate(
    example_selector=example_selector,  # 设置示例选择器
    example_prompt=example_prompt,  # 设置示例提示模板
    prefix="根据描述确定",  # 设置提示前缀,用于指示任务目标
    suffix="输入: {adjective}\n输出:",  # 设置提示后缀,包括输入变量的占位符和输出的格式
    input_variables=["adjective"],  # 定义输入变量,此处为描述病情的形容词
)


# 根据特定输入格式化动态提示
prompt = dynamic_prompt.format(adjective="糖尿病患者的饮食")
# prompt = dynamic_prompt.format(adjective="想看恐怖片")

print('prompt', prompt)

# 初始化通义大模型
tongyi = Tongyi()
# 使用模型调用提示
print(prompt)
ret = tongyi.invoke(prompt)
# 打印模型返回的结果
print('ret', ret)

4.MMR示例选择器

from langchain.prompts import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings

# 定义一组示例,用于 FewShot 学习,每个示例包含输入和预期输出
examples = [
    {"input": "患者如何在家测量血压?", "output": "患者可以在家使用电子血压计测量血压,遵循说明书上的步骤,通常在早上和晚上各测量一次。"},
    {"input": "糖尿病患者的饮食应该注意什么?", "output": "糖尿病患者应该注意饮食中的糖分和碳水化合物摄入,多食用蔬菜、全谷物和瘦肉,避免高糖和高脂肪食物。"},
    {"input": "儿童发烧时应该如何处理?", "output": "儿童发烧时,应首先测量体温,如果超过38.5°C,可以使用退烧药,并给孩子多喝水,保持通风,适当减少衣物。"},
    {
        "input": "我喜欢科幻电影,有什么推荐的吗?",
        "output": "如果您喜欢科幻电影,可以观看《星际穿越》或《银翼杀手2049》,这两部电影都以其深刻的主题和视觉效果著称。"
    },
    {
        "input": "我想看一些悬疑推理的电影,有什么建议?",
        "output": "对于悬疑推理爱好者,推荐您观看《盗梦空间》或《福尔摩斯》,这些电影以其复杂的剧情和出人意料的结局而受到好评。"
    },
    {
        "input": "我喜欢浪漫喜剧,有什么电影推荐?",
        "output": "如果您偏好浪漫喜剧,可以尝试观看《当哈利遇到莎莉》或《爱情与灵药》,这些电影以其幽默的对话和温馨的爱情故事而受到喜爱。"
    }
]

example_prompt = PromptTemplate(
    input_variables=["input", "output"],  # 模板中使用的输入变量为"input"和"output"
    template="输入:{input}\n输出:{output}"  # 模板的具体格式,将输入和输出变量插入到指定位置
)

example_selector = SemanticSimilarityExampleSelector.from_examples(
    #传入示例组
    examples,
    #使用阿里云的dashscope的嵌入来做相似性搜索
    DashScopeEmbeddings(),
    #设置使用的向量数据库是什么
    FAISS,
    #结果条数
    k=2,
)

#使用小样本提示词模版来实现动态示例的调用
dynamic_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="根据提示,回答问题",
    suffix="输入: {adjective}\n输出:",  # 设置提示后缀,包括输入变量的占位符和输出的格式
    input_variables=["adjective"],  # 定义输入变量,此处为描述病情的形容词
)

# prompt = dynamic_prompt.format(adjective="糖尿病患者的饮食")
prompt = dynamic_prompt.format(adjective="想看科幻恐怖片")

print('prompt', prompt)

;