LangChain 实战02 - Chat Model和Text Model

265 阅读7分钟

我正在参加「豆包MarsCode AI练中学体验活动」详情请看:掘金小册上线 AI练中学功能 | 你的 AI 编程助教喊你免费领小册啦!

前言

image.png 大型语言模型是一种人工智能模型,通常采用深度学习方法,如神经网络,以理解和生成人类语言。这些模型的“大”体现在其参数规模上,参数数量可高达数十亿甚至更多,这使它们能够处理和生成极其复杂的语言结构。

你可以将大型语言模型视为一个庞大的预测引擎,其训练过程主要依赖于“猜测词语”:给定一段文本的开头,它的任务是预测接下来的词语。模型通过大量的训练数据(例如从互联网上抓取的文本),尝试理解词语和短语在语言中的使用和含义,以及它们如何组合以形成意义。它会通过持续学习和调整参数,使自己的预测越来越精确。

例如,当我们给模型一个句子:“今天的天气真”,模型可能会预测出“好”作为下一个词,因为在它所见的大量训练数据中,“今天的天气真好”是一个常见的表达。这种预测不仅基于词语的统计关系,还包括对上下文的理解,有时甚至能反映出对世界常识的认知,比如它会理解到,人们通常会在天气好的时候进行户外活动。因此,它能够继续生成或推理出相关的内容。

然而,大型语言模型并不真正理解语言,它们缺乏人类的情感、意识或理解力。它们只是通过复杂的数学函数学习到的语言模式,作为一个概率模型来进行预测,因此有时会出错,或者生成不合理甚至偏离主题的内容。

入门指南

LangChain 是一个全面的、基于大型语言模型预测能力的应用开发工具,它的灵活性和模块化特性使得处理语言模型变得非常简便。无论何时何地,你都可以利用它轻松调用语言模型,并基于语言模型的“预测”或“推理”能力开发新的应用。

安装

# 安装LangChain
pip install langchain
# OpenAI的API接口
pip install openai
# 向量数据库
pip install chroma 
# 安装常用的开源LLM(大语言模型) 库:
pip install langchain[llms]

社区文档

LangChain GitHub社区地址:点击跳转

LangChain 文档地址:点击跳转

OpenAi Api

1. Api keys

image.png TPM和RPM分别代表tokens-per-minute、requests-per-minute。也就是说,对于GPT-4,你通过API最多每分钟调用200次、传输40000个字节。

image.png 在这里,我们需要着重介绍的是图中的两类模型:Chat Model和Text Model。这两类模型是大语言模型的典型代表。当然,OpenAI还提供了Image、Audio等其他类型的模型,但目前它们不是LangChain支持的重点,且数量相对较少。

  • 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尚未向我们开放使用,且传输的字节越多,费用也越高)
  • Text Model,即文本模型,在ChatGPT问世之前,人们主要使用这种模型的API来调用GPT-3,其代表作是text-davinci-003(基于GPT3)。在这个模型家族中,还有专门用于文本嵌入的text-embedding-ada-002,以及专门用于相似度比较的模型,如text-similarity-curie-001。

上述两种模型提供的功能相似,都是接收对话输入(input,也称为prompt),并返回回答文本(output,也称为response)。但是它们的调用方式和所需的输入格式有所不同。

2.Text 模型

# 导入API Key
import os
import openai
# OpenAI库就会查看名为OPENAI_API_KEY的环境变量,并使用它的值作为API密钥。
os.environ["OPENAI_API_KEY"] = '你的Open API Key'

# 调用Text模型,并返回结果
response = openai.Completion.create(
  model="text-davinci-003",
  temperature=0.5,
  max_tokens=100,
  prompt="请给我的花店起个名")
  
#打印输出大模型返回的文字。
print(response.choices[0].text.strip())

在调用OpenAI的文本生成模型时,你可以通过设置一些参数来调整输出的内容和风格 image.png

3.Chat模型

从整体流程来看,Chat模型和Text模型的调用方式基本相同,主要区别在于输入(prompt)和输出(response)的数据格式。

response = openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
        {"role": "system", "content": "You are a creative AI."},
        {"role": "user", "content": "请给我的花店起个名"},
    ],
  temperature=0.8,
  max_tokens=60
)
print(response['choices'][0]['message']['content'])

在这段代码中,除了之前提到的temperature、max_tokens等参数外,还有两个特定于Chat模型的概念:消息角色

消息:传递给模型的提示。这里的messages参数是一个列表,包含多个消息。每条消息都有一个role(可以是system、user或assistant)和一个content(消息的具体内容)。系统消息设定了对话的背景(例如,你是一个很棒的智能助手),而用户消息则提出了具体请求(例如,请给我的花店起个名)。模型的任务是基于这些消息生成回复。

角色:在OpenAI的Chat模型中,system、user和assistant是消息的角色。每种角色都有其特定的含义和作用。

  • system:系统消息主要用于设定对话的背景或上下文。这有助于模型理解其在对话中的角色和任务。例如,你可以通过系统消息设定一个场景,让模型知道它是在扮演一个医生、律师或一个知识丰富的AI助手。系统消息通常在对话开始时给出。
  • user:用户消息是从用户或人类角色发出的。它们通常包含用户希望模型回答或完成的请求。用户消息可以是一个问题、一段话,或者任何其他用户希望模型响应的内容。
  • assistant:助手消息是模型的回复。例如,在你使用API发送多轮对话中的新对话请求时,可以通过助手消息提供先前对话的上下文。然而,请注意,对话的最后一条消息应始终为用户消息,因为模型总是要回应这条用户消息。

4. Chat模型 vs Text模型

Chat模型优势 更适合处理对话或多轮交互的场景。这是因为Chat模型可以接受一个消息列表作为输入,而不仅仅是一个字符串。这个消息列表可以包含system、user和assistant的历史信息,从而在处理交互式对话时提供更多的上下文信息。

  1. 对话历史的管理:通过使用Chat模型,你可以更方便地管理对话的历史,并在需要时向模型提供这些历史信息。
  2. 角色模拟:通过system角色,你可以设定对话的背景,给模型提供额外的指导信息,从而更好地控制输出的结果。当然在Text模型中,你也可以在提示中为AI设定角色,作为输入的一部分。

Text模型优势 可能会更简单、更直接。例如,如果你只需要模型根据一个简单的提示生成一段文本,那么Text模型可能更适合。

Langchain调用

Text模型

import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.llms import OpenAI
llm = OpenAI(
    model="text-davinci-003",
    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)