【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 ChatPromptTemplate

customer_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 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)
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', '价钱': '它比其他吹叶机稍微贵一点'}

你可能感兴趣的:(大模型,#LangChain,langchain,人工智能)