深入剖析开源大模型+Langchain框架,智能问答系统性能下降原因

news2024/11/13 12:59:15

大模型(LLM)相关理论研究与工程实践随着 GPT3 的发布,在学术界、工业界大爆发,备受各行各业关注,并涌现出一些赋能行业、促进生产力、生产关系变革的实践。GPT3 [1] 以及斯坦福计算机学院近 100+ 教授联名论文 [2] 将大模型列为第三轮 AI 浪潮,相对于传统的机器学习与深度学习,以 GPT3 为例的大模型涌现出处理各类任务的新范式:zero-shot、few-shot、in-context 等,同时也支持深度学习领域的 finetune,新范式让大模型能够低成本、快速处理各种任务,极大的缩短了数据准备与工程开发流程。

其中,in-context 作为随着大模型涌现的范式,被大规模的应用到各种知识库问答、资料汇总等领域中,开源社区对 in-context 也非常活跃地响应,推出了 langchain [3]、向量数据库 [4] 等系列优秀框架与技术基座。

但是,基于 langchain + 开源大模型在实践过程中也会遇到系列不尽人意的问题,本文将深入剖析 langchain + 开源大模型用于搭建基于公司语料库(iwiki、oncall、码客)上的缺陷,剖析利用开源方案进行实践过程中性能下降的根本原因。

喜欢本文,记得收藏、关注、点赞。

文章目录

    • 通俗易懂讲解大模型系列
      • 常规方案
        • 架构
        • 数据服务
        • 在线 QA 服务
        • 大模型
        • 串联
      • openAI 与开源 LLM
      • 总结

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

  • 用通俗易懂的方式讲解:一文讲清大模型 RAG 技术全流程

  • 用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

  • 用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:结合检索和重排序模型,改善大模型 RAG 效果明显

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:ChatGLM3-6B 功能原理解析

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:一个强大的 LLM 微调工具 LLaMA Factory

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:LangChain Agent 原理解析

  • 用通俗易懂的方式讲解:HugggingFace 推理 API、推理端点和推理空间使用详解

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:使用 FastChat 部署 LLM 的体验太爽了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:使用 Docker 部署大模型的训练环境

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:LangChain 知识库检索常见问题及解决方案

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:代码大模型盘点及优劣分析

  • 用通俗易懂的方式讲解:Prompt 提示词在开发中的使用

  • 用通俗易懂的方式讲解:万字长文带你入门大模型

  • 用通俗易懂的方式讲解:保姆级 Stable Diffusion 部署教程

常规方案

架构

图片

图1 基于 langchain + LLM 做知识问答的常规方案

基于 langchain + 大模型 in-context 能力来搭建智能问答系统的常规方案如上图所示,包含 3 个核心模块:数据服务,在线 QA 服务,以及大模型。下面分别详细说明一下各个模块具体做些什么?他们是如何串联在一起完成整个问答任务的?再反过来看看为什么业界基于 openAI 实践很棒,而如果换成基于开源自研后性能下滑很多?

数据服务

数据对方案的性能影响极其重要,高质量的数据对模型的提升非常显著;但数据处理是一个 caseBycase、包含很多经验与 tricks 的事情,例如文档中的截图、表格、公式、超链接、附件、架构图、流程图、代码片段等等,本文不予以展开分析。

做数据最需要关注的是模型的输入及格式。做知识问答系统本质是自然语言处理的一个任务,因此,数据形态必须是文本,这是最基本的原则,所以如果数据包含非文本类的形态,例如图片(iwiki、码客、oncall 存在大量截图),就需要处理一下,每个人的处理方式和策略不一样,处理得好,最终系统性能会表现好一些。数据服务包含 3 个步骤,格式化(format)、切割(split)、向量化(vectorize)。

  • 格式化。 解析不同源数据(csv、pdf、json、html、markdown、txt 等)到统一格式,并进行预处理与过滤

为什么以及如何进行预处理与过滤?

参考所选 LLM 在训练/ instruction finetune 处理数据方式(去掉特殊字符、换行空格等)同步处理数据。这么做的原因是 LLM in-context 应该和 训练/instruction finetune 的数据处理方式保持一致,可以保证 in-context 效果达到最佳。所以格式化的第二步,和选用的 LLM 相关。

  • 切割(split)。 将格式化的长字符串按照一定策略切分为若干个切片(chunk)。

