基于大模型构建本地知识库 Link to heading

想法 Link to heading

2023 年是大模型的元年,大模型的出现使得 NLP 领域的研究进入了一个新的阶段。在这一年,大模型的研究成果不断涌现,大模型的应用也在不断扩展。我一直在思考,如何在创作中应用大模型。

在 2022 年 6 月入职以来,我开始基于 github + vscode 构建自身的本地知识库,于是逐渐疏忽了对于博客的更新。而在 2023 年 6 月开始,我又逐渐尝试转向使用 obsidian 进行写作,并采取 PARA + Inbox 和日记来进行知识的规划、整理和总结。这又是后话了。

在知识创作的过程中,我逐渐发现了几个非常麻烦的问题:

  1. 相同类型的知识可能会散步在多个文件内,而现有的搜索方式很难找到这些内容,特别是当我自己都不知道我自己想要搜索什么时。
    1. 例如,我有段时间在研究福格行为模型。这部分内容可能会出现在我对于行为科学的研究上,可能会出现在我对于《福格行为模型》的读书笔记里,可能会出现在我对其的其他实践中。诚然,这些文档之间有着对应的双向链接,通过链接或者 tag 一个个找肯定是能找到的,但是太过费事。
    2. 使用 grep 来逐行搜索,又不一定能稳定在同一行。构建本地索引也可能有问题,因为我不确定自己输入的关键词是否完全正确。
  2. 此外,每次对知识进行总结和归纳也是一个体力活。特别是引入日历之后,需要定时定期地对每日、每周、每月的知识和个人行为表现进行总结和归纳。

这部分内容其实相对来说也不算多,一个很自然的想法就是:大模型是否能帮助我解决这一点?

GPT4 Link to heading

最早的想法自然是直接使用 GPT4,于是我找到了 这篇文章。应该是在去年 11 月开始,OpenAI 允许用户自行创建 GPT。

不过原作者使用的方式是将所有内容全部传到一个 markdown 并上传,而我的东西太多了,我只能自己打 zip 压缩包。丢上去之后,效果非常差,模型完全不能回应我的任何内容。而且从一些视频和我自己的使用情况来看,ChatGPT 的回应速度不是很理想,在高强度的交互下会很影响灵感。所以我最终只能另寻他法。

在和 GPT 交互时积累的一些基础知识,应该是摘录自 reddit,虽然最后我也没用上

  1. RTFC 框架
    • 角色(Role):明确你希望 ChatGPT 扮演的角色。
    • 任务(Task):具体说明你希望完成的任务。
    • 格式(Format):指定输出的格式。
    • 约束(Constraints):定义清晰的约束条件,明确指出不希望看到的内容。这包括使用简单但权威的语言,避免使用行业术语和过于热情的销售语言等。
  2. 提供示例
    • 提供具体示例可以显著提高输出质量,就像去理发店一样,展示你想要的发型照片比描述要简单得多。告诉 ChatGPT 你不想要的内容或风格也同样重要。
  3. 分步请求
    • 让 ChatGPT 放慢速度,分步骤提供信息或结果,这样通常能得到更好的结果。同时,鼓励 ChatGPT 提出跟进问题,以便更好地理解需求或改进输出。

其他提示/观察

  • 当聊天记录变得过长时,最好重新开始,以避免混乱和误解。
  • 可以要求 ChatGPT 提供对话摘要,以便重新开始但保留上下文。
  • 在使用不同的 AI 工具时,可以结合它们的优势:例如,GPT-4 在推理上表现优秀,而 Claude 在写作上更自然、更吸引人。

本地知识库实践 Link to heading

由于 ChatGPT 无论怎么提问都无法使用知识库内的知识,一问三不知。我打算先跑起一个本地的知识库看一下效果,再决定后续的工作。

在实践中,我发现本地知识库的部署可以直接使用现有的开源项目来完成,而且效果也可以很不错:chatchat-space。问题在于,我比较看好的 chatglm6b 显存要求太高,至少要 14GB 的显存才能跑得起现有的大模型,比较麻烦。而 Qwen-1_8B-Chat 虽然只需要 3.8GB 的显存,但是看起来不是很靠谱。

远端尝试 Link to heading

由于本地实在不像是能跑起来的样子,于是我决定氪服困难。我直接在 AutoDL 上弄了一台 4090 的 GPU 服务器先尝试运行了一下,镜像为 Langchain-chatchat v12,要求 CUDA 12 以上。使用 vscode 完成端口的转发,毕竟它还能自动完成检测,更方便一些。

Langchain-chatchat 也很有意思,之后有时间可以把它拆解一些阅读源代码。

相关文档

使用 vscode 直接 ssh 登录到远程主机中,运行前的一些操作和设置:

# 需要使用这个环境,不然很多库都没有
conda activate /root/pyenv
# 路径是/root/Langchain-Chatchat/

# 配置文件,位于路径的config目录下
# 需要修改model_config.py内的MODEL_ROOT_PATH参数为/root/model,该路径下默认有chatglm-6b。

# 上传本地知识库,这里选择的是博客的相关内容
# 知识库最终存放在文件夹 knowledge_base中
# 也可以直接在6006端口访问流式API后手动上传
python init_database.py --recreate-vs

# 执行命令运行
python startup.py -a

效果非常地显著,以下是在本地知识库中使用知识库来直接搜索和基于知识库回答问题的结果。可以看到,对于指定问题,chatglm3-6b 的表现相当出色。而且在知识库匹配结果中能直接给出匹配到的出处。这里唯一的问题就是氪服困难的价格有点高,每小时差不多要 2.5 元。不过实测不满一个小时的时候不会按照一小时来计费,如果只是每次遇到瓶颈或者每周定期启动的话,一个月应该不会超过 10 块钱,总体来说还是可以接受的。至于购买 GPU……我觉得我的 2070s 应该能撑到我看好的 50 系显卡出来。

本地运行 Link to heading

总是在云端也不是办法,最终我还是尝试了一下本地直接启动。众所周知,配置深度学习和 GPU 环境一直是一个让人头秃的问题,不出问题还好,一出问题就让人容易去世。特别是在 windows 上,基本上是一个不太让人长寿的操作。因此我计划使用 windows-wsl,直接跑 docker 镜像来挽救我的时间。

wsl 教程可以参考 codewithGPU 的安装介绍

  • 其中,docker 安装 建议使用清华的 镜像,docker 官方镜像慢的飞起

WSL 上使用 GPU 的教程见 英伟达官方文档,具体来说:

  • 首先,主机需要有对应的显卡驱动
  • WSL 中需要配置 wsl cuda,选择系统为 linux 的 wsl-ubuntu 即可。由于我这里使用的是 docker 镜像启动,所以可以直接跳过 CUDA

尝试结果:

  1. 本地效果会差很多,速度非常慢。值得注意的是我的 2070S(显存 8GB)也能运行起来 chatglm3-6b(理论要求显存 14GB)。怀疑是使用了虚拟内存之类的技术,因为我的机械盘读写炸了……
  2. 效果一般,Qwen 的效果相当一般,只能说得益于向量数据库,至少能找到对应的内容,作为本地搜索的补充确实还可以,想要更进一步……不太行。
  3. 对素材要求很高。本地的时候额外添加了微信读书内的划线和原文,表现一下子变差了很多。模型比较难以理解断续的文字,而对于我此前做好的笔记效果则好非常多。