Kotaemon v0.0.1 功能全景解析:多 Agent 聊天、会话与用户管理、流水线化设置的完整实现
2026/9/15 3:22:04 网站建设 项目流程

Kotaemon v0.0.1 功能全景解析:多 Agent 聊天、会话与用户管理、流水线化设置的完整实现

【免费下载链接】kotaemonAn open-source RAG-based tool for chatting with your documents.项目地址: https://gitcode.com/GitHub_Trending/kot/kotaemon

Kotaemon 是一个开源的 RAG(检索增强生成)文档问答工具,而 libs/ktem/ktem/assets/md/changelogs.md 中的 v0.0.1 变更日志,恰好勾勒出该项目第一版的完整能力骨架:三种聊天推理流水线(Simple / ReWOO / ReAct)、会话与文件管理、用户系统、双层级设置体系与信息面板。本文将以这份变更日志为主线,结合libs/ktem/的源码实现,逐项拆解每个功能背后的架构设计与调用链,帮助读者快速建立对该项目核心代码的全局认知。

一、变更日志总览:v0.0.1 的七大能力

v0.0.1 是 Kotaemon 的第一个正式版本,其变更日志虽然简短,却覆盖了一个文档问答产品所需的全部核心闭环:

  • Chat:支持以 simple pipeline、rewoo 和 react 三种方式与聊天机器人交互;
  • Chat:会话管理——创建、删除、重命名会话;
  • Files:上传文件;
  • Files:选择文件作为聊天机器人的上下文;
  • User management:创建用户、登录、登出、修改密码;
  • Setting:通用设置与基于流水线(pipeline)的设置;
  • Info panel:展示 Cinnamon AI 与 Kotaemon 信息。

下文将按“推理引擎 → 会话 → 文件 → 用户 → 设置 → 信息面板”的顺序,逐一对应源码说明其实现方式。其中推理引擎对应 libs/ktem/ktem/reasoning/,会话管理对应 libs/ktem/ktem/pages/chat/,用户与设置对应 libs/ktem/ktem/pages/login.py 与 libs/ktem/ktem/pages/settings.py。

二、Chat:三种推理流水线的统一抽象与实现

2.1 统一接口 BaseReasoning

无论采用哪种推理模式,所有流水线都继承自 libs/ktem/ktem/reasoning/base.py 中的BaseReasoning。该基类定义了三个关键类方法,构成“流水线注册 → 用户配置 → 实例化执行”的标准契约:

  • get_info():返回流水线的idnamedescription,供应用组织与展示(例如在设置页显示流水线名称与简介);
  • get_user_settings():声明该流水线特有的用户可配置项及其默认值;
  • get_pipeline(user_settings, state, retrievers):根据用户设置、会话状态与检索器列表构建可执行的流水线实例。

此外,run()是每个流水线处理单条用户消息的入口,stream()则在多数实现中负责流式产出聊天内容与证据信息。

从源码结构看,v0.0.1 提到的“simple pipeline、rewoo 和 react agents”分别对应 simple.py 中的 Simple QA / Complex QA、rewoo.py 中的 ReWOO Agent、react.py 中的 ReAct Agent,它们通过reasoning.use设置项切换(见 pages/settings.py 中change_reasoning_mode的实现)。

2.2 Simple Pipeline:标准 RAG 问答链路

FullQAPipeline(Simple QA)是默认的 RAG 流水线,其get_info()描述为“同时执行关键词检索与相似度检索,再将检索上下文交给 LLM 生成答案”。其核心执行流程位于stream()方法,可以归纳为一条完整调用链:

  1. (可选)问题改写:当触发“重新生成”(regen)时,由RewriteQuestionPipeline重写用户问题;
  2. 检索retrieve()遍历所有配置的retrievers,对每个检索器执行retriever_node(text=query),并按doc_id去重聚合结果;
  3. 证据准备PrepareEvidencePipeline将检索文档整理为证据与图片;
  4. 回答生成AnswerWithContextPipeline(或AnswerWithInlineCitation)结合证据流式生成答案;
  5. 后处理replace_think_tag_with_details处理推理模型的<think>标签,show_citations_and_addons输出引用、思维导图与引用可视化。

该流水线的用户设置项(见get_user_settings())包括:LLM 选择、引用样式(highlight / inline / off)、是否生成 Mindmap、是否生成 Embeddings 可视化、是否启用多模态输入、System Prompt、QA Prompt、纳入的交互轮数(n_last_interactions,默认 5)以及触发上下文重写的消息长度阈值(trigger_context,默认 150)。

同一文件中的FullDecomposeQAPipeline(Complex QA)则实现了“问题分解”:先由DecomposeQuestionPipeline把复杂问题拆成多个子问题,逐个检索并回答,最后把子问题答案拼接为额外证据喂给主问题的回答流水线。

2.3 ReAct Agent:思考—行动—观察循环

react.py 中的ReactAgentPipeline基于 ReAct 范式(planning + acting)实现。其stream()方法会逐步产出每个“思考/行动/观察”步骤,并用prepare_citation()把每一步渲染成信息面板中的可折叠证据块。