为什么要进行切割?

看到上述框架图绝大多数人应该有的一个疑问。如果深入思考的话会发现 embedding(text2vec,文本转化为向量)以及 LLM encoder 对输入 tokens 都有限制。embedding 会将一个 text(长字符串)的语义信息压缩成一个向量,这是他的能力,但我们需要重点关注他的局限性,其中之一就是 text 包含的 tokens 有限制,一段话压缩成一个向量是 ok,但一本书压缩成一个向量可能就丢失了绝大多数语义。LLM encoder tokens 的限制在模型结构(利用 next token 进行 pre train)是就定义了,后续也无法更改,而 in-context 本质是把语料注入到 prompt,整个 prompt 不能超过 LLM 的 tokens 限制, 汇总如下公式:

图片

为了确保格式化的语料能够满足上述约束,因此需要切割原始语料。

如何切割?

通常采用固定长度切割(满足上面公式约束下),但固定长度切割容易破坏自然段落的语义,因此需要在上面公式约束与段落语义保留双重约束下,灵活设计方案,切割后的语料片段称为 chunk。

  • 向量化与存储。

为什么进行向量化?

NLP 领域近 10 年来最朴素最广泛应用的一个技术 embedding 就是将 text 的语义信息转为向量表达,从而基于此向量来处理 NLP 领域中的一系列任务,例如通过向量相似性来衡量两句话语义是否一致等。

向量化的评价指标有哪些?

Huggingface 有一个 embedding 的 benchmark,如链接: https://huggingface.co/spaces/mteb/leaderboard 。

图片

图2 huggingface embedding 综合能力排序

业界通常用 embedding 所得向量长度及其在各 NLP 子任务上的准确率来评估 embedding 模型。原则上:embedding 所得向量长度越长越好,过长的向量也会造成 embedding 模型在训练中越难收敛。分类(Classification)、聚合 (Clustering)、语义相似 (Pair Classification)、排序(Reranking)和召回(Retrieval)等子任务常用来评估 embedding 模型的优劣,准确率越高,embedding 的性能越好。

向量如何存储与检索?

向量的存储与检索是一门特别复杂的课题,涉及向量检索(包含很多相似性度量算法,向量压缩等知识)和向量存储,当前火热的向量数据库方向就是因此而生,在规模不大的情况下用 faiss 做检索够用了,未来有机会将专题就这个点开展分析,这里不予以赘述**。**

在线 QA 服务

在线 QA 服务是串联大模型与存储向量数据库之间的纽带,大模型不能将数据库所有数据拿去做 in-context,实际上,大模型 in-context 能包含的 chunks 十分有限,在线QA服务核心就是挑选出合适的 chunks 给大模型。在线 QA 服务通过企微、webapi等方式对外提供交互,包含 3 个核心功能模块:用户问题向量化、prompt 组装、筛选 chunks。其中,在线 QA 服务核心在于筛选 chunks,这一步对整体性能至关重要。

  • 用户问题向量化。

同数据服务 chunks 向量化一样,采用同一个 embedding 模型对用户问题进行向量化。

  • prompt 组装。

将用户问题,筛选出的 chunks 组装成 prompt,prompt 即为大模型的输入,整个 prompt 不超过大模型输入 tokens 长度的限制,以 openAI gpt-3.5-turbo 为例,输入 tokens 限制为 4096,假设每个 chunks 固定长度为400,不考虑 prompt 不变字符串的长度,gpt-3.5-turbo 最多可以放 10 个 chunks 进行 in-context 学习。

  • 筛选 chunks。

在用户问题与 chunks 经同一 embedding 模型将 text 转为向量:

图片

(M 是 chunks 的总数量),langchain 给的方案是通过计算之间:

图片

的相似度(cos、BM25、knn、欧氏距离等)并倒排来决定哪些 chunks 被召回。本质上前者是 Question,而后者是 Answer,因此 langchain 是利用了 embedding 在召回(Retrieval)任务上的能力来筛选 chunks, 如图 2 红色垂直列所示,这符合问答系统的初衷。**非常值得注意的是:embedding 在召回任务上的准确率是其在所有 NLP 任务重最差的一个,QA 任务在语义空间上的表达远不如分类、聚合等任务。**常规方案中,langchain 直接召回排序 top8 chunks 给大模型进行 in-context 推理 (gpt-3.5-turbo 4096 tokens)。

