青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

399 阅读12分钟

青训营X豆包MarsCode 技术训练营AI方向第一课

作者:冬灵

青训营介绍

很高兴能在此处青训营和大家见面,我叫冬灵,是一个爱学习ai的小白,希望能在青训营里找到许多朋友。

这是我的飞书:www.feishu.cn/invitation/…

这是我的个人主页:j1mbx7va0zr.feishu.cn/wiki/GxHbwo…

第一节课

课程链接:

在第一节课中主要介绍当前AI应用的背景和LangChain介绍

一、当前的AI应用背景

能看到我这边篇文章的读者,想必以及对ChatGPT等应用有所了解,在国内,常用的ai助手有文小言、kimi、通义千问、科大讯飞等。

GPT-4的出现是革命性的,课程中也提到的”AI 应用开发——新的历史节点“,为什么这么说,那么我们要了解一下过去的ai为什么不够聪明

二、LLM类型

预测型语言模型(如 RNN、GPT 等):
  • 工作原理是基于序列生成,通过逐步预测下一个词构建整个句子。

  • 示例:RNN 在给定一段文本的情况下,会基于历史上下文预测后续的词语。早期的 LLM 如 GPT-2 等也是基于这种方式。

提示驱动型语言模型(如 GPT-3、ChatGPT):
  • 这类模型通过 prompts(提示)生成基于更复杂指令的内容。用户提供一个 prompt 后,模型会依据它生成相应的回答、文本或执行其他特定任务。
  • 这类模型适合广泛的场景,比如编写文章、代码生成、对话机器人等,且通过 prompt 工程可以优化输出质量。

2022年之前主要以预测型语言模型为主,而2022年GPT-3.5的出现让提示驱动型语言模型上了一个台阶,于此开启了”新的历史节点“

面向AI时代,所有产品都值得用大模型重新升级。

这句话,可以理解为目前需要的场景、行业都能加入大模型,及“AI+”,这是应用的新一代升级浪潮,在这之下,如何学习对接大模型尤为重要

于是LangChain出现了,作为一种专为开发基于语言模型的应用而设计的框架,通过LangChain,我们不仅可以通过API调用如 ChatGPT、GPT-4、Llama 2 等大型语言模型,还可以实现更高级的功能。

三、LangChain的6个重要部分

image.png

LangChain中的具体组件包括:

  • 模型(Models) ,包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。 不同模型的api调用就在这边修改

  • 提示模板(Prompts) ,使提示工程流线化,进一步激发大语言模型的潜力。如何发挥大模型的能力,Prompt工程尤其重要

  • 数据检索(Indexes) ,构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。知识库,最简单的理解就是存放大模型额外需要的特点知识

  • 记忆(Memory) ,通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你是谁。

  • 链(Chains) ,是LangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成常见用例。

  • 代理(Agents) ,是另一个LangChain中的核心机制,通过“代理”让大模型自主调用外部工具和内部工具,使强大的“智能化”自主Agent成为可能!你的 App 将产生自驱力!

这边我们要稍微提一下Agents,在后续的课程会讲到更多

四、智能体是什么?

智能体,即Agent,是一种能自主规划,完成人类所指定的任务的AI工具

OpenAI应用研究主管翁丽莲(Lilian Weng)撰写过一篇blog: LLM Powered Autonomous Agents,将 Agents 定义为LLM + memory + planning skills + tool use,即大语言模型、记忆、任务规划、工具使用的集合。

其中,LLM是Agent的大脑,属于“中枢”模型,要求有以下3种能力:

  1. planning skills:对问题进行拆解得到解决路径,既进行任务规划
  2. tool use:评估自己所需的工具,进行工具选择,并生成调用工具请求
  3. memory:短期记忆包括工具的返回值,已经完成的推理路径;长期记忆包括可访问的外部长期存储,例如知识库

五、如何安装LangChain

LangChain支持Python和JavaScript两个开发版本,我们以Python版本为主。

安装方式LangChain的基本安装特别简单。前提是你已经配置好python或者Anaconda(推荐)

pip install langchain

这是安装 LangChain 的最低要求。这里要注意的是,LangChain 要与各种模型、数据存储库集成,比如说最重要的OpenAI的API接口,比如说开源大模型库HuggingFace Hub,再比如说对各种向量数据库的支持。默认情况下,是没有同时安装所需的依赖项。

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

pip install langchain[llms]

安装完成之后,还需要更新到 LangChain 的最新版本,这样才能使用较新的工具。

pip install --upgrade langchain

如果你想从源代码安装,可以克隆存储库并运行:

pip install -e

GitHub链接:langchain-ai/langchain: 🦜🔗 Build context-aware reasoning applications

课程中的LangChain的API文档有所变动:LangChain Python API Reference — 🦜🔗 LangChain documentation

OpenAI API

关于ChatGPT和GPT-4,网上有很多教程

如果你是小白,且想试试看gpt,可以看一下我写的教程:j1mbx7va0zr.feishu.cn/wiki/E8Duwd…

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

注册openai API ,我在这不过多阐述,调用大模型最重要的也是api

因为open ai 的ChatCompletion接口已经修改, 详情可以看官方文档Developer quickstart - OpenAI API

首先安装 openai

pip install openai

然后可以使用以下代码:

import openai

# 设置 API 密钥
openai.api_key = "your_openai_api_key"