该流水线默认注册四类工具(TOOL_REGISTRY):

工具名对应类说明
GoogleGoogleSearchTool联网搜索
WikipediaWikipediaTool维基百科检索
LLMLLMTool调用 LLM 推理
SearchDocDocSearchTool检索内部文档(复用配置的 retrievers)

DocSearchTool会把检索到的表格、图片、聊天窗口等不同metadata["type"]的内容按类型格式化拼接为证据,并用CharacterTextSplitter按 4000 token 截断以控制上下文长度。用户可配置项包括 LLM、工具勾选(默认SearchDoc+LLM)、最大迭代次数(默认 5)与 QA Prompt。get_pipeline()中还支持把 MCP 服务器注册的工具(MCP_TOOL_PREFIX前缀)动态加入工具列表。

2.4 ReWOO Agent:先规划后执行

rewoo.py 中的RewooAgentPipeline采用 ReWOO 范式(planning with reduced hallucination):第一阶段由Planner生成带证据变量(#E1#E2…)的分步计划,第二阶段由Solver根据计划与检索到的证据汇总答案。因此它允许为 Planner 与 Solver分别配置不同的 LLMplanner_llm/solver_llm),并额外支持highlight_citation勾选项与可自定义的planner_promptsolver_prompt(默认提示词模板均定义于该文件顶部)。

执行时,stream()会把 Planner 输出(planner_log)与每个 Worker 步骤日志(worker_log)分别格式化为信息面板中的折叠块,最终答案则通过prepare_citation()基于SequenceMatcher做证据定位并高亮引用片段。

三、会话管理:创建、删除、重命名与消息上下文

变更日志中的“conversation management: create, delete, rename conversations”由 pages/chat/control.py 中的ConversationControl组件承载。会话数据模型见 db/base_models.py 的BaseConversation:每条会话包含id(UUID)、nameuseris_public(是否公开分享)、data_source(JSON 字段,存储消息、当前文件与聊天建议)以及date_created/date_updated时间戳;未命名时会话默认生成Untitled - YYYY-MM-DD HH:MM:SS格式的名称。

会话重命名有明确的校验规则:is_conv_name_valid()规定名称不能为空、长度不能超过 40 个字符,否则返回错误提示。会话相关工具函数集中在 utils/conversation.py:

  • sync_retrieval_n_message():保证消息历史与检索历史长度一致,不足部分以空串补齐;
  • prepare_llm_query():从聊天气泡展示文本中剥离@提及与 URL,还原出真正发给 LLM 的问题;
  • format_mentions_for_display()/get_mentions_regex():规范化并高亮@文件名@WebSearch等提及语法(对应正则_MENTION_PATTERN)。

这些逻辑都有对应的单元测试,见 ktem_tests/test_conversation.py,例如test_prepare_llm_querytest_format_mentions_use_html_strongtest_get_mentions_regex_unquoted_filename_with_asterisks,可直接用于验证提及解析的正确性。

四、文件:上传与上下文选择

4.1 上传与索引

文件上传由 index/file/ui.py 实现。其中自定义的File(gr.File)组件用于保留原始文件名(避免!@#$%^&*().pdf这类特殊字符被 Gradio 改写),并定义了MAX_FILENAME_LENGTH = 20MAX_FILE_COUNT = 200的限制。上传后的文件会进入索引流程,索引实例由 index/manager.py 统一管理:build_index()把索引配置写入数据库并实例化索引对象,on_application_startup()则在应用启动时加载KH_INDICES配置中声明的索引并启动全部存量索引。

4.2 将文件作为对话上下文

v0.0.1 支持“选择文件作为聊天上下文”。在会话设置面板中,文件选择有三种模式:Disabled(不检索任何文件)、Search All(检索全部文件)、Select(通过下拉框指定若干文件参与检索)。更进一步,用户可以在输入框内直接通过@文件名提及指定文件,或用@WebSearch触发联网搜索——输入框的占位提示即 “Type a message, use @WebSearch, or tag a file with @filename”(见 pages/chat/chat_panel.py),前端通过 Tribute 库实现@提及菜单(见 index/file/ui.py 中的update_file_list_js)。这些提及最终由prepare_llm_query()解析为纯文本问题后再进入推理流水线。

补充说明:变更日志中“文件上传”“文件作为上下文”的交互界面可参考仓库文档 docs/pages/app/index/file.md 与 docs/pages/app/index/features.md,它们在后续版本中持续演进(如新增 GraphRAG 索引等),但 v0.0.1 的核心链路——上传 → 索引 → 检索 → 上下文注入——一直保持至今。

五、用户管理:登录、登出与密码

用户管理由 pages/login.py 中的LoginPage实现,数据模型为 db/base_models.py 的BaseUser

  • username/username_lower:均带唯一约束,username_lower用于大小写不敏感的登录匹配;
  • password:存储的是SHA-256 哈希hashlib.sha256(pwd.encode()).hexdigest()),而非明文;
  • admin:标识管理员用户。

登录校验通过用户名(转小写)匹配User表中的哈希密码;修改密码在 pages/settings.py 的change_password()中完成,先经validate_password()校验两次输入一致,再以哈希写入数据库。登出则通过onSignOut公共事件广播,联动清理会话状态与前端存储。

此外,登录页预留了 SSO 能力:当KH_SSO_ENABLED开启时,通过gradiologin获取外部身份(如邮箱),自动创建本地用户记录(见login()中对grlogin.get_user(request)的分支处理)。

六、设置系统:通用设置与流水线级设置

v0.0.1 的另一项核心能力是“common settings and pipeline-based settings”,对应 pages/settings.py 中的SettingsPage。该页面按命名空间组织为多个 Tab:

  • Generalapplication.*):应用级通用设置;
  • Retrieval settingsindex.options.*):按索引类型(如 File Index)展示检索配置;
  • Reasoning settingsreasoning.*reasoning.options.*):先展示全局推理设置,再按流水线 id(simple/complex/ReAct/ReWOO)分组展示各自的专用设置。