大模型

问答系统使用了 LLM in-context 的推理能力,将筛选出来的若干个 chunks 传给大模型,让大模型基于这些 chunks 来回答用户问题,有个限制是整个 prompt 的 tokens 长度不要超过 LLM 输入 tokens 限制,不然 GPU 会报 OOM。LLM in-context 的推理能力本质是其在阅读理解,因此,选择问答系统的 LLM 需要重点关注其在阅读理解任务上的性能,好的 LLM 可以非常精准的从一组 chunks 中寻找并总结出用户 query 对应的答案。

串联

将上述各功能模块的逻辑串联一起,从整体的视角观察一下 langchain + 大模型做问答系统整个方案的实践。

LLM 需要上游提供一些语料 chunks,结合 chunks、用户query、自身阅读理解能力完成知识问答。对问答准确率影响最大的因素是 chunks 的质量(是否包含正确答案),LLM 自身阅读理解能力。同时, LLM 输入 token 长度限制导致 prompt 中 chunks 的数量有一定约束,原则上,chunks 数量越多,包含正确答案的概率越大,同时也导致模型的推理速度变慢。

LLM 上游主要目的是召回出候选的 chunks,常规方案使用的是 embedding 处理召回任务的能力,对于一步召回直接注入到 prompt(无精排逻辑),假如传给 LLM prompt k 个 chunks,那么对于召回来说,只需要相似性算法倒序排序前 k 个 chunk 中包含正确答案即可,即关注 embedding 在召回任务中 TopK 的准确率。

综上所属,常规方案中对智能问答系统准确率影响最大的几个因素如下:

1、embedding 在 Retrieval 任务中 TopK 的准确率 (受 embedding 模型自身能力、Retrieval 算法、K等三个因素影响)

2、K 的大小,K 原则越大越好,但是 LLM 的 tokens 限制导致 K 由不能太大。

(上述 1、2 的都是为了从数据库海量 chunks 中选择出包含正确答案的 chunks)

3、LLM 自身阅读理解与总结推理能力。

openAI 与开源 LLM

为什么 langchain + openAI 全家桶准确率特别高,换成开源 LLM 性能下降很多?

使用 openAI 全家桶构建智能问答系统必用两个能力:openAI 的 embedding 与 gpt-3.5-turbo 模型。

图 2 huggingface embedding benchmark 中 openAI 发布的 text-embedding-ada-002 (2021/09 )最大输入 tokens 限制是 8191,输出维度是 1536,在 Retrieval 中 top1 的准确率是 49.25%。这组数据表明 openAI embedding 模型具有非常棒的语义表达能力,能够非常好的将问题、答案映射到相近的语义向量空间中,可以说该 embedding 模型是业界最强的映射 QA 能力的模型。

openAI 的商用模型 gpt-3.5-turbo 输入 tokens 限制为 4096,如果切片每个 chunks 长度为 400,embedding 可以召回近 10 个候选 chunks,即 text-embedding-ada-002 模型 top10 的准确率即可近似为问答系统的整体准确率(做信息流推荐召回排序的同学应该了解,top1 准确率接近50%,top10 的准确率会很惊人),而 gpt-3.5-turbo 自身的阅读理解也高出开源 LLM 一个水平,能够精准的从所有的 chunks 中找到准确答案。

综上: openAI 全家桶中 embedding 在 Retrieval 任务的高性能、gpt-3.5-turbo 的阅读理解能力,输入 tokens 够长等三个重要因素,是常规基于 langchain + openAI 做智能问答系统,用用户问题向量与语料内容向量进行相似性计算并直接召回给 prompt,最终能够取得非常好效果的重要原因。

openAI embedding 与 gpt-3.5-turbo 强劲性能掩盖了一些问题,这些问题在基于开源 LLM 做自研问答系统时被暴露,直接导致开源 LLM 方案性能下降。

openAI 全家桶与开源 LLM 方案的对比如下:

图片

