【动手学大模型】第三章 大模型开发流程及架构

大模型开发整体流程

开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发

开发大模型相关应用,不需要实现大语言模型,而是通过调用API或开源模型来实现核心的理解与生成,通过prompt Enginnering来实现大语言模型的控制。
在这里插入图片描述
将大模型作为一个调用工具,通过 Prompt Engineering、数据工程、业务逻辑分解等手段来充分发挥大模型能力。

大语言模型的两个核心能力:指令理解 与 文本生成 提供了复杂业务逻辑的简单平替方案。在传统的 AI 开发中,我们首先需要将非常复杂的业务逻辑依次拆解,对于每一个子业务构造训练数据与验证数据,对于每一个子业务训练优化模型,最后形成完整的模型链路来解决整个业务逻辑。然而,在大模型开发中,我们将尝试用 Prompt Engineering 来替代子模型的训练调优,通过 Prompt 链路组合来实现业务逻辑,用一个通用大模型 + 若干业务 Prompt 来解决任务,从而将传统的模型训练调优转变成了更简单、轻松、低成本的 Prompt 设计调优。

由于不再需要训练子模型,我们不再构造训练集,而是直接从实际业务需求出发构造小批量验证集,设计合理 Prompt 来满足验证集效果。然后,我们将不断从业务逻辑中收集当下 Prompt 的 Bad Case,并将 Bad Case 加入到验证集中,针对性优化 Prompt,最后实现较好的泛化效果。
在这里插入图片描述

大模型开发的整体流程

  1. 确定目标
  2. 设计功能
    首先要确定应用的核心功能,然后延展设计核心功能的上下游功能
    例如,我们想打造一款个人知识库助手,那么核心功能就是结合个人知识库内容进行问题的回答,那么其上游功能的用户上传知识库、下游功能的用户手动纠正模型回答就是我们也必须要设计实现的子功能。
  3. 搭建整体架构
    绝大部分大模型应用都是采用的特定数据库+ Prompt + 通用大模型的架构。
    一般来说,我们推荐基于 LangChain 框架进行开发。LangChain 提供了 Chain、Tool 等架构的实现,我们可以基于 LangChain 进行个性化定制,实现从用户输入到数据库再到大模型最后输出的整体架构连接。
  4. 搭建数据库
    由于大模型应用需要进行向量语义检索,一般使用诸如 chroma 的向量数据库。在该步骤中,我们需要收集数据并进行预处理,再向量化存储到数据库中。数据预处理一般包括从多种格式向纯文本的转化,例如 pdf、markdown、html、音视频等,以及对错误数据、异常数据、脏数据进行清洗。完成预处理后,需要进行切片、向量化构建出个性化数据库。
  5. Prompt Engineering
    首先应该明确 Prompt 设计的一般原则及技巧,构建出一个来源于实际业务的小型验证集,基于小型验证集设计满足基本要求、具备基本能力的 Prompt。
  6. 验证迭代
  7. 前后端搭建
  8. 体验优化

搭建个人知识库助手

功能

  • 上传文档,创建知识库
  • 选择知识库,检索用户提问的知识片段
  • 提供知识片段与提问,获取大模型回答
  • 流式回复:允许用户进行多轮对话
  • 历史对话记录

实现原理

在这里插入图片描述
加载本地文档,读取文本,文本分割,文本向量化,question向量化,在文本向量中匹配出与问句向量最相似的top k个,匹配出的文本作为上下文和问题一起添加到prompt中,提交给llm生成回答。

流程

  1. 收集和整理用户提供的文档。
    用户常用文档格式有 pdf、txt、doc 等,首先使用工具读取文本,通常使用 langchain 的文档加载器模块可以方便的将用户提供的文档加载进来,也可以使用一些 python 比较成熟的包进行读取。

由于目前大模型使用 token 的限制,我们需要对读取的文本进行切分,将较长的文本切分为较小的文本,这时一段文本就是一个单位的知识。

  1. 将文档词向量化
    使用文本嵌入(Embeddings)对分割后的文档进行向量化,使语义相似的文本片段具有接近的向量表示。然后,存入向量数据库,这个流程正是创建索引(index) 的过程。

向量数据库对各文档片段进行索引,支持快速检索。这样,当用户提出问题时,可以先将问题转换为向量,在数据库中快速找到语义最相关的文档片段。然后将这些文档片段与问题一起传递给语言模型,生成回答

  1. 将向量化后的文档导入Chroma知识库,建立知识库索引。
    Langchain 集成了超过 30 个不同的向量存储库。我们选择 Chroma 向量库是因为它轻量级且数据存储在内存中,这使得它非常容易启动和开始使用。

将用户知识库内容经过 embedding 存入向量知识库,然后用户每一次提问也会经过 embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 prompt 提交给 LLM 回答。

项目架构

在这里插入图片描述
代码结构如下:

-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层

LLM层封装不同LLM API,隐藏调用的差异,实现在同一个对象或函数中通过不同的model参数来使用不同来源的LLM

首先构造一个self_LLM基类,定义了所有API的一些共同参数(API_key、temperature)
然后在基类基础上继承实现上述四种LLM API的自定义LLM。
同时也将四种LLM的原生API封装在统一的get_completion函数中。

数据层

包括个人知识库的源数据和Embedding对象
源数据需要经过Embedding处理进入向量数据库,我们在数据层自定义了智谱提供的Embedding API的封装,支持上层以统一方式调用智谱Embedding

数据库层

数据库层主要存放了向量数据库文件。
在这一层实现源数据处理、创建向量数据库的方法

应用层

基于langchain提供的检索问答链,在llm层,数据库层的基础上,实现本项目检索问答链的封装。自定义的检索问答链除具备基本的检索问答功能外,也支持通过model参数来灵活切换使用的llm。

服务层

基于应用层的核心功能封装,实现了demo的搭建或者API的封装。
在本项目中,我们分别实现了通过 Gradio 搭建前端界面与 FastAPI 进行封装,支持多样化的项目调用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值