- 作者:老汪软件技巧
- 发表时间:2024-11-06 21:01
- 浏览量:
使用LangChain之前,我们需要先安装相应的库
pip install langchain[llms]
LangChain是一个Python库,它是用来对我们调用的模型进行进一步的抽象和包装,使其对外提供一个方便的,针对我们要求的项目逻辑的接口。
那么首先需要有一个能供我们调用的模型。一般的大模型对外提供的API都需要申请,这里我们选择申请OpenAI API,因为OpenAI提供的GPT家族模型是目前接口最完备的、同时也是最强大的大语言模型。
在OpenAI提供的API网页操作界面中,我们需要关注的是Rate limits。
可以看到属性行包含三个列名“MODEL”“TPM”“RPM”。其中“MODEL”代表了模型的种类、“TPM”代表了“tokens-per-minute”、“RPM”代表了“requests-per-minute”。以“gpt-3.5-turbo”为例,该模型能支持每分钟 90,000 个 token ,每分钟 3,500 次调用。
在图中我们还关注到模型种类被灰色高亮块隔开,分别是“CHAT”和“TEXT”。这其实是大模型的两种类型:Chat Model 和 Text Model:
类型用途代表模型特点/说明
Chat Model
用于产生人类和AI之间的对话
gpt-3.5-turbo (ChatGPT), GPT-4
- gpt-3.5-turbo: 基础版
- gpt-3.5-turbo-0613: 2023年6月13日的快照版本
- gpt-3.5-turbo-16k: 支持更长上下文(16K tokens),未公开可用且成本更高
Text Model
在ChatGPT之前被广泛使用的API调用方式
text-davinci-003 (基于GPT-3)
- text-similarity-curie-001: 专门用于文本相似度比较
- text-embedding-ada-002: 专为文本嵌入设计
上面这两种模型,提供的功能类似,都是接收对话输入(input,也叫prompt),返回回答文本(output,也叫response)。但是,它们的调用方式和要求的输入格式是有区别的。
下面我们用简单的代码段说明上述两种模型的调用方式。先看比较原始的Text模型(GPT3.5之前的版本)。
调用 Text 模型第1步,先注册一个API Key。
第2步,用 pip install openai 命令来安装OpenAI库。
第3步,导入 OpenAI API Key(或其它模型的API,但需要注意的是不同模型所需要调用的库也不同)。
导入API Key有多种方式,如下:
import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
import openai
openai.api_key = '你的Open API Key'
当然,这种把Key直接放在代码里面的方法最不可取,为安全起见,可以将API放在系统环境变量中,通过调用系统环境变量来调用API。
export OPENAI_API_KEY='你的Open API Key'
第4步,创建一个模型对象
from openai import OpenAI
client = OpenAI()
第5步,调用completion方法来创建一个响应对象
response = client.completions.create(
model="gpt-3.5-turbo-instruct",
temperature=0.5,
max_tokens=100,
prompt="请给我的花店起个名")
在创建响应对象的completion.create方法中有一些可选参数,如下:
:::tips
:::
第6步,打印输出大模型返回的文字。
print(response.choices[0].text.strip())
当你调用OpenAI的Completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。
在使用Text模型(如text-davinci-003)的情况下,响应对象的主要字段包括:
choices字段是一个列表,因为在某些情况下,你可以要求模型生成多个可能的输出。每个选择都是一个字典,其中包含以下字段:
所以,response.choices[0].text.strip() 这行代码的含义是:从响应中获取第一个(如果在调用大模型时,没有指定n参数,那么就只有唯一的一个响应)选择,然后获取该选择的文本,并移除其前后的空白字符。这通常是你想要的模型的输出。
至此,任务完成,模型的输出如下:
心动花庄、芳华花楼、轩辕花舍、簇烂花街、满园春色
调用 Chat 模型整体流程上,Chat模型和Text模型的调用是类似的,只是前面加了一个chat,然后输入(prompt)和输出(response)的数据格式有所不同。
示例代码如下:
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a creative AI."},
{"role": "user", "content": "请给我的花店起个名"},
],
temperature=0.8,
max_tokens=60
)
这段代码中,除去刚才已经介绍过的temperature、max_tokens等参数之外,有两个专属于Chat模型的概念,一个是消息,一个是角色!
消息,消息就是传入模型的提示。此处的messages参数是一个列表,包含了多个消息。每个消息都有一个role(可以是system、user或assistant)和content(消息的内容)。系统消息设定了对话的背景(你是一个很棒的智能助手),然后用户消息提出了具体请求(请给我的花店起个名)。模型的任务是基于这些消息来生成回复。
角色,在OpenAI的Chat模型中,system、user和assistant都是消息的角色。每一种角色都有不同的含义和作用。
messagerolecontent说明
system
例:你是一个很棒的智能助手。
设定对话背景或给模型提供初始指令。
user
例:请给我的花店起个名。
用户向模型提出的具体请求或问题。
assistant
例:你的花店可以叫做"花香四溢"
模型基于之前的对话内容生成的回答或建议。
在使用Chat模型生成内容后,返回的响应,也就是response会包含一个或多个choices,每个choices都包含一个message。每个message也都包含一个role和content。role可以是system、user或assistant,表示该消息的发送者,content则包含了消息的实际内容。
一个典型的response对象可能如下所示:
response =
{
'id': 'chatcmpl-2nZI6v1cW9E3Jg4w2Xtoql0M3XHfH',
'object': 'chat.completion',
'created': 1677649420,
'model': 'gpt-4',
'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
'choices': [
{
'message': {
'role': 'assistant',
'content': '你的花店可以叫做"花香四溢"。'
},
'finish_reason': 'stop',
'index': 0
}
]
}
以下是各个字段的含义:
这就是response的基本结构,其实它和Text模型返回的响应结构也是很相似,只是choices字段中的Text换成了Message。你可以通过解析这个对象来获取你需要的信息。例如,要获取模型的回复,可使用 response['choices'][0]['message']['content']。
Chat模型 vs Text模型Chat模型和Text模型各有所长,适用性取决于应用场景。Text模型则在简单单轮文本生成任务上表现得更为直接有效。对于仅需根据简短提示生成文本的情况,Text模型可能更合适。不过,在实际测试中发现,Chat模型往往能够产生更加完整自然的回答,这得益于其基于人类反馈进行的对齐训练。
总结来说,选择哪种模型取决于你的具体需求:如果涉及复杂的多轮对话或需要保持上下文连贯性,则推荐使用Chat模型;而对于简单的文本生成任务,Text模型可能是更好的选择。通过 LangChain 调用 Text 和 Chat 模型调用 Text 模型代码如下:
import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.llms import OpenAI
llm = OpenAI(
model="gpt-3.5-turbo-instruct",
temperature=0.8,
max_tokens=60,)
response = llm.predict("请给我的花店起个名")
print(response)
调用 Chat 模型代码如下:
import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model="gpt-4",
temperature=0.8,
max_tokens=60)
from langchain.schema import (
HumanMessage,
SystemMessage
)
messages = [
SystemMessage(content="你是一个很棒的智能助手"),
HumanMessage(content="请给我的花店起个名")
]
response = chat(messages)
print(response)
这段代码也不难理解,主要是通过导入LangChain的ChatOpenAI类,创建一个Chat模型对象,指定使用的模型和一些生成参数。然后从LangChain的schema模块中导入LangChain的SystemMessage和HumanMessage类,创建一个消息列表。消息列表中包含了一个系统消息和一个人类消息。你已经知道系统消息通常用来设置一些上下文或者指导AI的行为,人类消息则是要求AI回应的内容。之后,使用创建的chat对象和消息列表调用ChatOpenAI类的__call__方法,进行文本生成。生成的结果被存储在response变量中。
另外,无论是langchain.llms中的OpenAI(Text模型),还是langchain.chat_models中的ChatOpenAI中的ChatOpenAI(Chat模型),其返回的结果response变量的结构,都比直接调用OpenAI API来得简单一些。这是因为,LangChain已经对大语言模型的output进行了解析,只保留了响应中最重要的文字部分。