当前位置: 首页 > ai >正文

【LangChain】1 模型,提示和输出解释器

一、设置 Key

import os
from zhipuai import ZhipuAI
from dotenv import load_dotenv, find_dotenv# 读取本地/项目的环境变量。# find_dotenv()寻找并定位.env文件的路径
# load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中  
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())# 获取环境变量 OPENAI_API_KEY
# openai.api_key = os.environ['ZHIPUAI_API_KEY']  
key = "f5cd91f2528fed334b9dfd75015791c3.GuLdvM9tXWrGQnAg"
client = ZhipuAI(api_key = key)

二、直接使用ZhipuAI

def get_completion(prompt, model="glm-3-turbo"):messages = [{"role": "user", "content": prompt}]response = client.chat.completions.create(model=model,messages=messages,temperature=0, )return response.choices[0].message.content

2.1 计算1+1

# 中文
get_completion("1+1是什么?")

2.2 用美式英语表达海盗邮件

复杂一点的例子:

假设我们是电商公司员工,我们的顾客是一名海盗A,他在我们的网站上买了一个榨汁机用来做奶昔,在制作奶昔的过程中,奶昔的盖子飞了出去,弄得厨房墙上到处都是。于是海盗A给我们的客服中心写来以下邮件:customer_email

# 非正式用语
customer_email = """   
阿,我很生气,\
因为我的搅拌机盖掉了,\
把奶昔溅到了厨房的墙上!\
更糟糕的是,保修不包括打扫厨房的费用。\
我现在需要你的帮助,伙计!
"""

客服人员对于海盗的措辞表达觉得有点难以理解。 现在我们想要实现两个小目标:

  • 让模型用美式英语的表达方式将海盗的邮件进行翻译,客服人员可以更好理解。*这里海盗的英文表达可以理解为英文的方言,其与美式英语的关系,就如四川话与普通话的关系。
  • 让模型在翻译是用平和尊重的语气进行表达,客服人员的心情也会更好。

根据这两个小目标,定义一下文本表达风格:style

# 普通话 + 平静、尊敬的语调
style = """正式普通话 \
用一个平静、尊敬的语调
"""

下一步需要做的是将customer_emailstyle结合起来构造我们的提示:prompt

# 要求模型根据给出的语调进行转化
prompt = f"""把由三个反引号分隔的文本\
翻译成一种{style}风格。
文本: ```{customer_email}```
"""print(prompt)

prompt 构造好了,我们可以调用get_completion得到我们想要的结果 - 用平和尊重的语气,美式英语表达的海盗语言邮件

response = get_completion(prompt)response
'啊,我感到非常不快,因为我的搅拌机盖子脱落了,导致奶昔溅到了厨房的墙壁上。更令人沮丧的是,保修条款并不涵盖清理厨房的费用。我现在需要您的帮助,恳请您给予支持。

对比语言风格转换前后,用词更为正式,替换了极端情绪的表达,并表达了感谢。

三、通过LangChain使用ZhipuAI

3.1 模型

from langchain_community.chat_models.zhipuai import ChatZhipuAI
chat = ChatZhipuAI(temperature=0,zhipuai_api_key=key)
chat

3.2 提示模板

在前面的例子中,我们通过f字符串把Python表达式的值stylecustomer_email添加到prompt字符串内。

prompt = f"""Translate the text \
that is delimited by triple backticks 
into a style that is {style}.
text: ```{customer_email}```
"""

langchain提供了接口方便快速的构造和使用提示。

3.2.1 使用LangChain提示模版
1️⃣ 构造提示模版字符串¶

我们构造一个提示模版字符串:template_string

template_string = """把由三个反引号分隔的文本\
翻译成一种{style}风格。\
文本: ```{text}```
"""

2️⃣ 构造LangChain提示模版

我们调用ChatPromptTemplate.from_template()函数将上面的提示模版字符template_string转换为提示模版prompt_template

from langchain.prompts.chat import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_template(template_string)
3️⃣ 使用模版得到客户消息提示

langchain提示模版prompt_template需要两个输入变量: style 和 text。 这里分别对应

  • customer_style: 我们想要的顾客邮件风格
  • customer_email: 顾客的原始邮件文本。
