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)
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
# 中文
get_completion("1+1是什么?")
复杂一点的例子:
假设我们是电商公司员工,我们的顾客是一名海盗A,他在我们的网站上买了一个榨汁机用来做奶昔,在制作奶昔的过程中,奶昔的盖子飞了出去,弄得厨房墙上到处都是。于是海盗A给我们的客服中心写来以下邮件:customer_email
# 非正式用语
customer_email = """
阿,我很生气,\
因为我的搅拌机盖掉了,\
把奶昔溅到了厨房的墙上!\
更糟糕的是,保修不包括打扫厨房的费用。\
我现在需要你的帮助,伙计!
"""
客服人员对于海盗的措辞表达觉得有点难以理解。 现在我们想要实现两个小目标:
根据这两个小目标,定义一下文本表达风格:style
# 普通话 + 平静、尊敬的语调
style = """正式普通话 \
用一个平静、尊敬的语调
"""
下一步需要做的是将customer_email
和style
结合起来构造我们的提示:prompt
# 要求模型根据给出的语调进行转化
prompt = f"""把由三个反引号分隔的文本\
翻译成一种{style}风格。
文本: ```{customer_email}```
"""
print(prompt)
prompt
构造好了,我们可以调用get_completion
得到我们想要的结果 - 用平和尊重的语气,美式英语表达的海盗语言邮件
response = get_completion(prompt)
response
'啊,我感到非常不快,因为我的搅拌机盖子脱落了,导致奶昔溅到了厨房的墙壁上。更令人沮丧的是,保修条款并不涵盖清理厨房的费用。我现在需要您的帮助,恳请您给予支持。
对比语言风格转换前后,用词更为正式,替换了极端情绪的表达,并表达了感谢。
from langchain_community.chat_models.zhipuai import ChatZhipuAI
chat = ChatZhipuAI(temperature=0,zhipuai_api_key=key)
chat
在前面的例子中,我们通过f字符串把Python表达式的值style
和customer_email
添加到prompt
字符串内。
prompt = f"""Translate the text \
that is delimited by triple backticks
into a style that is {style}.
text: ```{customer_email}```
"""
langchain
提供了接口方便快速的构造和使用提示。
我们构造一个提示模版字符串:template_string
template_string = """把由三个反引号分隔的文本\
翻译成一种{style}风格。\
文本: ```{text}```
"""
我们调用ChatPromptTemplate.from_template()
函数将上面的提示模版字符template_string
转换为提示模版prompt_template
from langchain.prompts.chat import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_template(template_string)
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_style
和customer_email
, 我们可以使用提示模版prompt_template
的format_messages
方法生成想要的客户消息customer_messages
。
现在我们可以调用模型部分定义的chat模型来实现转换客户消息风格。到目前为止,我们已经实现了在前一部分的任务。
customer_response = chat.invoke(customer_messages, temperature=0.0)
print(customer_response.content)
啊,我感到有些不悦,因为我的搅拌机盖不慎脱落,导致奶昔四溅至厨房墙壁。更为不巧的是,保修服务并不涵盖清理厨房的费用。在此情况下,我亟需您的协助,朋友。
接下来,我们更进一步,将客服人员回复的消息,转换为海盗的语言风格,并确保消息比较有礼貌。
这里,我们可以继续使用第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)
调用模型部分定义的chat模型来转换回复消息风格
service_response = chat(service_messages)
print(service_response.content)
在应用于比较复杂的场景时,提示可能会非常长并且包含涉及许多细节。使用提示模版,可以让我们更为方便地重复使用设计好的提示。
下面给出了一个比较长的提示模版案例。学生们线上学习并提交作业,通过以下的提示来实现对学生的提交的作业的评分。
# 中文版
prompt = """ 你的任务是判断学生的解决方案是正确的还是不正确的
要解决该问题,请执行以下操作:
- 首先,制定自己的问题解决方案
- 然后将您的解决方案与学生的解决方案进行比较
并评估学生的解决方案是否正确。
...
使用下面的格式:
问题:
```
问题文本
```
学生的解决方案:
```
学生的解决方案文本
```
实际解决方案:
```
...
制定解决方案的步骤以及您的解决方案请参见此处
```
学生的解决方案和实际解决方案是否相同 \
只计算:
```
是或者不是
```
学生的成绩
```
正确或者不正确
```
问题:
```
{question}
```
学生的解决方案:
```
{student's solution}
```
实际解决方案:
"""
对于给定的评价customer_review
, 我们希望提取信息,并按以下格式输出:
{
"gift": False,
"delivery_days": 5,
"price_value": "pretty affordable!"
}
from langchain.prompts import ChatPromptTemplate
customer_review = """\
这款吹叶机非常神奇。 它有四个设置:\
吹蜡烛、微风、风城、龙卷风。 \
两天后就到了,正好赶上我妻子的\
周年纪念礼物。 \
我想我的妻子会喜欢它到说不出话来。 \
到目前为止,我是唯一一个使用它的人,而且我一直\
每隔一天早上用它来清理草坪上的叶子。 \
它比其他吹叶机稍微贵一点,\
但我认为它的额外功能是值得的。
"""
review_template = """\
对于以下文本,请从中提取以下信息:
礼物:该商品是作为礼物送给别人的吗? \
如果是,则回答 是的;如果否或未知,则回答 不是。
交货天数:产品需要多少天\
到达? 如果没有找到该信息,则输出-1。
价钱:提取有关价值或价格的任何句子,\
并将它们输出为逗号分隔的 Python 列表。
使用以下键将输出格式化为 JSON:
礼物
交货天数
价钱
文本: {text}
"""
prompt_template = ChatPromptTemplate.from_template(review_template)
print(prompt_template)
3️⃣ 使用模版得到提示消息
messages = prompt_template.format_messages(text=customer_review)
chat = ChatOpenAI(temperature=0.0)
response = chat(messages)
print(response.content)
review_template_2 = """\
对于以下文本,请从中提取以下信息::
礼物:该商品是作为礼物送给别人的吗?
如果是,则回答 是的;如果否或未知,则回答 不是。
交货天数:产品到达需要多少天? 如果没有找到该信息,则输出-1。
价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。
文本: {text}
{format_instructions}
"""
prompt = ChatPromptTemplate.from_template(template=review_template_2)
from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser
gift_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)
messages = prompt.format_messages(text=customer_review, format_instructions=format_instructions)
print(messages[0].content)
response = chat(messages)
print(response.content)
```json { "礼物": "是的", "交货天数": "2", "价钱": "它比其他吹叶机稍微贵一点" } ```
output_dict = output_parser.parse(response.content)
output_dict
{'礼物': '是的', '交货天数': '2', '价钱': '它比其他吹叶机稍微贵一点'}