【InternLM】茴香豆:搭建你的RAG智能助理

茴香豆是 InternLM开源的基于 LLM的群聊知识助手,其提供了一整套前后端 web、android、算法源码,支持工业级商用。其最低运行运行成本低至 1.5G 显存,无需训练适用各行业。

1. 技术报告

参照技术报告HuixiangDou: Overcoming Group Chat Scenarios with LLM-based Technical Assistance。

  • 项目目的:为了帮助算法工程师深入了解开源算法项目问答,后又被拓展为即时通讯群聊的助手,如Lack和微信。
  • 项目贡献:
    1. 打通群聊场景的算法链路;
    2. 验证了text2vec方法在任务拒绝上的有效性;
    3. 验证了LLM在技术类助手产品上的三个必要需求:1)评分能力;2)in-context learning;3)长文本
1.1 项目改进思路

报告提及本项目在开发过程中依次采用的三种改进思路:

思路一:采用微调后的LLM
用户的输入根据用户id进行分组(因为LLM智能区分system、user和bot三个决策),连续提问进行拼接,同时舍弃了图片、表情和音频等元素。
在这里插入图片描述
思路二:改进幻觉
导致幻觉发生的主要原因有两个:1)用户表达的模糊;2)模型导致的幻觉(训练数据和领域知识没有对齐),为了缓解上述两个原因,本项目分别从用户侧和模型侧提出了改善方案:
用户侧:两阶段的拒绝设计(分别为Text2Vec相似度计算和LLM评分计算),来识别用户闲聊等场景;
模型侧:采用RAG+prompt的方式改善模型的输出;
在这里插入图片描述
思路三:最终方案
最终方案中通过prompt工程和搜索增强的方式来提升回答的准确率,包括网络搜索、融合Repo知识和语料源打分等具体措施。
在这里插入图片描述

1.2 试验
1.2.1 LLM微调

基础模型的选择应满足如下三个标准:
1)理解领域术语,从而可以不用从头开始训练大模型;
2)具有长文本的拓展能力:支持RoPE编码;
3)支持in-context learning,并由稳定的评分能力

微调数据的来源有三处:
1)从聊天群里得到的对话数据,进行了脱敏处理和相关预处理;
2)对于只有Question的语料,利用更大的LLM进行蒸馏;
3)从Github爬取相关领域的问答对

1.2.2 训练和测试

基于XTuner框架,采用qLoRA策略,分别对应7B和13B的模型进行局部微调,微调后的模型表现出明显的幻觉,其主要问题还是语料的质量不高。

1.2.3 拒绝链路中的RAG

手动标注了几百条数据进行测试,发现text2vec-large-chinese的精准率和召回率分别可以达到0.99和0.92。同时,尝试langchain中不同的分词策略,发现影响不大。

1.2.4 LLM评分

LLM评分可用于query和背景知识的相关性评分,以及安全测试。

1.2.5 长文本支持

采用Triton和动态量化的技术,支持40k的上下文。
在这里插入图片描述

1.3 其他尝试
1.3.1 RAG中的NLP策略

采用词性分析等手段,对query进行改写。但实际工程上,由于专业领域部分词汇的特殊性,以及开源词性分析工具的多语种问题,导致在中文上并没有良好的准确度。

1.3.2 提示工程

考虑采用Rephrase and Respond 和REACT策略进行prompt的优化,但存在适用性和工程化的问题。

2. 服务器端部署demo

参照茴香豆部署服务器,进行服务器端的部署。

尝试询问问题:茴香豆怎么部署到微信群?,茴香豆的回答如下,可见整体还是精准的。
在这里插入图片描述

3. web端部署demo

3.1 直接利用官方平台进行部署

参照茴香豆部署群聊助手进行web端的部署。

直接在官方网站进行知识库的配置,尝试提问发现不理想:
在这里插入图片描述
存在如下几个问题:

  1. 频繁出现 LLM API 没给回复,强烈建议换个问法。或点击右上角“反馈问题” qaq 的问题,怀疑是线上计算资源问题不足,
  2. 跳跃回答,如上图,下一个回答的是上一个问题,不知道是不是因为并发的问题?
  3. 回答质量,如上图,回答的与原文档差别较大,不知道是不是LLM+RAG普遍存在的问题。