customer_style = """正式普通话 \
用一个平静、尊敬的语气
"""customer_email = """
阿,我很生气,\
因为我的搅拌机盖掉了,\
把奶昔溅到了厨房的墙上!\
更糟糕的是,保修不包括打扫厨房的费用。\
我现在需要你的帮助,伙计!
"""customer_messages = prompt_template.format_messages(style=customer_style,text=customer_email)

对于给定的customer_stylecustomer_email, 我们可以使用提示模版prompt_templateformat_messages方法生成想要的客户消息customer_messages

4️⃣ 调用chat模型转换客户消息风格¶

现在我们可以调用模型部分定义的chat模型来实现转换客户消息风格。到目前为止,我们已经实现了在前一部分的任务。

customer_response = chat.invoke(customer_messages, temperature=0.0)
print(customer_response.content)
啊,我感到有些不悦,因为我的搅拌机盖不慎脱落,导致奶昔四溅至厨房墙壁。更为不巧的是,保修服务并不涵盖清理厨房的费用。在此情况下,我亟需您的协助,朋友。
5️⃣ 使用模版得到回复消息提示

接下来,我们更进一步,将客服人员回复的消息,转换为海盗的语言风格,并确保消息比较有礼貌。

这里,我们可以继续使用第2️⃣步构造的langchain提示模版,来获得我们回复消息提示。

service_reply = """嘿,顾客, \
保修不包括厨房的清洁费用, \
因为您在启动搅拌机之前 \
忘记盖上盖子而误用搅拌机, \
这是您的错。 \
倒霉! 再见!
"""service_style_pirate = """\
一个有礼貌的语气 \
使用正式的普通话 \
"""
service_messages = prompt_template.format_messages(style=service_style_pirate,text=service_reply)print(service_messages[0].content)
6️⃣ 调用chat模型转换回复消息风格

调用模型部分定义的chat模型来转换回复消息风格

service_response = chat(service_messages)
print(service_response.content)
3.2.2 为什么需要提示模版

在应用于比较复杂的场景时,提示可能会非常长并且包含涉及许多细节。使用提示模版,可以让我们更为方便地重复使用设计好的提示

下面给出了一个比较长的提示模版案例。学生们线上学习并提交作业,通过以下的提示来实现对学生的提交的作业的评分。

# 中文版
prompt = """ 你的任务是判断学生的解决方案是正确的还是不正确的要解决该问题,请执行以下操作:- 首先,制定自己的问题解决方案- 然后将您的解决方案与学生的解决方案进行比较并评估学生的解决方案是否正确。
...
使用下面的格式:问题:
```
问题文本
```
学生的解决方案:
```
学生的解决方案文本
```
实际解决方案:
```
...
制定解决方案的步骤以及您的解决方案请参见此处
```
学生的解决方案和实际解决方案是否相同 \
只计算:
```
是或者不是
```
学生的成绩
```
正确或者不正确
```问题:
```
{question}
```
学生的解决方案:
```
{student's solution}
```
实际解决方案:"""

3.3 输出解析器

3.3.1 如果没有输出解析器

对于给定的评价customer_review, 我们希望提取信息,并按以下格式输出:

{"gift": False,"delivery_days": 5,"price_value": "pretty affordable!"
}
from langchain.prompts import ChatPromptTemplatecustomer_review = """\
这款吹叶机非常神奇。 它有四个设置:\
吹蜡烛、微风、风城、龙卷风。 \
两天后就到了,正好赶上我妻子的\
周年纪念礼物。 \
我想我的妻子会喜欢它到说不出话来。 \
到目前为止,我是唯一一个使用它的人,而且我一直\
每隔一天早上用它来清理草坪上的叶子。 \
它比其他吹叶机稍微贵一点,\
但我认为它的额外功能是值得的。
"""
1️⃣ 构造提示模版字符串
review_template = """\
对于以下文本,请从中提取以下信息:礼物:该商品是作为礼物送给别人的吗? \
如果是,则回答 是的;如果否或未知,则回答 不是。交货天数:产品需要多少天\
到达? 如果没有找到该信息,则输出-1。价钱:提取有关价值或价格的任何句子,\
并将它们输出为逗号分隔的 Python 列表。使用以下键将输出格式化为 JSON:
礼物
交货天数
价钱文本: {text}
"""
2️⃣ 构造langchain提示模版
prompt_template = ChatPromptTemplate.from_template(review_template)
print(prompt_template)

 3️⃣ 使用模版得到提示消息

