English | 简体中文
茴香豆是一个基于 LLM 的专业知识助手,优势:
- 设计预处理、拒答、响应三阶段 pipeline:
chat_in_group
群聊场景,解答问题时不会消息泛滥。见 2401.08772,2405.02817,混合检索和业务数据精度测试chat_with_repo
实时聊天场景,响应更快
- 无需训练适用各行业,提供 CPU-only、2G、10G、20G、80G 规格配置
- 提供一整套前后端 web、android、算法源码,工业级开源可商用
查看茴香豆已运行在哪些场景;加入微信群直接体验群聊助手效果。
如果对你有用,麻烦 star 一下⭐
茴香豆 Web 版已发布到 OpenXLab,可以创建自己的知识库、更新正反例、开关网络搜索,聊天测试效果后,集成到飞书/微信群。
Web 版视频教程见 BiliBili 和 YouTube。
Web 版给 android 的接口,也支持非 android 调用,见python 样例代码。
- [2024/09] 倒排索引让 LLM 更偏向使用领域知识 🎯
- [2024/09] 稀疏方法实现代码检索
- [2024/08] "chat_with readthedocs" ,见集成说明
- [2024/07] 图文检索 & 移除
langchain
👍 - [2024/07] 混合知识图谱和稠密检索,F1 提升 1.7% 🎯
- [2024/06] 评估 chunksize,splitter 和 text2vec 模型 🎯
- [2024/05] wkteam 微信接入,整合图片&公众号解析、集成指代消歧
- [2024/05] SFT LLM 处理 NLP 任务,F1 提升 29% 🎯
🤗 LoRA-Qwen1.5-14B LoRA-Qwen1.5-32B alpaca 数据 arXiv - [2024/04] 实现 RAG 标注 SFT 问答数据和样例
- [2024/04] 发布 web 前后端服务源码 👍
- [2024/03] 新的个人微信集成方法和预编译 apk !
- [2024/02] [实验功能] 微信群 集成多模态以实现 OCR
LLM | 文件格式 | 检索方法 | 接入方法 | 预处理 |
|
|
以下是不同特性所需显存,区别仅在配置选项是否开启。
配置示例 | 显存需求 | 描述 | Linux 系统已验证设备 |
---|---|---|---|
config-cpu.ini | - | 用 siliconcloud API 仅检索文本 |
|
config-2G.ini | 2GB | 用 openai API(如 kimi、deepseek 和 stepfun) 仅检索文本 |
|
config-multimodal.ini | 10GB | 用 openai API 做 LLM,图文检索 | |
【标准版】config.ini | 19GB | 本地部署 LLM,单模态 | |
config-advanced.ini | 80GB | 本地 LLM,指代消歧,单模态,微信群实用 |
我们以标准版(本地运行 LLM,纯文本检索)为例,介绍 HuixiangDou 功能。其他版本仅仅是配置选项不同。
首先点击同意 BCE 模型协议,命令行登录 huggingface
huggingface-cli login
安装依赖
# parsing `word` format requirements
apt update
apt install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig libpulse-dev
# python requirements
pip install -r requirements.txt
# python3.8 安装 faiss-gpu 而不是 faiss
我们将用 mmpose 的文档构建 mmpose 知识库,过滤问题。如有自己的文档,放入 repodir
下即可。
复制下面所有命令(包含 '#' 符号)建立知识库。
# 下载知识库,我们仅以 mmpose 的文档为例。repodir下可以放任何自己的文档
cd HuixiangDou
mkdir repodir
git clone https://github.com/open-mmlab/mmpose --depth=1 repodir/mmpose
# 把 repodir 的特征保存到 workdir,把正反例阈值更新进 `config.ini`
mkdir workdir
python3 -m huixiangdou.service.feature_store
结束后执行 python3 -m huixiangdou.main --standalone
,此时回复 mmpose 相关问题(和知识库相关),同时不响应天气问题。
python3 -m huixiangdou.main --standalone
+-----------------------+---------+--------------------------------+-----------------+
| Query | State | Reply | References |
+=======================+=========+================================+=================+
| 请问如何安装 mmpose ? | success | 要安装 mmpose,请按照以下步骤操作..| installation.md |
--------------------------------------------------------------------------------------
| 今天天气如何? | unrelated| .. | |
+-----------------------+---------+--------------------------------+-----------------+
🔆 Input your question here, type `bye` for exit:
..
Note
💡 也可以启动 gradio
搭建一个简易的 Web UI,默认绑定 7860 端口:
python3 -m huixiangdou.gradio_ui
# 若已单独运行 `llm_server_hybrid.py`,可以
# python3 -m huixiangdou.gradio_ui --no-standalone
output.mp4
或者启动服务端,监听 23333 端口。默认使用 chat_with_repo
pipeline:
python3 -m huixiangdou.server
# cURL 测试状态回调接口
curl -X POST http://127.0.0.1:23333/huixiangdou_stream -H "Content-Type: application/json" -d '{"text": "how to install mmpose","image": ""}'
# cURL 测试同步接口
curl -X POST http://127.0.0.1:23333/huixiangdou_inference -H "Content-Type: application/json" -d '{"text": "how to install mmpose","image": ""}'
请调整 repodir
文档、good_questions 和 bad_questions,尝试自己的领域知识(医疗,金融,电力等)。
我们提供了完整的 typescript 前端和 python 后端服务源码:
- 支持多租户管理
- 零编程接入飞书、微信群
- 架构松散,适合 k8s
效果同 OpenXlab APP ,请阅读 web 部署文档。
若没有 GPU,可以使用 siliconcloud API 完成模型推理。
以 docker miniconda+Python3.11 为例,安装 cpu 依赖,运行:
# 启动容器
docker run -v /path/to/huixiangdou:/huixiangdou -p 7860:7860 -p 23333:23333 -it continuumio/miniconda3 /bin/bash
# 装依赖
apt update
apt install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig libpulse-dev
python3 -m pip install -r requirements-cpu.txt
# 建立知识库
python3 -m huixiangdou.service.feature_store --config_path config-cpu.ini
# 问答测试
python3 -m huixiangdou.main --standalone --config_path config-cpu.ini
# gradio UI
python3 -m huixiangdou.gradio_ui --config_path config-cpu.ini
如果装依赖太慢,dockerhub 里提供了安装好依赖的镜像,docker 启动时替换即可。
如果你的显存超过 1.8G,或追求性价比。此配置扔掉了本地 LLM,使用 remote LLM 代替,其他和标准版相同。
以 siliconcloud 为例,把官网申请 的 API TOKEN 填入 config-2G.ini
[llm]
enable_local = 0 # 关掉本地 LLM
enable_remote = 1 # 只用远程
..
remote_type = "siliconcloud" # 选择 siliconcloud
remote_api_key = "YOUR-API-KEY-HERE" # 填 API key
remote_llm_model = "alibaba/Qwen1.5-110B-Chat"
Note
执行命令获取问答结果
python3 -m huixiangdou.main --standalone --config-path config-2G.ini # 一次启动所有服务
如果你有 10G 显存,那么可以进一步支持图文检索。仅需修改 config.ini 使用的模型。
# config-multimodal.ini
# !!! Download `https://huggingface.co/BAAI/bge-visualized/blob/main/Visualized_m3.pth` to `bge-m3` folder !!!
embedding_model_path = "BAAI/bge-m3"
reranker_model_path = "BAAI/bge-reranker-v2-minicpm-layerwise"
需要注意:
- 先下载 bge-m3,然后把 Visualized_m3.pth 放进
bge-m3
目录 - FlagEmbedding 需要安装 master 最新版,我们做了 bugfix;这里可以下载 BGE 打包漏掉的
bpe_simple_vocab_16e6.txt.gz
- 安装 requirements/multimodal.txt
运行 gradio 测试,图文检索效果见这里.
python3 tests/test_query_gradio.py
微信体验群里的 “茴香豆” 开启了全部功能:
- Serper 搜索及 SourceGraph 搜索增强
- 群聊图片、微信公众号解析
- 文本指代消歧
- 混合 LLM
- 知识库为 openmmlab 相关的 12 个 repo(1700 个文档),拒绝闲聊
请阅读以下话题:
- 混合知识图谱和稠密检索提升精度
- 参照 config-advanced.ini 配置提升效果
- 群聊场景指代消歧训练
- 使用 wkteam 微信接入,整合图片、公众号解析和指代消歧
- 使用 rag.py 标注 SFT 训练数据
贡献者提供了android工具 完成微信接入。方案基于系统层 API,原理上可以控制任何 UI(不限于通讯软件)。
-
对于通用问题(如 “番茄是什么” ),我希望 LLM 优先用领域知识(如 “普罗旺斯番茄”)怎么办?
参照 PR,准备实体列表,构建特征库时传入列表,
ParallelPipeline
检索会基于倒排索引增大召回 -
机器人太高冷/太嘴碎怎么办?
- 把真实场景中,应该回答的问题填入
resource/good_questions.json
,应该拒绝的填入resource/bad_questions.json
- 调整
repodir
中的文档,确保不包含场景无关内容
重新执行
feature_store
来更新阈值和特征库。⚠️ 如果你足够自信,也可以直接修改 config.ini 的reject_throttle
数值,一般来说 0.5 是很高的值;0.2 过低。 - 把真实场景中,应该回答的问题填入
-
启动正常,但运行期间显存 OOM 怎么办?
基于 transformers 结构的 LLM 长文本需要更多显存,此时需要对模型做 kv cache 量化,如 lmdeploy 量化说明。然后使用 docker 独立部署 Hybrid LLM Service。
-
如何接入其他 local LLM / 接入后效果不理想怎么办?
- 打开 hybrid llm service,增加新的 LLM 推理实现
- 参照 test_intention_prompt 和测试数据,针对新模型调整 prompt 和阈值,更新到 prompt.py
-
响应太慢/网络请求总是失败怎么办?
- 参考 hybrid llm service 增加指数退避重传
- local LLM 替换为 lmdeploy 等推理框架,而非原生的 huggingface/transformers
-
机器配置低,GPU 显存不足怎么办?
此时无法运行 local LLM,只能用 remote LLM 配合 text2vec 执行 pipeline。请确保
config.ini
只使用 remote LLM,关闭 local LLM -
报错
(500, 'Internal Server Error')
,意为 standalone 模式启动的 LLM 服务没访问到。按如下方式定位- 执行
python3 -m huixiangdou.service.llm_server_hybrid
确定 LLM 服务无报错,监听的端口和配置一致。检查结束后按 ctrl-c 关掉。 - 检查
config.ini
中各种 TOKEN 书写正确。
- 执行
- KIMI: 长文本 LLM,支持直接上传文件
- FlagEmbedding: BAAI RAG 组
- BCEmbedding: 中英双语特征模型
- Langchain-ChatChat: Langchain 和 ChatGLM 的应用
- GrabRedEnvelope: 微信抢红包
@misc{kong2024huixiangdou,
title={HuiXiangDou: Overcoming Group Chat Scenarios with LLM-based Technical Assistance},
author={Huanjun Kong and Songyang Zhang and Jiaying Li and Min Xiao and Jun Xu and Kai Chen},
year={2024},
eprint={2401.08772},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@misc{kong2024labelingsupervisedfinetuningdata,
title={Labeling supervised fine-tuning data with the scaling law},
author={Huanjun Kong},
year={2024},
eprint={2405.02817},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2405.02817},
}
```