LangChain基本介绍| 豆包MarsCode AI刷题

143 阅读8分钟
  • LangChain本质上就是对各种大模型提供的API的套壳,是为了方便我们使用这些API,搭建起来的一些框架、模块和接口。

OpenAI API

你需要先用科学的方法进行注册,并得到一个API Key。有了OpenAI的账号和Key,你就可以在面板中看到各种信息,比如模型的费用、使用情况等。下面的图片显示了各种模型的访问数量限制信息。其中,TPM和RPM分别代表tokens-per-minute、requests-per-minute。也就是说,对于GPT-4,你通过API最多每分钟调用200次、传输40000个字节

image.png

豆包API

  1. 访问火山方舟官网完成账号注册和服务授权 image.png
  2. 在控制台的 API Key管理 页面中创建 API Key。

image.png 3. 在控制台的 在线推理页面 中创建推理接入点,推荐使用doubao-pro-32k作为主力模型,模型部署完成后即可获得模型的base_url和model_endpoint

  1. 编辑项目中的  /home/cloudide/.cloudiderc 文件,将API_Key、base_url、model_endpoint 配置在环境变量中,在命令行中执行 source ~/.cloudiderc ,之后就都可以使用自己豆包模型API执行课程代码。
export OPENAI_API_KEY=<YOUR_API_KEY>
export OPENAI_BASE_URL=<YOUR_MODEL_BASE_URL>
export LLM_MODELEND=<YOUR_MODEL_ENDPOINT>

具体步骤可点击ai练中学(LangChain 实战课 - 掘金小册 - 掘金小册)侧边目录最下方,README.MD文档

Model模型分类

Chat Model聊天模型

用于产生人类和AI之间的对话,代表模型是gpt-3.5-turbo(也就是ChatGPT)和GPT-4。

OpenAI还提供其它的版本,gpt-3.5-turbo-0613代表ChatGPT在2023年6月13号的一个快照,而gpt-3.5-turbo-16k则代表这个模型可以接收16K长度的Token,而不是通常的4K。(注意了,gpt-3.5-turbo-16k并未开放给我们使用,而且你传输的字节越多,花钱也越多)

整体流程上,Chat模型和Text模型的调用是类似的,只是前面加了一个chat,且输入(prompt)和输出(response)的数据格式有所不同。

调用chat模型

示例代码如下:

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发送多轮对话中新的对话请求时,可以通过助手消息提供先前对话的上下文。然而,请注意在对话的最后一条消息应始终为用户消息,因为模型总是要回应最后这条用户消息。

在使用Chat模型生成内容后,返回的响应,也就是response会包含一个或多个choices,每个choices都包含一个message。每个message也都包含一个role和content。role可以是system、user或assistant,表示该消息的发送者,content则包含了消息的实际内容。

一个典型的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
   }
  ]
}

以下是各个字段的含义:

https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/51ff2ba29eba4f808693f733ec2d3eec~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MjI2NjkzMTY3MDU=:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiNDI4MTk3NjQzMjEwNjUwNiJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730731483&x-orig-sign=J7JWeYLzbJFzn8cSbalvxeikhmg%3D

这就是response的基本结构,其实它和Text模型返回的响应结构也是很相似,只是choices字段中的Text换成了Message。你可以通过解析这个对象来获取你需要的信息。例如,要获取模型的回复,可使用 response['choices'][0]['message']['content']。

Text Model文本模型

  • 在ChatGPT出来之前,大家都使用这种模型的API来调用GPT-3,文本模型的代表作是text-davinci-003(基于GPT3)。

调用Text模型

第1步,先注册好你的API Key。 第2步,用 pip install openai 命令来安装OpenAI库。 第3步,导入 OpenAI API Key。 导入API Key有多种方式,其中之一是通过下面的代码:

import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'

OpenAI库就会查看名为OPENAIAPIKEY的环境变量,并使用它的值作为API密钥。

也可以像下面这样先导入OpenAI库,然后指定api_key的值。

import openai
openai.api_key = '你的Open API Key'

当然,这种把Key直接放在代码里面的方法最不可取,因为你一不小心共享了代码,密钥就被别人看到了,他就可以使用你的GPT-4资源!所以,建议你给自己的OpenAI账户设个上限,比如每月10美元啥的。

所以更好的方法是在操作系统中定义环境变量,比如在Linux系统的命令行中使用:

export OPENAI_API_KEY='你的Open API Key' 

或者,你也可以考虑把环境变量保存在.env文件中,使用python-dotenv库从文件中读取它,这样也可以降低API密钥暴露在代码中的风险。

第4步,导入OpenAI库,并创建一个Client。

from openai import OpenAI
client = OpenAI()

第5步,指定 gpt-3.5-turbo-instruct(也就是 Text 模型)并调用 completions 方法,返回结果。

plain
复制代码
AI练中学
response = client.completions.create(
  model="gpt-3.5-turbo-instruct",
  temperature=0.5,
  max_tokens=100,
  prompt="请给我的花店起个名")

在使用OpenAI的文本生成模型时,你可以通过一些参数来控制输出的内容和样式。这里我总结为了一些常见的参数:

image.png 第6步,打印输出大模型返回的文字。

plain
复制代码
AI练中学
print(response.choices[0].text.strip())

当你调用OpenAI的Completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。

在使用Text模型(如text-davinci-003)的情况下,响应对象的主要字段包括:

image.png choices字段是一个列表,因为在某些情况下,你可以要求模型生成多个可能的输出。每个选择都是一个字典,其中包含以下字段:

text:模型生成的文本。

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

所以,​​​​response.choices[0].text.strip()​​​​ 这行代码的含义是:从响应中获取第一个(如果在调用大模型时,没有指定n参数,那么就只有唯一的一个响应)选择,然后获取该选择的文本,并移除其前后的空白字符。这通常是你想要的模型的输出。

至此,任务完成,模型的输出如下:

心动花庄、芳华花楼、轩辕花舍、簇烂花街、满园春色

LangChain开发框架

image.png 整个框架分为这样三个部分。

  1. 数据源(Data Sources):数据可以有很多种,包括PDF在内的非结构化的数据(Unstructured Data)、SQL在内的结构化的数据(Structured Data),以及Python、Java之类的代码(Code)。在这个示例中,我们聚焦于对非结构化数据的处理。
  2. 大模型应用(Application,即LLM App):以大模型为逻辑引擎,生成我们所需要的回答。
  3. 用例(Use-Cases):大模型生成的回答可以构建出QA/聊天机器人等系统。

LangChain核心实现机制

这个项目的核心实现机制是下图所示的数据处理管道(Pipeline)。

73a46eecd42038961db9067e75de3387.webp

在这个管道的每一步中,LangChain都为我们提供了相关工具,让你轻松实现基于文档的问答功能。

具体流程分为下面5步。

  1. Loading:文档加载器把Documents 加载为以LangChain能够读取的形式。
  2. Splitting:文本分割器把Documents 切分为指定大小的分割,我把它们称为“文档块”或者“文档片”。
  3. Storage:将上一步中分割好的“文档块”以“嵌入”(Embedding)的形式存储到向量数据库(Vector DB)中,形成一个个的“嵌入片”。
  4. Retrieval:应用程序从存储中检索分割后的文档(例如通过比较余弦相似度,找到与输入问题类似的嵌入片)。
  5. Output:把问题和相似的嵌入片传递给语言模型(LLM),使用包含问题和检索到的分割的提示生成答案