青训营X豆包MarsCode - 基础知识 (Langchain Basic Note)| 豆包MarsCode AI 刷题

53 阅读8分钟

2 基础知识

凑一篇方向三~同时挖个坑,逐步release做的note

  • 什么是 LLM :可以将大语言模型想象成一个巨大的预测机器,其训练过程主要基于“猜词”:

    • 给定一段文本的开头,它的任务就是预测下一个词是什么。模型会根据大量的训练数据(例如在互联网上爬取的文本),试图理解词语和词组在语言中的用法和含义,以及它们如何组合形成意义。它会通过不断地学习和调整参数,使得自己的预测越来越准确。

      可能会犯错误:但是,大语言模型并不完全理解语言,它们没有人类的情感、意识或理解力。它们只是通过复杂的数学函数学习到的语言模式,一个概率模型来做预测,所以有时候它们会犯错误,或者生成不合理甚至偏离主题的内容。

LangChain:是一个全方位的、基于 LLM 这种预测能力的应用开发工具,

  • 它的灵活性和模块化特性使得处理语言模型变得极其简便。
  • 不论你在何时何地,都能利用它流畅地调用语言模型,并基于 LLM 的“推理”能力,赋能开发一个新的应用
  • 预构建链功能:快速构建项目,就像乐高积木一样,菜鸟/糕手 都可以选择适合自己的部分快速 build
  • 模块化组件:对于希望进行更深入工作的开发者,LangChain 提供的模块化组件则允许你根据自己的需求定制和创建应用中的功能链条

详细讲安装

  • 用下面两种方法,我们就可以在安装 LangChain 的方法时,引入大多数的依赖项。

    • 安装LangChain时包括常用的开源LLM(大语言模型) 库:

      • pip install langchain[llms]
      • 安装完成之后,还需要更新到 LangChain 的最新版本 pip install --upgrade langchain,这样才能使用较新的工具
    • or 从源码安装:clone下来之后 pip install -e

社区获取

  • LangChain 的 GitHub 社区非常活跃,你可以在这里找到大量的教程和最佳实践,也可以和其他开发者分享自己的经验和观点

    • 有不会就提 issue
  • LangChain也提供了详尽的 API 文档,这是你在遇到问题时的重要参考。不过呢,我觉得因为 LangChain太新了,有时你可能会发现文档中有一些错误。在这种情况下,你可以考虑更新你的版本,或者在官方平台上提交一个问题反馈

    原文档是 🦜️🔗 LangChain,但是已经失效了,找了另外一个替代上去了

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

    • thus,要了解LangChain的底层逻辑,需要了解大模型的API的基本设计思路

看看 Openai Key

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

    token = 字节,有点暴力了

  • 主要两类模型 = Chat Model 和 Text Model

    这两类Model,是大语言模型的代表。当然,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)
  • 但是,它们的调用方式和要求的输入格式是有区别的,见后文 link

调用试试看

准备功夫:安装依赖 pip install openai

  • 导入 openai key
import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
​
或者
​
import openai
openai.api_key = '你的Open API Key'
  • 当然,如果想要 key 不随代码,保护一下的话,那就走系统层级,
export OPENAI_API_KEY='你的Open API Key' 
  • 或者,你也可以考虑把环境变量保存在.env文件中,使用python-dotenv库从文件中读取它,这样也可以降低API密钥暴露在代码中的风险

  • 调用 Text

    • 先创建个 client,然后 调用 completions 方法,返回结果

    • from openai import OpenAI
      client = OpenAI()
      response = client.completions.create(
        model="gpt-3.5-turbo-instruct",
        temperature=0.5,
        max_tokens=100,
        prompt="请给我的花店起个名")
      # 从响应中获取第一个(如果在调用大模型时,没有指定n参数,那么就只有唯一的一个响应)chocies,然后获取 text + strip
      print(response.choices[0].text.strip())
      
    • OpenAI的Completion.create方法:它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。

      • 调用的参数

        • 图图
      • 返回的 response 是一个dict,包含了多个字段

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

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

          • text:模型生成的文本

          • finish_reason:模型停止生成的原因

            可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)

  • 调用 Chat

    • 大差不差,只是方法上多了一个 中间的 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
      ) 
      
    • 有两个专属于Chat模型的概念,一个是 messages,一个是 role!

      • 先说 messages,消息就是传入模型的提示。此处的messages参数是一个列表,包含了多个消息。每个消息都有一个role(可以是system、user或assistant)和content(消息的内容)。

        系统消息设定了对话的背景(你是一个很棒的智能助手),然后用户消息提出了具体请求(请给我的花店起个名)。模型的任务是基于这些消息来生成回复。

      • role:在 OpenAI 的Chat模型中,system、user和assistant都是消息的角色。每一种角色都有不同的含义和作用。

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

    • 对话历史的管理:通过使用Chat模型,你可以更方便地管理对话的历史,并在需要时向模型提供这些历史信息。例如,你可以将过去的用户输入和模型的回复都包含在消息列表中,这样模型在生成新的回复时就可以考虑到这些历史信息。
    • 角色模拟:通过system角色,你可以设定对话的背景,给模型提供额外的指导信息,从而更好地控制输出的结果。当然在Text模型中,你在提示中也可以为AI设定角色,作为输入的一部分。

langchain调用:就用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)
    ```
  • 但其实,按照评论区举证,其实现在code已经更新如下了:

    • import os
      from langchain_openai import ChatOpenAI
      from langchain.schema import HumanMessage, SystemMessage
      ​
      # 创建 ChatOpenAI 实例
      chat = ChatOpenAI(model="gpt-4",
      temperature=0.8,
      max_tokens=60,
      api_key=os.getenv("API_KEY"),
      base_url="")
      ​
      # 准备消息
      messages = [
      SystemMessage(content="你是一个很棒的智能助手"),
      HumanMessage(content="请给我的花店起个名")
      ]
      ​
      # 使用 invoke 方法获取响应
      response = chat.invoke(messages)
      ​
      # 打印响应
      print(response)