熊熊出没 发表于 2024-7-22 19:07:18

datawhale开源项目:动手学大模子应用开发第二三次打卡调用大模子API大模子

一、基本概念

1. Prompt

Prompt 最初是 NLP(自然语言处理)研究者为下游任务设计出来的一种任务专属的输入模板,类似于一种任务(例如:分类,聚类等)会对应一种 Prompt。在 ChatGPT 推出并得到大量应用之后,Prompt 开始被推广为给大模子的所有输入。即,我们每一次访问大模子的输入为一个 Prompt,而大模子给我们的返回结果则被称为 Completion。
例如,在下面示例中,我们给 ChatGPT 的提问 “NLP 中的 Prompt 指什么”是我们的提问,实在也就是我们此次的 Prompt;而 ChatGPT 的返回结果就是此次的 Completion。也就是对于 ChatGPT 模子,该 Prompt 对应的 Completion 是下图的展示。
https://img-blog.csdnimg.cn/ae66fe1b1a2a4933bcba803ccee98986.png
后续我们都将会使用 Prompt 替代给 LLM 的输入,使用 Completion 替代 LLM 的输出。同时,我们会结合具体案例,先容怎样设计 Prompt 可以或许充实发挥 LLM 的能力。
2. Temprature

LLM 天生是具有随机性的,在模子的顶层通过选取差别猜测概率的猜测结果来天生最后的结果。我们一般可以通过控制 Temprature 参数来控制 LLM 天生结果的随机性与创造性。
Temprature 一般取值在 0~1 之间,当取值较低靠近0时,猜测的随机性会较低,产生更守旧、可猜测的文本,不太可能天交易想不到或不寻常的词。当取值较高靠近1时,猜测的随机性会较高,所有词被选择的可能性更大,会产生更有创意、多样化的文本,更有可能天生不寻常或意想不到的词。
3. System Prompt

System Prompt 是随着 ChatGPT API 开放并徐徐得到大量使用的一个新兴概念,事实上,它并不在大模子本身训练中得到体现,而是大模子服务方为提拔用户体验所设置的一种策略。
具体来说,在使用 ChatGPT API 时,你可以设置两种 Prompt:一种是 System Prompt,该种 Prompt 内容会在整个会话过程中持久地影响模子的复兴,且相比于普通 Prompt 具有更高的重要性;另一种是 User Prompt,这更方向于咱们平常的 Prompt,即必要模子做出复兴的输入。
我们一般设置 System Prompt 来对模子进行一些初始化设定,例如,我们可以在 System Prompt 中给模子设定我们盼望它具备的人设如一个个人知识库助手等。System Prompt 一般在一个会话中仅有一个。在通过 System Prompt 设定好模子的人设或是初始设置后,我们可以通过 User Prompt 给出模子必要遵循的指令。
二、调用 ChatGPT

1. API是什么

API 即应用步伐接口(API:Application Program Interface),应用步伐接口是一组界说、步伐及协议的聚集,通过 API 接口实现盘算机软件之间的相互通讯。
根据差别软件应用步伐间的数据共享性能,可以将 API 分为四种范例:
远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实现步伐间的通讯。
标准查询语言(SQL):是标准的访问数据的查询语言,通过数据库实现应用步伐间的数据共享。
文件传输:文件传输通过发送格式化文件实现应用步伐间数据共享。
信息交付:指松耦合或紧耦合应用步伐间的小型格式化信息,通过步伐间的直接通讯实现数据共享。
2. 大模子API是什么

大模子API是一种应用步伐编程接口,它提供了一种方式,使得开发者可以更方便地使用大模子。大模子API是一种合约,它界说了开发者和服务提供商之间的交互方式。
例如,智谱AI提供了一个大模子API,叫做MaaS服务,也就是Model as Service。这个API可以让开发者在本身的应用中使用智谱AI的大模子。
3. 大模子API和githubAPI的区别

