• 作者:老汪软件技巧
  • 发表时间: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进行了解析,只保留了响应中最重要的文字部分。


上一条查看详情 +GCC 编译过程的三个阶段
下一条 查看详情 +没有了