大模型应用开发

大模型概述

大模型的能力

涌现能力:随着训练数据规模增大能力迅速提升,超过随机水平

  1. 上下文学习
  2. 指令微调:泛化能力很强,微调后可以在未见过的任务上表现良好
  3. 逐步推理:LLM有“思维链”推理机制,可以逐步推理解决复杂任务

大基座模型

借助于无标注数据训练,可以用于大量下游任务;多个应用可以依赖于极少的几个大模型统一建设

支持对话作为统一入口

可以对话交互

常见大模型

闭源模型

  1. GPT:OPENAI
    ** decoder-only**
    • 通过语言建模将世界知识压缩到仅解码器的 Transformer 模型中
    • CHATGPT目前知识更新到23年4月
    • GPT-4扩展到多模态信号。用红队评估来加强安全性,并使用了一个可预测扩展方式评估能力(用稍小的模型来评估GPT模型)
  2. Claude
    • 具有长上下文的能力,大概支持200K token
    • 最多支持生产4000个token
    • 更好地生成 JSON、XML、YAML、代码和 Markdown 格式的正确输出
  3. PaLM:GOOGLE
    • 开发了许多特定领域的微调版本模型
    • 混合了百种语言,能够学习到每种语言的细微差别
    • 最有缩放比例: 数据和模型大小大致按照 1:1 的比例缩放,可以达到最佳性能
  4. 文心一言
    • 基于飞桨框架进行训练
  5. 星火大模型
    • 比ChatGPT更懂中文

开源

  1. LLaMA:Meta

    • decoder-only
    • 仅使用公开可用的数据集来训练最先进的模型
    • 大规模的数据过滤和清洗技术,减少噪声和偏见
    • 一些改进:
      * Pre-normalization:对每个子层进行归一化,防止梯度爆炸和消失
      * SwiGLU 激活函数:增加网络的表达能力和非线性
      * RoPE 位置编码:在网络的每一层添加了位置编码
  2. GLM:Tsinghua

    • 支持2048的上下文长度(ChatGLM 3.2 万字符)
    • 支持中英文两种语言
    • 使用了INT4和P-Tuning微调算法,能够在7G显存条件下进行微调
    • 大模型应用开发_第1张图片
  3. 通义千问:阿里巴巴

    • 阿里产品体系以及广泛的应用场景使得通义千问更具可落地性和市场可接受程度。
  4. Baichuan:百川智能

    • 开源了预训练模型和对齐模型,预训练模型是面向开发者的“基座”,而对齐模型则面向广大需要对话功能的普通用户
    • Baichuan2-192K 大模型,上下文窗口长度高达 192 K

LangChain

  1. 目的:构建基于大型语言模型的端到端应用程序或工作流程。为各种大型语言模型应用提供通用接口,从而简化应用程序的开发流程。
  2. 核心板块:
    • 模型输入/输出(Model I/O):与语言模型交互的接口
    • 数据连接(Data connection):与特定应用程序的数据进行交互的接口
    • 链(Chains):将组件组合实现端到端应用。
    • 记忆(Memory):用于链的多次运行之间持久化应用程序状态;
    • 代理(Agents):扩展模型的推理能力。用于复杂的应用的调用序列;
    • 回调(Callbacks):扩展模型的推理能力。用于复杂的应用的调用序列

调用

Prompt/Completion

输入给LLM的文本或问题,接收到的输出是Completion

Temperature:0~1

  1. 用于控制LLM生成文本的随机性与创造性:接近0随机性低,接近1随机性高
  2. 基于不同应用场景需求来设置该参数

System Prompt

  1. 并不在训练时起作用,而是在使用的时候固定影响模型回复,且重要性较高
  2. 一般一个对话中仅有一个
{
    "system prompt":"你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
    "user prompt":"我今天有什么事务?"
}

大模型调用

百度文心一言

两层认证

首先需要获取密钥API Key、Secret Key,然后基于密钥获取access_token,利用access_token进行调用

使用Langchain进行调用

需要自定义一个LLM类

定义一个继承自 LLM 类的自定义 LLM 类:

GLM智谱AI+清华

参数说明

  1. prompt (list): 按照 {“role”: “user”, “content”: “你好”} 的键值对形式进行传参; 总长度超过模型最长输入限制后会自动截断,需按时间由旧到新排序。
  2. temperature (float): 采样温度,控制输出的随机性,必须为正数取值范围是:(0.0,1.0],值越小,输出会更加稳定。
  3. top_p (float): 用温度取样的另一种方法,称为核取样。例如:0.1 意味着模型解码器只考虑从前 10% 的概率的候选集中取 tokens。

调用智谱 AI Embedding API

官方的 SDK 返回的结果是字典的格式,可以直接传入键获得值。

基于Langchain封装智谱AI embedding

要实现自定义 Embeddings,需要定义一个自定义类继承自 LangChain 的 Embeddings 基类,然后定义三个函数:

  1. _embed 方法,其接受一个字符串,并返回一个存放 Embeddings 的 List[float],即模型的核心调用;
  2. embed_query 方法,用于对单个字符串(query)进行 embedding。
  3. embed_documents 方法,用于对字符串列表(documents)进行 embedding。
    按照教程来定义一个Embedding模型类继承自Langchain的base类在进行调用就好了