大模子API和githubAPI的重要区别在于它们的功能和使用场景。大模子API,如智谱AI的MaaS服务,答应开发者在本身的应用中使用大模子,这在实现一些复杂功能,如智能保举、主动翻译等方面具有优势。另一方面,githubAPI则是一种用于与GitHub仓库进行交互的API,重要用于管理代码库、处理问题和拉取请求等,重要被软件开发者使用。
GitHub上也有一些开源项目,如one-api,它支持包罗OpenAI ChatGPT系列模子在内的多种大模子。可以访问该项目页面查看详细信息并获取使用方法。在选择和使用这些服务时,请确保明白其定价模式和服务条款。
4.获取文心一言调用秘钥

4.1方法一:python代码

要调用文心一言 API,必要先获取文心一言调用秘钥,在代码中必要设置本身的秘钥才能实现对模子的调用。
百度文心有两层秘钥认证,第一层是拥有调用权限的账户可以从账户中获取的 API_Key 和 Secret_Key,每一个账户可以创建多少个应用,每个应用会对应一个 API_Key 和 Secret_Key。
在获取完成 API_Key 和 Secret_Key 后,还必要基于这两个 Key 去获取 access_token 值。access_token 是第二层认证,基于 access_token 即可调用百度文心大模子,而 access_token 是可以控制基于时间或流量过期的。通过上述两层秘钥认证,可以进一步进步企业服务的安全性。
https://img-blog.csdnimg.cn/1d911031170d44cb92dfb40654803be7.png#pic_center
起首我们必要进入文心千帆服务平台,点击上述应用接入按钮,创建一个调用文心大模子的应用。
https://img-blog.csdnimg.cn/e79f8d819ee34281b8eb0c0d51646f8f.png#pic_center
留意,你必要起首有一个经过实名认证的百度账号。
接着点击“去创建”按钮,进入应用创建界面:
https://img-blog.csdnimg.cn/0453a449e93a4bc9b60c2e179ba62925.png#pic_center
简单输入基本信息,选择默认设置,创建应用即可。
https://img-blog.csdnimg.cn/c4eaa9a2698946489adff34ed0cf3b51.png#pic_center
创建完成后,我们可以在控制台看到创建的应用的 AppID、API Key、Secret Key。使用这里的 API Key 和 Secret Key 即可进行 access_token 的获取。
https://img-blog.csdnimg.cn/cb9e8906bc5b4bfb846afb9d1e9e43f4.png#pic_center
access_token 必要通过代码 post 访问指定网址得到:
import requests
import json

def get_access_token():
    """
    使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
    """
    # 指定网址
    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={api_key}&client_secret={secret_key}"
    # 设置 POST 访问
    payload = json.dumps("")
    headers = {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    }
    # 通过 POST 访问获取账户对应的 access_token
    response = requests.request("POST", url, headers=headers, data=payload)
    return response.json().get("access_token")
不要忘记加函数调用并输出
# 调用函数获取 access_token
access_token = get_access_token()
print("Access Token:", access_token)
通过上述代码,即可获取到账户对应的 access_token,后续使用 access_token 即可调用百度文心大模子。
4.2方法二:欣赏器直输

前面步调和方法一一样,在欣赏器中输入下面的代码。
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=&client_secret=
将和更换本钱身之前获取的,留意:更换后访问链接中不包罗[]。
结果:我们必要关心的是这两个键值对, expires_in 与 access_token
expires_in:Access Token的有效期(秒为单位,默认有效期30天)
access_token:要获取的Access Token。
上述方法参考链接: https://blog.csdn.net/qq_30299877/article/details/131917097
三、大模子开发整体流程

1. 作甚大模子开发