messages = prompt_template.format_messages(text=customer_review)
4️⃣ 调用chat模型提取信息¶
chat = ChatOpenAI(temperature=0.0)
response = chat(messages)
print(response.content)
3.3.3 LangChain输出解析器¶
1️⃣ 构造提示模版字符串
review_template_2 = """\
对于以下文本,请从中提取以下信息::礼物:该商品是作为礼物送给别人的吗?
如果是,则回答 是的;如果否或未知,则回答 不是。交货天数:产品到达需要多少天? 如果没有找到该信息,则输出-1。价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。文本: {text}{format_instructions}
"""
2️⃣ 构造langchain提示模版
prompt = ChatPromptTemplate.from_template(template=review_template_2)
构造输出解析器
from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParsergift_schema = ResponseSchema(name="礼物",description="这件物品是作为礼物送给别人的吗?\如果是,则回答 是的,\如果否或未知,则回答 不是。")delivery_days_schema = ResponseSchema(name="交货天数",description="产品需要多少天才能到达?\如果没有找到该信息,则输出-1。")price_value_schema = ResponseSchema(name="价钱",description="提取有关价值或价格的任何句子,\并将它们输出为逗号分隔的 Python 列表")response_schemas = [gift_schema, delivery_days_schema,price_value_schema]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
3️⃣ 使用模版得到提示消息
messages = prompt.format_messages(text=customer_review, format_instructions=format_instructions)
print(messages[0].content)
4️⃣ 调用chat模型提取信息
response = chat(messages)
print(response.content)
```json
{"礼物": "是的","交货天数": "2","价钱": "它比其他吹叶机稍微贵一点"
}
```
5️⃣ 使用输出解析器解析输出
output_dict = output_parser.parse(response.content)
output_dict

 {'礼物': '是的', '交货天数': '2', '价钱': '它比其他吹叶机稍微贵一点'}

http://www.xdnf.cn/news/13247.html

相关文章:

  • STM32外部中断(寄存器和hal库实现)
  • 机房断电后 etcd 启动失败的排查与快速恢复实录
  • YOLOv11 | 注意力机制篇 | EMAttention与C2PSA机制的协同优化
  • 从0到1:HBase安装与操作指南
  • 3.vue3核心语法
  • 中马泰语言电商系统:打开东南亚电商市场的多语言钥匙
  • 【第二十三章 IAP】
  • Vim 替换命令完整学习笔记
  • 一次消谐器:高效抑制铁磁谐振
  • 对DOM操作 与 jQuery的简单理解(通俗
  • DeepSeek生成流程图
  • 6.10 Mysql 事务 锁 面试题
  • 【Dv3Admin】系统视图角色管理API文件解析
  • 2025蓝奏云软件库合集分享链接汇总:极刻云搜 - 一站式获取海量资源
  • Linux下V2Ray安装配置指南
  • axios访问后台时,返回404
  • chrome插件中如何使用midscene.js
  • Leetcode 3577. Count the Number of Computer Unlocking Permutations
  • LeetCode 240 搜索二维矩阵 II
  • MySQL中的隐式主键和隐藏列
  • Go 语言接口详解
  • 架空线路图像视频监测装置
  • SkyWalking 10.2.0 SWCK 配置过程
  • 『uniapp』url拦截屏蔽 避免webview中打开淘宝店铺自动跳转淘宝
  • 腾讯开源 AniPortrait:音频驱动的逼真肖像动画生成革命
  • 【Java】Arrays.sort:DualPivotQuicksort
  • Spring AI MCP
  • AISHELL-5 全球首套智能驾舱中文语音交互数据集开源
  • 探秘鸿蒙 HarmonyOS NEXT:鸿蒙定时器,简单倒计时的场景应用
  • HAProxy 高可用部署方案详解