LangChain系统安装和快速入门

451 阅读9分钟

使用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步,用 <font style="color:rgb(255, 80, 44);background-color:rgb(255, 245, 245);">pip install openai</font> 命令来安装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字段是一个列表,因为在某些情况下,你可以要求模型生成多个可能的输出。每个选择都是一个字典,其中包含以下字段:

  • text:模型生成的文本。
  • finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。

所以,<font style="color:rgb(255, 80, 44);background-color:rgb(255, 245, 245);">response.choices[0].text.strip()</font> 这行代码的含义是:从响应中获取第一个(如果在调用大模型时,没有指定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都是消息的角色。每一种角色都有不同的含义和作用。

  • system:系统消息主要用于设定对话的背景或上下文。这可以帮助模型理解它在对话中的角色和任务。例如,你可以通过系统消息来设定一个场景,让模型知道它是在扮演一个医生、律师或者一个知识丰富的AI助手。系统消息通常在对话开始时给出。
  • user:用户消息是从用户或人类角色发出的。它们通常包含了用户想要模型回答或完成的请求。用户消息可以是一个问题、一段话,或者任何其他用户希望模型响应的内容。
  • assistant:助手消息是模型的回复。例如,在你使用API发送多轮对话中新的对话请求时,可以通过助手消息提供先前对话的上下文。然而,请注意在对话的最后一条消息应始终为用户消息,因为模型总是要回应最后这条用户消息。
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模型各有所长,适用性取决于应用场景。
  • Chat模型更适合处理对话或多轮交互。它能接收包含system、user及assistant信息的消息列表作为输入,提供更丰富的上下文。
    • 优点:便于管理对话历史;支持通过system角色设定背景信息来控制输出。
  • 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进行了解析,只保留了响应中最重要的文字部分。