在 Retrieval 任务的语义关联映射上,openAI 的 embedding 模型能力远高于开源 LLM(15 个百分点以上);LLM token 的限制,导致采用 openAI 召回的 chunks 数量比开源 LLM 多一倍;同时在阅读理解能力上,gpt-3.5-turbo 能够非常好的从一系列 chunks 中找到并总结出最佳答案,而开源 LLM 在这方面能力稍微逊色一些。综上,选择目前开源最好的组合方案:llama 的 vicuna13B 与中文领域开源最好的 embedding 模型 GanymedeNil/text2vec-large-chinese · Hugging Face,采用常规的 langchain + openAI 技术框架,性能会下降很多。

总结

通过全文分析,总结出开源 LLM 大模型在 openAI + langchain 通用的技术方案下,性能不佳的原因主要如下:

  • 使用 Question-Answer (embedding Retrieval) 作为召回排序是性能不佳最根本的原因,开源的中文 embedding 模型在 Retrieval 任务上表现不佳。

  • 模型输入 tokens 限制导致候选的 chunks 数量少于 openAI 模型近一倍,是整体准确率低于 openAI 全家桶的一个重要原因。

  • 模型自身在阅读理解与总结任务上的不足,也对整体性能有一定的影响。

洞悉问题是进步的第一步,本文重点从 embedding 与 LLM 两个角度来剖析 langchain + 开源大模型搭建智能问答系统性能下降的原因,下篇也将从这两个角度逐步分析如何基于 lanchain + 开源大模型搭建高性能智能问答系统。

引文

[1] Brown T, Mann B, Ryder N, et al. Language models are few-shot learners[J]. Advances in neural information processing systems, 2020, 33: 1877-1901.

[2] Bommasani R, Hudson D A, Adeli E, et al. On the opportunities and risks of foundation models[J]. arXiv preprint arXiv:2108.07258, 2021.

[3] GitHub - hwchase17/langchain: ⚡ Building applications with LLMs through composability ⚡

[4] GitHub - milvus-io/milvus: A cloud-native vector database, storage for next generation AI applications

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1381769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pymssql 报错误解决办法:20002, severity 9

错误 解决办法 python3.6,安装pymssql低版本(pymssql-2.1.5-cp36-cp36m-win32.whl)

腾讯云有没有免费云服务器?如何申请?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

【前后端的那些事】快速上手富文本+富文本图片上传

文章目录 fullText富文本1. 后端接口1.1 定义常量1.2 定义返回实体类1.3 上传图片接口1.4 下载图片接口 2. 前端代码编写2.1 安装2.2 快速使用 3. 配置富文本图片上传地址3.1 配置图片上传配置 4. 全部代码展示 前言:最近写项目,发现了一些很有意思的功能…

【JaveWeb教程】(23) MySQL数据库开发之事务与索引 详细代码示例讲解(最全面)

目录 2. 事务2.1 介绍2.2 操作2.3 四大特性 3. 索引3.1 介绍3.2 结构3.3 语法 2. 事务 场景:学工部整个部门解散了,该部门及部门下的员工都需要删除了。 操作: -- 删除学工部 delete from dept where id 1; -- 删除成功-- 删除学工部的员工…

定制一套ERP系统大概要多少钱?ERP软件定制报价

定制一套ERP系统大概要多少钱?ERP软件定制报价 每个企业的需求和情况都是独特的,在不清楚题主所在企业的规模、业务流程、所需功能等情况时,确实没办法给出项目预算。 我们公司也定制过管理系统,经验就是,建议在开始…

MySQL数据库设计原则