3.2 服务器上进行web部署

基于gradio进行应用部署,测试结果如下:
在这里插入图片描述
此外尝试了另一种前端部署方式,但最终提示缺少css和js文件,只能作罢。

4. 搭建垂直领域问答助手

创建一个基于transformers的问答知识库,同时开启远程模型(kimi)和网络搜索功能。
在这里插入图片描述

5. 源码学习&解析

5.1 文件结构和整体架构
5.1.1 文件结构

根目录的文件结构如下:

.
├── LICENSE
├── README.md
├── README_zh.md
├── android
├── app.py
├── config-2G.ini
├── config-advanced.ini
├── config-experience.ini
├── config.ini # 配置文件
├── docs # 教学文档
├── huixiangdou # 存放茴香豆主要代码,重点学习
├── huixiangdou-inside.md
├── logs
├── repodir # 默认存放个人数据库原始文件,用户建立
├── requirements-lark-group.txt
├── requirements.txt
├── resource
├── setup.py
├── tests # 单元测试
├── web # 存放茴香豆 Web 版代码
└── web.log
└── workdir # 默认存放茴香豆本地向量数据库,用户建立

核心代码huixiangdou的文件结构如下:

./huixiangdou
├── __init__.py
├── frontend # 存放茴香豆前端与用户端和通讯软件交互代码
│   ├── __init__.py
│   ├── lark.py
│   └── lark_group.py
├── main.py # 运行主贷
├── service # 存放茴香豆后端工作流代码
│   ├── __init__.py
│   ├── config.py #
│   ├── feature_store.py # 数据嵌入、特征提取代码
│   ├── file_operation.py
│   ├── helper.py
│   ├── llm_client.py
│   ├── llm_server_hybrid.py # 混合模型代码
│   ├── retriever.py # 检索模块代码
│   ├── sg_search.py # 增强搜索,图检索代码
│   ├── web_search.py # 网页搜索代码
│   └── worker.py # 主流程代码
└── version.py
5.1.2 整体框架

在这里插入图片描述
项目代码大致分为三个阶段:
1)构建向量检索
用于知识库的生成,以及query输入后的检索和召回,从而得到相关的背景语料信息。

2)回答生成
基于LLM(本地或远程api),利用prompt套用得到response。此阶段还可以接入web搜索,支持历史对话等功能。

3)前端应用
项目提供了基于gradio、html的部署方式,并可以接入wechat等第三方应用。

5.2 构建向量检索

1)文档加载
遍历目标repo,支持md、txt、pdf、excel、word、ppt和html文件的加载,其借助的开源工具分别为:

md、txt:直接加载,但对于md进行一定程度的清洗,如过滤图片和代码段
pdf:利用fitz+pandas,表格转为json
excel:利用pandas
word、ppt:利用textract
html:利用beautifulsoup

2)reponse向量索引
用于对query进行应答的相似度检索,其基于bce-embedding-base_v1进行Embedding,利用FAISS进行向量存储。
构建的语料是对上述的文档进行清洗+chunk。

3)reject向量索引
用于对query进行拒答的相似度检索,其同样基于bce-embedding-base_v1进行Embedding,利用FAISS进行向量存储。
构建的语料是基于未清洗的文档。对此,本人持怀疑态度,因为即使未清洗,也是与期待的query在字面上比较相近。相反,应该采用一些负样本进行索引。简单测了以下该向量索引对chit-chat类语料的相似情况,果然并不理想。
在这里插入图片描述

4)拒答相似度阈值动态更新
系统会加载good_questions.jsonbad_questions.json 两份文件,分别作为正负样本来评测reject向量索引的pr值。根据绘制的pr曲线进行求和,得到最大和处的值作为拒答相似度阈值。神奇的是,在经过调整后,3)中错误的两个样本居然都被成功reject了。