def call_gpt(prompt, model="gpt-4"):
    try:
        response = openai.ChatCompletion.create(
            model=model,
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": prompt}
            ],
            max_tokens=100,  # 设置返回内容的最大长度
            temperature=0.7,  # 控制生成内容的随机性,值越高生成内容越随机
        )
        # 提取 GPT 的回复
        reply = response['choices'][0]['message']['content']
        return reply

    except Exception as e:
        print(f"Error calling GPT: {e}")
        return None

# 示例:调用 GPT
user_prompt = "请给我写一个Python的天气查询代码。"
gpt_response = call_gpt(user_prompt)
print("GPT的回答:", gpt_response)

说明:

  • model 参数设置为 "gpt-4",可以根据需求选择合适的模型。
  • temperature 参数控制回复的随机性,值越高生成内容越随机。
  • max_tokens 是 GPT 回复的最大长度,可根据需要调整。

更多的参数说明

image.png

两种不同的模型:聊天模型(Chat Model)和文本模型(Text Model)

在 OpenAI 的 API 中,**聊天模型(Chat Model)文本模型(Text Model)**是两种不同的模型接口,尽管它们的底层大多使用同样的 GPT 技术,但它们的工作方式和应用场景有所不同。我们可以从结构、输入输出、使用场景等几个方面来对比它们。

1. 聊天模型(Chat Model)
  • 结构

    • 聊天模型是专门设计用于多轮对话的。它引入了角色概念,每轮对话中可以指定角色,比如 "user"(用户)、"assistant"(助手)和 "system"(系统)。
    • 角色帮助模型理解不同信息的来源,使得模型可以更好地理解对话的上下文和用户意图。
  • 输入

    • 聊天模型的输入一般是一组消息,这些消息按顺序构成对话历史。例如:
      messages = [
          {"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "帮我写一个天气查询的代码。"}
      ]
      
    • 可以在对话过程中不断添加新的消息,让模型保留上下文。
  • 输出

    • 聊天模型的输出是助手的回答,它直接回应最后一条消息。聊天模型在回复时会参考之前的上下文。
  • 应用场景

    • 适用于需要多轮对话的场景,如客服助手、问答系统、智能聊天机器人。
    • 可以通过历史记录实现更加复杂的交互,因为它会根据多轮对话的上下文来生成更相关的回答。
  • 相关参数

image.png

2. 文本模型(Text Model)
  • 结构

    • 文本模型主要是生成或补全文本的一种模型,没有明确的角色分配。
    • 只需要一个连续的文本输入,可以是一个句子、段落或其他格式的提示,模型根据提示生成补全内容。
  • 输入

    • 文本模型的输入是单个字符串,如 "帮我写一个天气查询的代码。".
    • 它并不会自动保存上下文,而是将输入当作一个完整的文本块来处理。因此多轮对话需要手动拼接上下文。
  • 输出

    • 文本模型生成一段新文本,作为对输入的补全或直接生成的结果。
    • 不考虑对话历史,因此不会理解用户的连续提问或对话。
  • 应用场景

    • 适用于完成单一任务的场景,如文本生成、补全、文案写作、摘要生成、代码补全等。
    • 因为没有上下文的角色分配,也不适合用作需要多轮对话的应用。
  • 相关参数

image.png

3. 使用示例对比
  • 聊天模型调用示例

    import openai
    openai.api_key = "your_openai_api_key"
    
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "告诉我什么是聊天模型和文本模型的区别。"}
        ]
    )
    print(response['choices'][0]['message']['content'])
    
  • 文本模型调用示例

    import openai
    openai.api_key = "your_openai_api_key"
    
    prompt = "告诉我什么是聊天模型和文本模型的区别。"
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        max_tokens=100
    )
    print(response['choices'][0]['text'])
    
4. 选择依据
  • 如果需要上下文记忆、多轮互动的场景,聊天模型更合适。
  • 如果是单一指令生成文本结果,比如写作或简单补全,则文本模型更加适合。

总结来说,聊天模型适合对话和连续性任务,而文本模型更适合单轮的文本生成或补全任务。根据不同的应用需求,可以选择合适的模型来优化效果。

通过 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)

输出:

plain
复制代码
AI练中学
花之缘、芳华花店、花语心意、花风旖旎、芳草世界、芳色年华

这只是一个对OpenAI API的简单封装:先导入LangChain的OpenAI类,创建一个LLM(大语言模型)对象,指定使用的模型和一些生成参数。使用创建的LLM对象和消息列表调用OpenAI类的__call__方法,进行文本生成。生成的结果被存储在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变量中。

输出:

plain
复制代码
AI练中学
content='当然可以,叫做"花语秘境"怎么样?' 
additional_kwargs={} example=False

从响应内容“当然可以,叫做‘花语秘境’怎么样? ”不难看出,GPT-4的创造力真的是胜过GPT-3,她给了我们这么有意境的一个店名,比我自己起的“易速鲜花”好多了。

另外,无论是langchain.llms中的OpenAI(Text模型),还是langchain.chat_models中的ChatOpenAI中的ChatOpenAI(Chat模型),其返回的结果response变量的结构,都比直接调用OpenAI API来得简单一些。这是因为,LangChain已经对大语言模型的output进行了解析,只保留了响应中最重要的文字部分。

总结

open ai的模型会不断更新,但是LangChain的代码已经固定了,而且未来也会调用不同平台的模型,所以建议多去看看别的模型的调用方式,同时明白LangChain只是一个框架

更多文档

  1. LangChain官方文档(Python版)(JavaScript版),
  2. OpenAI API 官方文档,深入学习OpenAI API的地方。
  3. HuggingFace 官方网站,玩开源大模型的好地方。
  4. Kimi API - Moonshot AI 开放平台,kimi模型文档
  5. 讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞科大讯飞模型文档