能与文档聊天的RAG工具kotaemon

最近搞 AI 的项目比较多,正好看到硅基流动在送 Token,如果你用老苏的邀请链接注册, https://cloud.siliconflow.cn/i/NkUiXVhQ ,咱俩都能得  2000Tokens ,虽然接口有点慢,但是用来测试软件还是挺好用的。


简介

什么是 RAG ?

RAGRetrieval-Augmented Generation)是一种结合了检索(Retrieval)和生成(Generation)的人工智能技术框架,主要用于提升自然语言处理(NLP)模型在处理复杂任务时的性能和准确性。它通过检索外部知识库中的信息,为生成模型提供更丰富的上下文和知识支持,从而生成更准确、更有信息量的内容。

什么是 Kotaemon ?

Kotaemon 是一个开源的基于 RAGRetrieval-Augmented Generation)技术的工具,旨在帮助用户与文档进行交互和对话。

主要特点

  • 自主托管文档问答(RAG)Web UI:支持多用户登录,可以组织您的文件为私有/公共集合,协作并与他人分享您最喜欢的聊天记录。
  • 组织您的 LLM 和嵌入模型:支持本地 LLM 和流行的 API 提供商(如 OpenAIAzureOllamaGroq)。
  • 混合 RAG 流水线:提供合理的默认 RAG 流水线,结合全文本和向量检索器,并进行重新排序,以确保最佳的检索质量。
  • 多模态问答支持:在多个文档上进行问答,支持图表和表格。支持多模态文档解析(在 UI 上可选择的选项)。
  • 高级引用与文档预览:系统默认提供详细的引用,以确保 LLM 答案的正确性。在浏览器内的 PDF 查看器中直接查看您的引用(包括相关评分),并对低相关性文章的检索管道发出警告。
  • 支持复杂推理方法:使用问题分解来回答复杂的多跳问题。支持基于代理的推理,如 ReActReWOO 和其他代理。
  • 可配置设置 UI:可以在 UI 上调整检索和生成过程中的大多数重要方面(包括提示)。
  • 可扩展性:基于 Gradio 构建,您可以自由自定义或添加任何 UI 元素。此外,我们旨在支持多种文档索引和检索策略。GraphRAG 索引流水线作为示例提供。

Kotaemon适合希望进行文档管理和问答的终端用户,以及希望构建定制化解决方案的开发者。

准备

因为会用到 LLMs 模型和 Embeddings 模型,所以需要提前准备。下面是可能会用上的模型和工具,请根据需要,选择性进行安装

文章传送门:

本次老苏使用的是 One API 管理的 kimi-free-apiOllama 中安装的nomic-embed-text

安装

在群晖上以 Docker 方式安装。

官方的镜像发布在 ghcr.io

  • ghcr.io/cinnamon/kotaemon:main-lite版本是精简版,适合大多数用户。
  • 若需支持更多文件类型(如.doc.docx等),可使用ghcr.io/cinnamon/kotaemon:main-full ,代价是 docker 镜像大小更大

docker cli 安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
9
# 运行容器
docker run -d \
--restart unless-stopped \
--name kotaemon \
-p 7860:7860 \
-v $(pwd)/data:/app/ktem_app_data \
-e GRADIO_SERVER_NAME=0.0.0.0 \
-e GRADIO_SERVER_PORT=7860 \
ghcr.io/cinnamon/kotaemon:main-full

关于环境变量的简单说明

可变
GRADIO_SERVER_NAME 指定允许从任何 IP 地址访问 Gradio 界面
GRADIO_SERVER_PORT 定义 Gradio 应用程序监听的端口

更多环境变量,可以参考官方的 .env.example 文件,地址:https://github.com/Cinnamon/kotaemon/blob/main/.env.example

docker-compose 安装

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'

services:
kotaemon:
image: ghcr.io/cinnamon/kotaemon:main-full
container_name: kotaemon
restart: unless-stopped
ports:
- "7860:7860"
volumes:
- ./data:/app/ktem_app_data
environment:
- GRADIO_SERVER_NAME=0.0.0.0
- GRADIO_SERVER_PORT=7860

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 kotaemon 和 子目录
mkdir -p /volume1/docker/kotaemon/data

# 进入 kotaemon 目录
cd /volume1/docker/kotaemon

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

初始化需要时间,当在日志中看到下面的内容,说明 kotaemon 已经就绪了

1
Running on local URL:  http://0.0.0.0:7860

在浏览器中输入 http://群晖IP:7860 就能看到设置界面

选择 I am an advance user. Skip this. 先直接跳过

添加 LLM 模型

Resources –> LLMs –> Add,这里使用了 One API 管理的 kimi-free-api

  • LLM name:例如 kimi
  • LLM vendors:下拉选择 ChatOpenAI
  • Specification:填入必要的参数,主要是下面三个,更多参数可以阅读右侧的表格
参数 描述
base_url One API 的地址
api_key One API 的令牌
model One API 中定义的模型名称
1
2
3
base_url: http://192.168.0.197:3033/v1
api_key: sk-7tB7PvWBs8oWUFJLFaF5F8EfC4Db43Ba9dE18698A0929c47
model: kimi
  • 勾选 Set default

Add LLM 添加成功后,切换到 View ,找到 kimi

点击打开后,找到 Test 按钮

如果显示 Connection success,说明添加成功了

添加 Embeddings 模型

和添加 LLMs 模型差不多,Resources –> Embeddings –> Add,这里直接使用了 Ollama 管理的 nomic-embed-text

  • Name:只是用于区别,所以随便起了一个 nomic-embed-text
  • Vendors:下拉选择 OpenAIEmbeddings
  • Specification:填入必要的参数,主要是下面三个,更多参数可以阅读右侧的表格
参数 描述
base_url Ollama 的地址
api_key Ollama 没有令牌,所以这里可以随便输入
model Ollama 中下载的嵌入文本模型
1
2
3
base_url: http://192.168.0.197:11434/v1/
api_key: sk-ollama
model: nomic-embed-text
  • 勾选 Set default

Add 添加成功后

切换到 View ,找到 nomic-embed-text

下拉找到 Test,如果显示 Connection success,说明添加成功了

一定要测试,确保设置无误,否则有可能上传文档会报错的

1
enacity.RetryError: RetryError[<Future at 0x7f5330250280 state=finished raised InternalServerError>]

上传文件

Files 进入文件界面,上传一个文件,点 Upload and Index

等待文件索引成功,时间取决于文件大小

也可以在聊天界面快速上传

索引创建成功后,就可以跟文件开始聊天了

默认回答是 英文 的,改成中文后,再次提问

现在的回答是中文了

脑图上点 export 会弹出新窗口

参考文档

Cinnamon/kotaemon: An open-source RAG-based tool for chatting with your documents.
地址:https://github.com/Cinnamon/kotaemon

Quick Start - kotaemon Docs
地址:https://cinnamon.github.io/kotaemon/