LLM RAG - ChatGLM3-6B + LangChain + Faiss
RAG
使用知识库,用来增强 LLM 信息检索的能力
- 知识准确
- 先把知识进行向量化,存储到向量数据库中
- 使用的时候通过向量检索从向量数据库中将知识检索出来,确保知识的准确性
- 更新频率快
- 当发现知识库里面的知识不全时,可以随时补充
- 不需要像微调一样,重新跑微调任务、验证结果、重新部署等
应用场景
ChatOps
- 知识库模式适用于相对固定的场景做推理
- 如企业内部使用的员工小助手,不需要太多的逻辑推理
- 使用知识库模式检索精度高,且可以随时更新
- LLM 基础能力 + Agent 进行堆叠,可以产生智能化的效果
LangChain-Chatchat
组成模块
模块 | 作用 | 支持列表 |
---|---|---|
大语言模型 | 智能体核心引擎 | ChatGLM / Qwen / Baichuan / LLaMa |
Embedding 模型 | 文本向量化 | m3e-* / bge-* |
分词器 | 按照规则将句子分成短句或者单词 | LangChain Text Splitter |
向量数据库 | 向量化数据存储 | Faiss / Milvus |
Agent Tools | 调用第三方接口 | 天气查询 / 搜索引擎查询 |
API | 智能体对外暴露的 API | FastAPI |
WebUI | 操作界面 |
核心流程
1
7 - 完成文档向量化存储的过程15 - 完成知识检索的过程
8
系统部署
安装依赖
1 | $ git clone https://github.com/chatchat-space/Langchain-Chatchat.git |
下载模型
下载 Embedding 模型 - bge-large-zh-v1.5
1 | $ git clone https://www.modelscope.cn/AI-ModelScope/bge-large-zh-v1.5.git |
参数配置
将配置文件复制到 config 目录
1 | $ python3 copy_config_example.py |
配置文件 | 作用 |
---|---|
basic_config.py | 记录日志的格式和存储路径,一般不需要修改 |
kb_config.py | 分词器、向量库的配置 |
model_config.py | 模型的配置 |
prompt_config.py | 不同种类的问答提示词设置 |
server_config.py | 服务器 IP、端口、模型名称等 |
大部分不需要修改,在 model_config.py 中指定 LLM 模型和 Embedding 模型的路径即可
1 | MODEL_PATH = { |
向量数据
初始化向量数据库 - 加载示例数据
1 | $ python3 init_database.py --recreate-vs |
一键启动
1 | $ python3 startup.py -a |
Web UI
知识管理
新建知识库
上传知识文件
将文档存入向量库内,供对话时检索
Open API
可以通过 API 进行知识库管理、对话以及查看服务器信息等操作
GPU
效果观测
LLM
知识库
即获得了 LLM 的输出,也获得了知识库的输出
可以把从知识库中检索到的信息输入到 LLM, LLM 会进行上下文理解,然后整理后输出
Tools
天气查询 - configs/kb_config.py - SENIVERSE_API_KEY
- 这是一个典型的 RAG 案例,通过 API 调用第三方服务,扩大信息检索范围
- 可以将企业的内部数据或者产品数据通过 API 喂给大模型,为产品增加 AI 能力,提升竞争力
向量数据库
向量
- 向量是由一系列数字组成的数组
- 这些数字可以表示任何东西
相似度计算
- 电影推荐 - 计算用户喜好向量和电影评分向量之间的相似度
- 在向量空间中,通常是计算向量之间的距离,如欧氏距离或者余弦相似度
- 距离越小,相似度越高
余弦相似度
1 | import numpy as np |
1 | 电影A与用户偏好的相似度为: 0.97 |
文本向量
- 在 NLP 中,一个词的向量值是通过在大量文本上训练得到的
- 一个词的向量值取决于它是如何被训练的,以及训练数据的性质
- 在不同的 Word2Vec 模型中,即使是相同的词,向量值也可能完全不同
- 因为可能基于不同的文本集或者使用不同的参数训练
Word2Vec
常见的 Word2Vec 模型会生成几百维的向量
1 | import numpy as np |
程序输出
1 | [ 0.32617188 0.13085938 0.03466797 -0.08300781 0.08984375 -0.04125977 |
- 不同的模型、不同的训练数据集、不同的训练参数,都会产生不同的词向量
- 在进行信息检索的时候
- 传统数据库通过 like 去检索相似的内容
- 向量数据库通过向量相似度去检索相似的内容 - 多维度比较
向量存储
- 存储向量数据有专门的向量数据库 - Faiss / Milvus
- 向量数据库专门被设计用于存储和检索向量数据
- 适用 - 处理词向量、图片特征向量或者任何其它形式的高维数据
- 当数据量非常大的时候,同样会遇到性能和稳定性的问题
- 对于向量数据库,主要挑战为多维度的存储
- 随着数据维度的增加,向量之间的距离变得难以区分
- 让寻找最近邻居变得更加困难和耗时,也会增加存储和搜索时所需要的资源
安装 Faiss 依赖
1 | $ pip3 install faiss-cpu |
1 | print(len(man_vector)) # 300 |
程序输出
1 | 300 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.