赞
踩
下文包括以下内容:
首先定义一个提示词模版
from langchain_core.prompts import PromptTemplate from llmself.makeLLm import Kimi # 提示此模版内容 template = """ 请将由三个反引号分隔的文本内容用"{language}"进行翻译 ```{text}``` """ # 创建提示词模版 prompt_template = PromptTemplate( input_variables=["text", "language"], template=template ) text = f""" 您应该提供尽可能清晰和具体的指令来表达您希望模型执行的任务。\ 这将引导模型朝着期望的输出方向发展,并减少接收到不相关或不正确响应的可能性。\ 不要将编写清晰提示与编写简短提示混淆。在许多情况下,\ 更长的提示提供更多的清晰度和上下文,这可能会导致更详细和相关的输出。 """ llm = Kimi() # 测试提示词模版 print(llm.invoke(prompt_template.format(text=text,language="英文")))
输出
You should provide instructions that are as clear and specific as possible to express the task you want the model to perform. This will guide the model in the direction of the desired output and reduce the likelihood of receiving irrelevant or incorrect responses. Do not confuse writing clear prompts with writing short prompts. In many cases, longer prompts provide more clarity and context, which can lead to more detailed and relevant output.
Few-Shot 提示词工程(Few-Shot Prompt Engineering)是一个涉及设计和优化提示词(Prompts)的过程,目的是使模型能够在只有少量示例的情况下(Few-Shot Learning)理解和执行特定的任务。这种方法试图模仿人类学习新概念时的能力,即通过观察少量的实例就能够理解和应用新知识。
下面以抽取自然语言实体为例,首先创建一个输入是短句,回答是 抽取短句中人、地、物的示例:
给模型一些样例数据的数据准备
def few_shot_prompt_template_example(): from langchain_core.prompts import FewShotPromptTemplate # 下面是一个抽取人、地、物的示例首先定义10个短语 short_sentences = [ "那位穿着蓝色衬衫的人在图书馆的角落里安静地阅读着一本关于地理学的书籍。", "孩子们在公园的草地上追逐着一只活泼的小狗,它的尾巴像旗帜一样摇摆。", "经过漫长的徒步旅行,探险家们终于到达了山顶,那里有一块标志着地界的巨大岩石。", "艺术家在街角的咖啡馆里,用画笔描绘着窗外繁忙街道上的人物和车辆。", "博物馆里展出的古代文物吸引了众多游客驻足,他们好奇地观察着这些历史的见证物。", "春天来临时,花园里的花朵竞相开放,吸引了蜜蜂和蝴蝶等小生物前来采蜜。", "渔夫在宁静的湖边悠闲地钓鱼,他的小船随着水面的波纹轻轻摇晃。", "书店的角落里,一位老人正专注地翻阅着一本关于世界各地风土人情的旅行指南。", "学生们在教室里认真地听讲,老师则用多媒体设备展示着世界各地的地理特征。", "厨师在厨房里忙碌着,他的手艺将普通的食材变成了一道道色香味俱全的佳肴。" ] # 抽取后的效果 siphon = [ { "人": "那位穿着蓝色衬衫的人", "地": "图书馆的角落", "物": "一本关于地理学的书籍" }, { "人": "孩子们", "地": "公园的草地", "物": "一只活泼的小狗" }, { "人": "探险家们", "地": "山顶", "物": "一块标志着地界的巨大岩石" }, { "人": "艺术家", "地": "街角的咖啡馆", "物": "窗外繁忙街道上的人物和车辆" }, { "人": "游客", "地": "博物馆", "物": "古代文物" }, { "人": "", "地": "花园", "物": "花朵、蜜蜂、蝴蝶" }, { "人": "渔夫", "地": "宁静的湖边", "物": "小船" }, { "人": "老人", "地": "书店的角落", "物": "一本关于世界各地风土人情的旅行指南" }, { "人": "学生们、老师", "地": "教室", "物": "多媒体设备、世界各地的地理特征" }, { "人": '厨师', "地": "厨房", "物": "食材、佳肴" } ] examples = [] for item in zip(short_sentences, siphon): text = item[0] siphon = '' for k,v in item[1].items(): _siphon = k+ ':' + v + ',' siphon += _siphon examples.append({'text': text, 'siphon': siphon})
examples效果
[{'text': '那位穿着蓝色衬衫的人在图书馆的角落里安静地阅读着一本关于地理学的书籍。', 'siphon': '人:那位穿着蓝色衬衫的人,地:图书馆的角落,物:一本关于地理学的书籍,'}, {'text': '孩子们在公园的草地上追逐着一只活泼的小狗,它的尾巴像旗帜一样摇摆。', 'siphon': '人:孩子们,地:公园的草地,物:一只活泼的小狗,'}, {'text': '经过漫长的徒步旅行,探险家们终于到达了山顶,那里有一块标志着地界的巨大岩石。', 'siphon': '人:探险家们,地:山顶,物:一块标志着地界的巨大岩石,'}, {'text': '艺术家在街角的咖啡馆里,用画笔描绘着窗外繁忙街道上的人物和车辆。', 'siphon': '人:艺术家,地:街角的咖啡馆,物:窗外繁忙街道上的人物和车辆,'}, {'text': '博物馆里展出的古代文物吸引了众多游客驻足,他们好奇地观察着这些历史的见证物。', 'siphon': '人:游客,地:博物馆,物:古代文物,'}, {'text': '春天来临时,花园里的花朵竞相开放,吸引了蜜蜂和蝴蝶等小生物前来采蜜。', 'siphon': '人:,地:花园,物:花朵、蜜蜂、蝴蝶,'}, {'text': '渔夫在宁静的湖边悠闲地钓鱼,他的小船随着水面的波纹轻轻摇晃。', 'siphon': '人:渔夫,地:宁静的湖边,物:小船,'}, {'text': '书店的角落里,一位老人正专注地翻阅着一本关于世界各地风土人情的旅行指南。', 'siphon': '人:老人,地:书店的角落,物:一本关于世界各地风土人情的旅行指南,'}, {'text': '学生们在教室里认真地听讲,老师则用多媒体设备展示着世界各地的地理特征。', 'siphon': '人:学生们、老师,地:教室,物:多媒体设备、世界各地的地理特征,'}, {'text': '厨师在厨房里忙碌着,他的手艺将普通的食材变成了一道道色香味俱全的佳肴。', 'siphon': '人:厨师,地:厨房,物:食材、佳肴,'}]
创建一个PromptTemplate模版
example_prompt = PromptTemplate(
input_variables=["text", "siphon"],
template="短句:{text}\n抽取:{siphon}"
)
创建一个FewShotPromptTemplate对象,用于构建少量样本提示模板
# few_shot_prompt_template = FewShotPromptTemplate( examples=examples, # 提供一些示例,这些示例包含输入和期望的输出 example_prompt=example_prompt, # 提供一个示例提示,展示如何从文本中抽取信息 prefix="请参照下面的例子从句子中抽取出其中的`人、地、物`", # 设置提示的前缀,指导用户如何完成任务 suffix="我将给你的短句是:{text},只返回抽取结果用json格式", # 设置提示的后缀,指示用户输入文本并要求以JSON格式返回结果 input_variables=["text"], # 定义输入变量,这里是文本变量 example_separator="," # 设置示例分隔符,用于分隔不同的示例 ) # 调用llm.invoke函数,并传入格式化后的few_shot_prompt_template # 这里使用了.format()方法来插入文本,但没有实际执行打印,因为代码被注释掉了 # print(llm.invoke(few_shot_prompt_template.format( # text="那位年轻的画家在巴黎的蒙马特高地上,用他的画笔捕捉着埃菲尔铁塔的壮丽景象。" #))) # 打印llm.invoke函数的输出,传入格式化后的few_shot_prompt_template # 这里传入了一个具体的文本例子,并要求返回抽取结果 print(llm.invoke(few_shot_prompt_template.format( text="那位年轻的画家在巴黎的蒙马特高地上,用他的画笔捕捉着埃菲尔铁塔的壮丽景象。" )))
画图解释:
最终输出结果:
{
"人": "那位年轻的画家",
"地": "巴黎的蒙马特高地上",
"物": "埃菲尔铁塔的壮丽景象"
}
from langchain_core.messages import HumanMessage from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, AIMessagePromptTemplate, \ ChatPromptTemplate from llmself.makeLLm import Kimi #系统指令 system_template = SystemMessagePromptTemplate.from_template(""" 你是一个搞笑段子的助手,创作时采用如下风格: 风格:{style} """) #人类指令输入需要生成内容的主题背景 human_template = HumanMessagePromptTemplate.from_template("{input}") #ai回答 ai_template = AIMessagePromptTemplate.from_template("{response}") # 从给定的消息模板创建一个ChatPromptTemplate实例。 # 这里引用上面定义好的system_template, human_template, ai_template模板实例。 chat_prompt = ChatPromptTemplate.from_messages([ system_template, # 系统消息模板 human_template, # 人类消息模板 ai_template # 人工智能消息模板 ]) # 使用ChatPromptTemplate实例格式化提示,传入上述三个模版的变量 chat_prompt_value = chat_prompt.format_prompt( style="冷笑话", # 指定system_template样式为冷笑话 input="描述大海", # human_template输入的提示内容 response="大海啊都是水。" # ai_template预期的回应内容 ).to_messages() # 将格式化后的提示转换为消息列表 # 创建一个新的HumanMessage实例,并添加到chat_prompt_value中。 # 这里的内容是要求描述太阳的伟大。 chat_prompt_value.append(HumanMessage(content="描述太阳的伟大")) # 创建一个Kimi实例,这里是我提前定义好的Kimi接口llm保证类 llm = Kimi() # 调用Kimi实例的invoke方法,传入构建好的聊天提示消息列表,并打印结果。 print(llm.invoke(chat_prompt_value))
AI: 太阳啊,真是个大火球,每天都在天上烤面包。
# 礼物规范 from langchain.output_parsers import StructuredOutputParser, ResponseSchema from langchain_core.prompts import ChatPromptTemplate from llmself.makeLLm import Kimi #提取店名 gift_schema = ResponseSchema(name="店名", description="是否含有店名?\ 如果是,请回答True;\ 如果不是或者不知道,请回答False。") # 商品名 delivery_days_schema = ResponseSchema(name="商品名", description="是否含有商品名?\ 如果找不到这个信息,请输出-1。如果有请输出[商品名1,商品名2]") # 价格 price_value_schema = ResponseSchema(name="价格", description="提取任何关于价值或价格的句子,\ 并将它们作为逗号分隔的Python列表输出。") # 将格式规范放到一个列表里 response_schemas = [gift_schema, delivery_days_schema, price_value_schema] # 构建一个StructuredOutputParser实例 output_parser = StructuredOutputParser.from_response_schemas(response_schemas) # 获取将发送给LLM的格式指令 format_instructions = output_parser.get_format_instructions() print(format_instructions)
给模型生成个输出规范
```json
{
"店名": string // 是否含有店名? 如果是,请回答True; 如果不是或者不知道,请回答False。
"商品名": string // 是否含有商品名? 如果找不到这个信息,请输出-1。如果有请输出[商品名1,商品名2]
"价格": string // 提取任何关于价值或价格的句子, 并将它们作为逗号分隔的Python列表输出。
}
```python review_template = """\ 对于以下文本描述,提取以下信息: 示例:{format_instructions} 文本: {text} """ # 构建一个ChatPromptTemplate实例,用于模板的重用 prompt_template = ChatPromptTemplate.from_template(template=review_template) text="""妞吖宠物生活店,原始猎食渴望(ORIJEN)原始猎食渴望猫粮无谷鸡肉成猫幼猫全阶段通用猫干粮5.4/kg【全阶 美版渴望鸡橘猫5.4kg【冠军标】 京 东 价¥ 549.00 降价通知""" # 将文本和格式指令作为输入变量传入 messages = prompt_template.format_messages(text=text, format_instructions=format_instructions) llm=Kimi() print(llm.invoke(messages))
输出
```json
{
"店名": true, // 妞吖宠物生活店
"商品名": ["原始猎食渴望(ORIJEN)原始猎食渴望猫粮无谷鸡肉成猫幼猫全阶段通用猫干粮"], // 5.4/kg【全阶 美版渴望鸡橘猫5.4kg【冠军标】
"价格": ["¥549.00"] // 京 东 价¥ 549.00 降价通知
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。