我们将开发以大语言模子为功能核心、通过大语言模子的强盛明白能力和天生能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模子开发。开发大模子相关应用,其技术核心点固然在大语言模子上,但一般通过调用 API 或开源模子来实现核心的明白与天生,通过 Prompt Enginnering 来实现大语言模子的控制,因此,固然大模子是深度学习领域的集大成之作,大模子开发却更多是一个工程问题。
在大模子开发中,我们一般不会去大幅度改动模子,而是将大模子作为一个调用工具,通过 Prompt Engineering、数据工程、业务逻辑分解等本事来充实发挥大模子能力,适配应用任务,而不会将精力聚焦在优化模子本身上。因此,作为大模子开发的初学者,我们并不必要深研大模子内部原理,而更必要掌握使用大模子的实践技巧。
同时,以调用、发挥大模子为核心的大模子开发与传统的 AI 开发在整体思绪上有着较大的差别。大语言模子的两个核心能力:指令明白 与 文本天生 提供了复杂业务逻辑的简单平替方案。在传统的 AI 开发中,我们起首必要将非常复杂的业务逻辑依次拆解,对于每一个子业务构造训练数据与验证数据,对于每一个子业务训练优化模子,最后形成完整的模子链路来解决整个业务逻辑。然而,在大模子开发中,我们将实验用 Prompt Engineering 来替代子模子的训练调优,通过 Prompt 链路组合来实现业务逻辑,用一个通用大模子 + 多少业务 Prompt 来解决任务,从而将传统的模子训练调优转变成了更简单、轻松、低本钱的 Prompt 设计调优。
同时,在评估思绪上,大模子开发与传统 AI 开发也有了质的差别。传统 AI 开发必要起首构造训练集、测试集、验证集,通过在训练集上训练模子、在测试集上调优模子、在验证集上最终验证模子效果来实现性能的评估。然而,大模子开发更敏捷、机动,我们一般不会在初期显式地确定训练集、验证集,由于不再必要训练子模子,我们不再构造训练集,而是直接从实际业务需求出发构造小批量验证集,设计合理 Prompt 来满意验证集效果。然后,我们将不断从业务逻辑中收集当下 Prompt 的 Bad Case,并将 Bad Case 参加到验证集中,针对性优化 Prompt,最后实现较好的泛化效果。
2. 大模子开发的整体流程

结合上述分析,我们一般可以将大模子开发分解为以下几个流程:
确定目的。在进行开发前,我们起首必要确定开发的目的,即要开发的应用的应用场景、目的人群、核心价值。对于个体开发者或小型开发团队而言,一般应先设定最小化目的,从构建一个 mvp(最小可行性产品)开始,徐徐进行完善和优化。
设计功能。在确定开发目的后,必要设计本应用所要提供的功能,以及每一个功能的大要实现逻辑。固然我们通过使用大模子来简化了业务逻辑的拆解,但是越清晰、深入的业务逻辑明白往往也能带来更好的 Prompt 效果。同样,对于个体开发者或小型开发团队来说,起首要确定应用的核心功能,然后延展设计核心功能的上下游功能;例如,我们想打造一款个人知识库助手,那么核心功能就是结合个人知识库内容进行问题的答复,那么其上游功能的用户上传知识库、下游功能的用户手动纠正模子答复就是我们也必须要设计实现的子功能。
搭建整体架构。目前,绝大部门大模子应用都是接纳的特定数据库+ Prompt + 通用大模子的架构。我们必要针对我们所设计的功能,搭建项目的整体架构,实现从用户输入到应用输出的全流程贯通。一般来说,我们保举基于 LangChain 框架进行开发。LangChain 提供了 Chain、Tool 等架构的实现,我们可以基于 LangChain 进行个性化定制,实现从用户输入到数据库再到大模子最后输出的整体架构连接。
搭建数据库。个性化大模子应用必要有个性化数据库进行支撑。由于大模子应用必要进行向量语义检索,一般使用诸如 chroma 的向量数据库。在该步调中,我们必要收集数据并进行预处理,再向量化存储到数据库中。数据预处理一般包罗从多种格式向纯文本的转化,例如 pdf、markdown、html、音视频等,以及对错误数据、异常数据、脏数据进行洗濯。完成预处理后,必要进行切片、向量化构建出个性化数据库。
Prompt Engineering。优质的 Prompt 对大模子能力具有极大影响,我们必要徐徐迭代构建优质的 Prompt Engineering 来提拔应用性能。在该步中,我们起首应该明确 Prompt 设计的一般原则及技巧,构建出一个泉源于实际业务的小型验证集,基于小型验证集设计满意基本要求、具备基本能力的 Prompt。
验证迭代*。验证迭代在大模子开发中是极其重要的一步,一般指通过不断发现 Bad Case 并针对性改进 Prompt Engineering 来提拔系统效果、应对边界环境。在完成上一步的初始化 Prompt 设计后,我们应该进行实际业务测试,探究边界环境,找到 Bad Case,并针对性分析 Prompt 存在的问题,从而不断迭代优化,直到达到一个较为稳定、可以基本实现目的的 Prompt 版本。
前后端搭建。完成 Prompt Engineering 及其迭代优化之后,我们就完成了应用的核心功能,可以充实发挥大语言模子的强盛能力。接下来我们必要搭建前后端,设计产品页面,让我们的应用可以或许上线成为产品。前后端开发是非常经典且成熟的领域,此处就不再赘述,我们将重要先容两种快速开发 Demo 的框架:Gradio 和 Streamlit,可以帮助个体开发者迅速搭建可视化页面实现 Demo 上线。
体验优化。在完成前后端搭建之后,应用就可以上线体验了。接下来就必要进行恒久的用户体验跟踪,记录 Bad Case 与用户负反馈,再针对性进行优化即可。
四、项目流程简析