0.简单的处理逻辑 一.MySQL完整性约束 主键约束 primary key 自增键约束 auto_increment 唯一键约束 unique 非空约束 not null 默认值约束 default 外键约束 foreign key 下面是一个sql语句创建一个表,可以看出来了使用了哪几个约束吗? create table user( id int…

如何将重复方法封装为Aop切面并结合注解使用

首先要导入依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId> </dependency> 编写注解 package com.yg.domain.note;import java.lang.annotation.ElementType; import java.lang.annotation.Rete…

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中&#xff0c;U盘等移动存储设备已成为数据传输和存储的重要工具。 然而&#xff0c;随着U盘的广泛使用&#xff0c;也带来了潜在的安全风险&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对于随时会有数据泄露风险的企业而言&#xff0c;U盘的使用…

Jetpack Compose -> 声明式UI Modifier

前言 本章主要介绍下 Compose 的声明式 UI 以及初级写法&#xff1b; 什么是声明式UI 传统UI 传统 UI 方式来声明UI <androidx.appcompat.widget.LinearLayoutCompat android:layout_width"match_parent" android:layout_height"match_parent&quo…

(Java企业 / 公司项目)分布式事务Seata详解(含Seata+Nacos组合使用)

一. Seata介绍 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色&#xff0c;帮助经济体平稳的度过历年的双11&…

Ubuntu22.04,Nvidia4070配置llama2

大部分内容参考了这篇非常详细的博客&#xff0c;是我最近看到的为数不多的保姆级别的教学博客&#xff0c;建议大家去给博主点个赞【Ubuntu 20.04安装和深度学习环境搭建 4090显卡】_ubuntu20.04安装40系显卡驱动-CSDN博客 本篇主要是基于这篇博客结合自己配置的过程中一些注…

soc算法【周末总结】

1 实验一&#xff08;SOC误差30%放电实验&#xff09; 1.1 实验过程 1、对电池包进行充电&#xff0c;将昨天放空的电池包进行充电&#xff0c;充电至SOC40%左右&#xff1b; 2、电池包SOC为38%时&#xff0c;手动修改SOC值为70%&#xff0c;开始放电 3、SOC由70%缓慢降至4…

BUUCTFMisc (我flag呢???)

刚好&#xff0c;更完密码学&#xff0c;然后就到下一个对新手还算 “友好” 的地方了--->Misc&#xff08;但他还是比密码学难&#xff09; 找不出flag belike &#xff1a; 看了别人的找法以后be like&#xff1a; 这里我就来讲几道我觉得比较有意思的题目吧&…

一键批量翻译,文件夹名称翻译器

文件夹名称往往是我们初步了解文件内容的重要窗口。有时&#xff0c;为了更好地与国际合作伙伴交流或是管理个人文件&#xff0c;我们需要对文件夹名称进行翻译。传统的逐一修改方法既费时又费力&#xff0c;还要借助翻译工具。现在有了【文件批量改名高手】&#xff0c;上面的…

PMP学习考试经验总结

PMP备考日程计划表 我的PMP的备考大概花了三个月的时间, 可以分为以下几个阶段&#xff1a; Week 1-4: 读完PMBoK 前面7个知识领域&#xff08;中英文版PMBoK一起看&#xff09;。每看完一个知识领域&#xff0c;就看参考书里面的相应章节&#xff08;汪博士那本&#xff09;…

oracle 19c容器数据库data dump数据泵传输数据(3)---完全传输

目录 查看pdb1 创建pdb2 从pdb1 中导出元数据 在pdb2中导入元数据&#xff08;dmp文件&#xff09; Full Transportable Export/Import: Example 只传输除了system&#xff0c;sysaux&#xff0c;temp&#xff0c;undo以外的用户表空间&#xff0c;這種方式傳輸的是用戶自定…

6.4、SDN在云数据中心的应用案例分析

云数据中心中的虚拟子网包含网关和IP网段,IP分配给各个服务器,服务器间能够互相通信或通过网关访问外部网络。 在SDN云数据中心内,用户可以随时订购任意网段的虚拟子网,而且这些子网是可以在不同用户之间复用的,也就是说,不同用户可以使用相同的私有网段。 SDN云数据中心…

Linux截图方法推荐

因为经常会遇到以图为证的情况&#xff0c;而办公设备基本都是linux,所以汇总一下常见的linux截图方式。 1&#xff1a;在 Linux 中系统集成的截图的默认方式 你想要截取整个屏幕&#xff1f;屏幕中的某个区域&#xff1f;某个特定的窗口&#xff1f; 如果只需要获取一张屏幕…

SSL安全证书普及

首先&#xff0c;我们来了解一下什么是SSL安全证书。SSL安全证书是一种遵循SSL协议的数字证书&#xff0c;由受信任的第三方机构——认证中心&#xff08;CA&#xff09;颁发&#xff0c;其主要功能是为互联网通信提供加密处理&#xff0c;确保在用户浏览器和服务器之间传输的信…

深入分析 Spring 中 Bean 名称的加载机制

目录 前言 通过前文&#xff1a;《深入分析-Spring BeanDefinition构造元信息》一文我们可以了解到&#xff1a;Spring Framework共有三种方式可以定义Bean&#xff0c;分别为&#xff1a;XML配置文件、注解、Java配置类&#xff0c; 从Spring Framework 3.0&#xff08;2019年…