其底层渲染机制是render_setting_item():设置项声明中的component字段决定 UI 组件类型——textnumbercheckbox映射到单值组件,dropdownradiocheckboxgroup映射到选择类组件(见 pages/settings.py)。切换reasoning.use时,change_reasoning_mode()控制各流水线设置分组的显隐。

设置采用“用户级持久化”:save_setting()把整份设置字典按用户写入Settings表(JSON 字段),load_setting()在登录或应用加载时回填(见 db/base_models.py)。同时 components.py 中的ModelPool为模型池提供统一访问:支持通过default标记设置默认模型(多个默认时随机取一),并按accuracy/cost元信息排序,提供“最高准确率”“最低成本”等快捷选取。

模型池(LLM / Embedding)的具体管理逻辑见 llms/manager.py 与 embeddings/manager.py:它们从KH_LLMS等配置(或数据库中的LLMTable/EmbeddingTable)反序列化模型实例,支持 add / update / delete 的增删改操作,并通过get_default()/get_random()提供默认与随机选取。预置的 LLM 厂商包括ChatOpenAIAzureChatOpenAI、Anthropic、Gemini、Cohere、Ollama 与LlamaCppChat(本地模型),并可通过KH_LLM_EXTRA_VENDORS扩展自定义厂商。

七、Info Panel:证据、引用与附加信息展示

变更日志中的“Info panel”承担着支撑性信息展示职责:检索到的证据(evidence)、引用与参考来源都会在此呈现。这一机制贯穿三种流水线:

  • Simple QAshow_citations_and_addons()先清空信息面板,再依次输出 Mindmap、引用可视化图、低相关度警告(基于llm_trulens_scoreCONTEXT_RELEVANT_WARNING_SCORE阈值比较)、答案置信度分数以及“带引用 / 不带引用”两组证据(见 simple.py);
  • ReAct / ReWOO:每个思考步骤、Planner 计划与 Worker 执行日志都会格式化为可折叠信息块(Render.collapsible+Render.table),最终答案还会对证据文本做高亮定位。

用户可以通过“信息面板展开”按钮(见 pages/chat/control.py 中的btn_info_expand)调整面板宽度,以便对照阅读答案与证据。

说明:关于 Info Panel 中引用评分、警告阈值等更细粒度的展示效果,仓库文档 docs/pages/app/functional-description.md 与 docs/pages/app/customize-flows.md 提供了后续版本的界面与扩展说明,可作为理解该模块演进的补充资料。

八、总结:从 v0.0.1 看 Kotaemon 的架构基因

梳理 v0.0.1 变更日志与对应源码,可以提炼出 Kotaemon 至今沿用的四条架构原则:

  1. 插件化的推理引擎:所有聊天流水线统一继承BaseReasoning,通过get_info()/get_user_settings()/get_pipeline()三件套即可注册新流水线,无需改动应用框架;
  2. 统一的数据持久层:会话、用户、设置、索引配置全部落在 SQLModel 定义的数据库表中(见 db/models.py),且可通过KH_TABLE_CONVKH_TABLE_USERKH_TABLE_SETTINGS等配置替换为自定义表;
  3. 两级设置体系:通用设置与流水线级设置分离,设置项以声明式字典驱动 Gradio UI 自动渲染,实现“配置即界面”;
  4. 证据优先的问答体验:无论 Simple、ReAct 还是 ReWOO,检索证据都会结构化地呈现在 Info Panel 中,并支持引用高亮与置信度提示。

因此,阅读这份 changelogs 不只是了解一个版本的功能清单,更是理解 Kotaemon“可扩展 RAG 应用框架”的最佳入口:从 libs/ktem/ktem/reasoning/ 出发,沿BaseReasoning→ 具体流水线 →get_user_settingsSettingsPage的链路,即可快速掌握其扩展机制;而后续版本中出现的 GraphRAG、MCP 工具等能力,都是在 v0.0.1 这套骨架上生长出来的。

【免费下载链接】kotaemonAn open-source RAG-based tool for chatting with your documents.项目地址: https://gitcode.com/GitHub_Trending/kot/kotaemon

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询