代码结构说明¶
本文主要解释豆哥(茴香豆)各目录和功能。文档可能无法随代码即时更新,但已有定义不会再变动。
第一层:项目介绍¶
项目最外层,只有 huixiangdou python module 和 1 个配置文件。
.
├── config-advanced.ini
├── config-2G.ini # 高级版和体验版配置范例,轻微修改了 `config.ini`
├── config.ini # 基础配置范例,包含算法所有选项和参数
..
├── huixiangdou # python module
..
├── requirements-lark-group.txt # 集成飞书群才需要的依赖
├── requirements.txt # 基础依赖
配置实际是 toml 格式,为了避免用户觉得陌生,改名 windows 常见的 .ini
第二层:huixiangdou module¶
module 内只有 3 个部分:
.
├── frontend # 飞书、微信这些,都是茴香豆算法的前端
├── main.py # main 提供示例程序
├── services # services 就是算法实现
services 我们在论文里介绍豆哥是套 pipeline。在实现里,可能包含函数、本地 LLM 或者 RPC。把这些基础能力都视做 service。
frontend 既然豆哥是套算法 pipeline,那么微信、飞书、web 这些,都是它的前端。这个目录放调用前端的工具类和函数,目前里面是飞书的 API 用法
main.py 现在有算法、有前端,需要个入口函数实现业务逻辑。你在 config.ini 配置了飞书,就应该发给飞书 qaq
第三层:services¶
这里是 HuixiangDou 算法主体。
.
├── store.py # 管理文本特征的建立和查询,未来会把 “建立” 和 “查询” 分开
├── helper.py # 放一些辅助工具
├── llm_client.py # LLM 可能是个 RPC,所以需要个 client
├── llm_server_hybrid.py # LLM 可能不止一个,所以是 hybrid
├── sg_search.py # sourcegraph 客户端
├── web_search.py # google search 的客户端
└── worker.py # 论文所说的主逻辑,调用上面的组件
1. store.py 人脸识别时代,面部特征的存储和检索叫 feature_store,这是名字来源。
- 提取特征时,会花式分割文本(构造技巧会影响精度)、text2vec 模型提取特征、保存到本地;
- 检索时,除了直接用 text2vec 匹配,还会 rerank 模型调整顺序
feature_store 在整个 pipeline 里仅仅是 “引路牌” 的作用,并不依赖 chunk 作答。
2. llm 部分 包含了 LLM
- 如果需要本地部署 LLM,请使用 `vllm`,`config.ini` 选择 `vllm`
3. 搜索 LLM 作答总需要个 ground truth,如果知识库提供不了,依赖搜索引擎是个不错的选择。这里的特色是:反复检查网络结果的质量。网上的信息大都有害,不过滤就直接用,轻则回答错误;重则价值观问题
4. 搜索增强 sg_search 引擎的搜索能力有限,而浩瀚知识是无限的,“海底捞针” 当然艰难。
但如果事先知道答案就在某个 repo 里,只搜那个 repo,必然能提升精度。 sg_search 就是针对一个小 repo 调用知识图谱找答案,“大炮打蚊子” 往往效果不错。
5. 主逻辑 worker.py 在多个微信群运行半年,被“攻击”数万次后,总结出的一套 pipeline