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)