5.3 回答生成

将上阶段召回的语料,结合一定的prompt模板,将query进行增强,然后通过调用本地模型或远程模型API进行回答。

6. 算法改进

本文提供一些改进思路,因目前缺少实践无法进行严格论证,仅供参考。
1)拒绝阶段的语料生成:可采用更泛化的负样本进行阈值选择,比如采用开源的chit-chat语料或其他语料;
2)第一阶段召回的trade-off:实测下面第一阶段的拒答率很高,可以用一些NLP技术(如关键词提取、词性分析)来加强召回;

7. TODO

鉴于时间,目前还没有对源码和逻辑进行透彻的理解,还需要对一些流程细节和trick进行进一步实践和学习。

8. 参考文献

  1. 书生·浦语 茴香豆 demo
  2. https://www.bilibili.com/video/BV1QA4m1F7t4/?spm_id_from=333.999.0.0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DM8】外部表

外部表是指不存在于数据库中的表。 通过向达梦数据库定义描述外部表的元数据,可以把一个操作系统文件当成一个只读的数据库表,对外部表将像普通定义的表一样访问。 外部表的数据存储在操作系统文件中,建立外部表的时候,不会产生…

百度驾驶证C++离线SDK V1.1 C#接入

百度驾驶证C离线SDK V1.1 C#接入 目录 说明 效果 项目 代码 下载 说明 自己根据SDK封装了动态库,然后C#调用。 SDK包结构 效果 项目 代码 using Newtonsoft.Json; using OpenCvSharp; using System; using System.Collections.Generic; using System.D…

Taro打包生成不同目录

使用taro init创建taro项目时,taro默认打包目录是: /config/index.js outputRoot:dist默认的目录,编译不同平台代码时就会覆盖掉,为了达到多端同步调试的目的,这时需要修改默认生成目录了,通过查看官方文…

大语言模型如何工作?

此为观看视频How Large Language Model works的笔记。 GPT(Generative Pre-trained Transformer)是一个大语言模型(LLM),可以生成类似人类的文本。本文阐述: 什么是LLMLLM如何工作LLM的应用场景 什么是…

一些 MaxCompute 日常优化案例分享

作者:开七 一、前言 MaxCompute 优化是一个多样而又重要的过程,优化过程中若能够深入理解 ODPS 的工作原理和内部机制,才能够更明确的发现运行过程中存在的问题,这样才能更有针对性地进行优化,优化需要不断思考和尝试…

Vue.js组件精讲 基础:Vue.js组件的三个API:prop、event、slot

如果您已经对 Vue.js 组件的基础用法了如指掌,可以跳过本小节,不过当做复习稍读一下也无妨。 组件的构成 一个再复杂的组件,都是由三部分组成的:prop、event、slot,它们构成了 Vue.js 组件的 API。如果你开发的是一个…

w1r3s 靶机学习

w1r3s 靶机学习 0x01 IP C for command kali ip 10.10.10.128victim ip 10.10.10.1290x02 开扫 C sudo nmap -sn 10.10.10.0/24-sn 多一步入侵和轻量级侦察 发送四项请求 -sL 列表扫描,多用于探测可用ip,广播扫描 –send-ip 时间戳请求&#xff0…

YOLOv7全网独家改进: 卷积魔改 | 变形条状卷积,魔改DCNv3二次创新

💡💡💡本文独家改进: 变形条状卷积,DCNv3改进版本,不降低精度的前提下相比较DCNv3大幅度运算速度 💡💡💡强烈推荐:先到先得,paper级创新,直接使用; 💡💡💡创新点:1)去掉DCNv3中的Mask;2)空间域上的双线性插值转改为轴上的线性插值; 💡💡💡…

JavaSE:预定义类,访问修饰符,Java面向对象的特征

预定义类 JDK提供的类就是预定义类 Date类,LocalDate类等 访问修饰符 Java提供了四种访问修饰符,访问范围从大到小是:public > protected > 缺省 > private public:不同包的不相关子类 protected:不同包…