步调一:项目规划与需求分析

1.项目目的:基于个人知识库的问答助手

2.核心功能:

上传文档、创建知识库;
选择知识库,检索用户提问的知识片段;
提供知识片段与提问,获取大模子答复;
流式复兴;
汗青对话记录
3.确定技术架构和工具

LangChain框架
Chroma知识库
大模子使用 GPT、科大讯飞的星火大模子、文心一言、GLM 等
前后端使用 Gradio 和 Streamlit。
步调二:数据准备与向量知识库构建

过程包罗加载本地文档 -> 读取文本 -> 文本分割 -> 文本向量化 -> question向量化 -> 在文本向量中匹配出与问句向量最相似的 top k个 -> 匹配出的文本作为上下文和问题一起添加到 prompt中 -> 提交给 LLM天生答复。
1. 收集和整理用户提供的文档。

用户常用文档格式有 pdf、txt、doc 等,起首使用工具读取文本,通常使用 langchain 的文档加载器模块可以方便的将用户提供的文档加载进来,也可以使用一些 python 比力成熟的包进行读取。
由于目前大模子使用 token 的限制,我们必要对读取的文本进行切分,将较长的文本切分为较小的文本,这时一段文本就是一个单位的知识。
2. 将文档词向量化

使用文本嵌入(Embeddings)对分割后的文档进行向量化,使语义相似的文本片段具有靠近的向量表示。然后,存入向量数据库,这个流程正是创建 索引(index) 的过程。
向量数据库对各文档片段进行索引,支持快速检索。如许,当用户提出问题时,可以先将问题转换为向量,在数据库中快速找到语义最相关的文档片段。然后将这些文档片段与问题一起转达给语言模子,天生答复。
3. 将向量化后的文档导入Chroma知识库,创建知识库索引。

Langchain 集成了凌驾 30 个差别的向量存储库。我们选择 Chroma 向量库是因为它轻量级且数据存储在内存中,这使得它非常容易启动和开始使用。
将用户知识库内容经过 embedding 存入向量知识库,然后用户每一次提问也会经过 embedding,使用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 prompt 提交给 LLM 答复。
步调三:大模子集成与API连接

集成GPT、星火、文心、GLM 等大模子,设置 API 连接。
编写代码,实现与大模子 API 的交互,以便获取问题答案。
步调四:核心功能实现

构建 Prompt Engineering,实现大模子答复功能,根据用户提问和知识库内容天生答复。
实现流式复兴,答应用户进行多轮对话。
添加汗青对话记录功能,保存用户与助手的交互汗青。
步调五:核心功能迭代优化

进行验证评估,收集 Bad Case。
根据 Bad Case 迭代优化核心功能实现。
步调六:前端与用户交互界面开发

使用 Gradio 和 Streamlit 搭建前端界面。
实现用户上传文档、创建知识库的功能。
设计用户界面,包罗问题输入、知识库选择、汗青记录展示等。
步调七:摆设测试与上线

摆设问答助手到服务器或云平台,确保可在互联网上访问。
进行生产环境测试,确保系统稳定。
上线并向用户发布。
步调八:维护与持续改进