Langchain详解

I/O

用户原始输入与模型和示例进行组合,然后输入给大语言模型,再根据大语言模型的返回结果进行输出或者结构化处理。
大模型应用开发_第2张图片

数据连接

  • 大预言模型的知识来源于其训练数据集,因此缺乏很多最新知识和个性化专业知识
  • LangChain 数据连接(Data connection)模块通过以下方式提供组件来加载、转换、存储和查询数据
    大模型应用开发_第3张图片

  • 对于复杂的需求,可能需要将多个大型语言模型进行链式组合,或与其他组件进行链式调用
  • 链允许将多个组件组合在一起
import warnings
warnings.filterwarnings('ignore')

from langchain.chat_models import ChatOpenAI 
from langchain.prompts import ChatPromptTemplate  
from langchain.chains import LLMChain  

# 这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
# 如果你想要每次得到不一样的有新意的答案,可以尝试调整该参数。
llm = ChatOpenAI(temperature=0.0)  

#初始化提示模版
prompt = ChatPromptTemplate.from_template("描述制造{product}的一个公司的最佳名称是什么?")

#将大语言模型(LLM)和提示(Prompt)组合成链
chain = LLMChain(llm=llm, prompt=prompt)

#运行大语言模型链
product = "大号床单套装"
chain.run(product)

SequentialChain 是简单顺序链的更复杂形式,允许多个输入/输出。

记忆(Meomory)

  • LLM训练好之后参数固定,用户的输入不会影响大模型参数,因此模型输出完毕后,它便会“遗忘”之前用户的输入和它的输出
  • 为了使得模型“有记忆”,使用Memory组件大模型应用开发_第4张图片

Agent

语言模型仅依赖预训练数据,与外界“断开”。Agent可以使得它具备计算和获取外界知识的能力。
大模型应用开发_第5张图片

回调(Callback)

  1. 可以记录整个流程运行情况,例如Agent模块记录调用Tool的次数以及每次调用返回值
  2. CallbackHandler 用于记录每个应用场景(如 Agent、LLchain 或 Tool )的日志
  3. CallbackManager则封装和管理所有的 CallbackHandler

可以在构造函数或者请求中传入回调

大模型开发

要素

核心点不是对模型的优化,因为大部分是直接调用模型API来实现,因此更多是一个工程问题

核心要点

  1. Prompt Engineering替代子模型的训练调优:用一个通用大模型 + 若干业务 Prompt 来解决任务
  2. 通用架构:特定数据库+ Prompt + 通用大模型(基于langchain)

重要流程:

  1. 搭建整体架构:模型、输入输出
  2. 搭建数据库:将非结构化数据以向量形式存储
  3. prompt engneering
  4. 验证迭代
  5. 搭建前后端

本项目原理

项目流程:

本地文档 -> 读取文本 -> 文本分割 -> 文本向量化(向量化的文本及其索引会存入数据库) -> question向量化 -> 在文本向量中匹配出与问句向量最相似的 top k个 -> 匹配出的文本作为上下文和问题一起添加到 prompt中 -> 提交给 LLM生成回答。

核心技术

包括 LLM API 调用、向量数据库、检索问答链

最终代码结构

-project
    -readme.md 项目说明
    -requirements.txt 使用依赖包的版本 
    -llm LLM调用封装
        -self_llm.py 自定义 LLM 基类
        -wenxin_llm.py 自定义百度文心 LLM
        -spark_llm.py 自定义讯飞星火 LLM
        -zhipuai_llm.py 自定义智谱AI LLM
        -call_llm.py 将各个 LLM 的原生接口封装在一起
        -test.ipynb 使用示例
    -embedding embedding调用封装
        -zhipuai_embedding.py 自定义智谱AI embedding
        -call_embedding.py 调用 embedding 模型 
    -data 源数据路径
    -database 数据库层封装
        -create_db.py 处理源数据及初始化数据库封装
    -qa_chain 应用层封装
        -qa_chain.py 封装检索问答链,返回一个检索问答链对象
        -chat_qa_chian.py:封装对话检索链,返回一个带有历史记录的对话检索链对象
        -get_vectordb.py 返回向量数据库对象
        -model_to_llm.py 调用模型
        -test.ipynb 使用示例
    -serve 服务层封装
        -run_gradio.py 启动 Gradio 界面
        -api.py 封装 FastAPI
        -run_api.sh 启动 API
        -test.ipynb 使用示例

项目层级

  • LLM层:将不同API进行封装,隐藏API调用差异
  • 数据层:包括个人知识库的源数据和embedding
  • 数据库层:存放向量数据库文件
  • 应用层:基于LangChain的检索问答链,有历史记录或者无历史记录
  • 服务层:通过 Gradio 搭建前端界面与 FastAPI 进行封装,支持多样化的项目调用。

你可能感兴趣的:(人工智能,chatgpt)