一例Foxmail的发件错误问题及解决方案

问题 Foxmail发件时,提示“连接失败” 点击左上角“收取”也连接失败 解决方法 点击右上角三个横线: 再点击“设置”在“网络”中,看看默认代理是不是“不使用代理” 如果不是,选成第一个 再在“账号”里选择自己用的账号&a…

NLP在搜索召回领域中的应用场景

自然语言处理(NLP)在搜索召回领域中的应用场景非常广泛,它通过理解和分析人类语言,提高了信息检索的准确性和效率。以下是一些具体的应用场景: 1. 搜索引擎优化 NLP技术可以用于优化搜索引擎的查询处理,通…

Centos 下载地址

下载镜像地址: 1、官网地址:The CentOS Project 2、阿里镜像站:centos安装包下载_开源镜像站-阿里云 3、清华镜像源:Index of /centos/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.、CentOS搜狐镜像&#xff1…

针对于OB_GINS的CMakeList文件的深入学习

Project()——配置项目信息 project(CMakeTemplate VERSION 1.0.0 LANGUAGES C CXX DESCRIPTION "A cmake template project") //通过project命令配置项目信息project(项目名称 VERSION major.minor.patch.tweak )CMake会将对应的值分别赋值给以下变量: PROJECT_VE…

家庭网络防御系统搭建-将NDR系统的zeek日志集成到securit yonion

在前面的文章中安装了zeek,这里,安装了securityonion,这里,本文讲述如何将zeek生成的日志发送到siem security onion之中。 所有日志集成的步骤分为如下几步: 日志收集配置日志发送接收日志解析配置日志展示配置 ZEEK日志收集配…

购买国外虚拟主机应该怎么支付

国外虚拟主机支付,大多接受visa信用卡支付方式,如果用一张visa信用卡相对会方便很多,此外像Skrill、PayPal、比特币等,部分虚拟主机服务商也接受,另外还有小部分服务商接受支付宝、微信形式。 美国虚拟主机&#xff0…

大厂高频面试题复习JAVA学习笔记-学习路线

对于应届生,要找到一份java工作,你得大概学会: java基础:javase、jvm、juc、gc、mysql、jdbc,计网计组 Java微服务基础Maven→Gradle→Spring6→SpringMVC→MyBatis→MyBatisPlus→SSM->Redis7->SpringBoot2-&…

matlab:有限差分求解纳维尔(Navier)边界的双调和(Biharmonic)方程,边值为零

我们考虑如下形式的双调和方程的数值解 其中,Ω是欧氏空间中的多边形或多面体域,在其中,d为维度,具有分段利普希茨边界,满足内部锥条件,f(x) ∈ L2(Ω)是给定的函数,∆是标准的拉普拉斯算子。算…

飞腾银河麒麟(ARM架构)离线安装MySql8.0.28版本

下载安装包 下载地址:https://downloads.mysql.com/archives/community/ 解压后上传到服务器(或者直接上传到服务器用tar -zxvf xxx.tar命令解压) 卸载mariadb 卸载命令:yum remove mariadb-server mariadb 检查是否还有未删除的包: rpm -…

计算机视觉——引导APSF和梯度自适应卷积增强夜间雾霾图像的可见性算法与模型部署(C++/python)

摘要 在夜间雾霾场景中,可见性经常受到低光照、强烈光晕、光散射以及多色光源等多种因素的影响而降低。现有的夜间除雾方法常常难以处理光晕或低光照条件,导致视觉效果过暗或光晕效应无法被有效抑制。本文通过抑制光晕和增强低光区域来提升单张夜间雾霾…

掌握网络抓取技术:利用RobotRules库的Perl下载器一览小红书的世界

引言 在信息时代的浪潮下,人们对于获取和分析海量网络数据的需求与日俱增。网络抓取技术作为满足这一需求的关键工具,正在成为越来越多开发者的首选。而Perl语言,以其卓越的文本处理能力和灵活的特性,脱颖而出,成为了…