监测系统性能和用户反馈,实时处理问题。
定期更新知识库,添加新的文档和信息。
收集用户需求,进行系统改进和功能扩展。
整个流程将确保项目从规划、开发、测试到上线和维护都可以或许顺利进行,为用户提供高质量的基于个人知识库的问答助手。
五、项目架构简析

1. 整体架构

经过上文分析,本项目为搭建一个基于大模子的个人知识库助手,基于 LangChain 框架搭建,核心技术包罗 LLM API 调用、向量数据库、检索问答链等。项目整体架构如下:
如上,本项目从底向上依次分为 LLM 层、数据层、数据库层、应用层与服务层:
① LLM 层重要基于四种盛行 LLM API 进行了 LLM 调用封装,支持用户以同一的入口、方式来访问差别的模子,支持随时进行模子的切换;
② 数据层 重要包罗个人知识库的源数据以及 Embedding API,源数据经过 Embedding 处理可以被向量数据库使用;
③ 数据库层 重要为基于个人知识库源数据搭建的向量数据库,在本项目中我们选择了 Chroma;
④ 应用层 为核心功能的最顶层封装,我们基于 LangChain 提供的检索问答链基类进行了进一步封装,从而支持差别模子切换以及便捷实现基于数据库的检索问答;
⑤ 最顶层为服务层,我们分别实现了 Gradio 搭建 Demo 与 FastAPI 组建 API 两种方式来支持本项目的服务访问。
2. 代码结构

-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 使用示例

3. 项目逻辑

用户:可以通过 run_gradio 或者 run_api 启动整个服务;
服务层调用 qa_chain.py 或 chat_qa_chain 实例化对话检索链对象,实现全部核心功能;
服务层和应用层都可以调用、切换 prompt_template.py 中的 prompt 模板来实现 prompt 的迭代;
也可以直接调用 call_llm 中的 get_completion 函数来实现不使用数据库的 LLM;
应用层调用已存在的数据库和 llm 中的自界说 LLM 来构建检索链;
假如数据库不存在,应用层调用 create_db.py 创建数据库,该脚本可以使用 openai embedding 也可以使用 embedding.py 中的自界说 embedding。
4. 各层简析

4.1 LLM 层

LLM 层重要功能为将国表里四种知名 LLM API(OpenAI-ChatGPT、百度文心、讯飞星火、智谱GLM)进行封装,隐蔽差别 API 的调用差别,实现在同一个对象或函数中通过差别的 model 参数来使用差别泉源的 LLM。
在 LLM 层,我们起首构建了一个 Self_LLM 基类,基类界说了所有 API 的一些共同参数(如 API_Key,temperature 等);然后我们在该基类根本上继承实现了上述四种 LLM API 的自界说 LLM。同时,我们也将四种 LLM 的原生 API 封装在了同一的 get_completion 函数中。
4.2 数据层

数据层重要包罗个人知识库的源数据(包罗 pdf、txt、md 等)和 Embedding 对象。源数据必要经过 Embedding 处理才能进入向量数据库,我们在数据层自界说了智谱提供的 Embedding API 的封装,支持上层以同一方式调用智谱 Embedding 或 OpenAI Embedding。
4.3 数据库层

数据库层重要存放了向量数据库文件。同时,我们在该层实现了源数据处理、创建向量数据库的方法。
4.4 应用层

应用层封装了整个项目的全部核心功能。我们基于 LangChain 提供的检索问答链,在 LLM 层、数据库层的根本上,实现了本项目检索问答链的封装。自界说的检索问答链除具备基本的检索问答功能外,也支持通过 model 参数来机动切换使用的 LLM。我们实现了两个检索问答链,分别是有汗青记录的 Chat_QA_Chain 和没有汗青记录的 QA_Chain。
4.5 服务层

服务层重要是基于应用层的核心功能封装,实现了 Demo 的搭建或 API 的封装。在本项目中,我们分别实现了通过 Gradio 搭建前端界面与 FastAPI 进行封装,支持多样化的项目调用。
链接: 以上内容皆来自datawhale

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: datawhale开源项目:动手学大模子应用开发第二三次打卡调用大模子API大模子