
Kotaemon v0.0.1 功能全景解析多 Agent 聊天、会话与用户管理、流水线化设置的完整实现【免费下载链接】kotaemonAn open-source RAG-based tool for chatting with your documents.项目地址: https://gitcode.com/GitHub_Trending/kot/kotaemonKotaemon 是一个开源的 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()返回流水线的id、name与description供应用组织与展示例如在设置页显示流水线名称与简介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 问答链路FullQAPipelineSimple QA是默认的 RAG 流水线其get_info()描述为“同时执行关键词检索与相似度检索再将检索上下文交给 LLM 生成答案”。其核心执行流程位于stream()方法可以归纳为一条完整调用链可选问题改写当触发“重新生成”regen时由RewriteQuestionPipeline重写用户问题检索retrieve()遍历所有配置的retrievers对每个检索器执行retriever_node(textquery)并按doc_id去重聚合结果证据准备PrepareEvidencePipeline将检索文档整理为证据与图片回答生成AnswerWithContextPipeline或AnswerWithInlineCitation结合证据流式生成答案后处理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。同一文件中的FullDecomposeQAPipelineComplex QA则实现了“问题分解”先由DecomposeQuestionPipeline把复杂问题拆成多个子问题逐个检索并回答最后把子问题答案拼接为额外证据喂给主问题的回答流水线。2.3 ReAct Agent思考—行动—观察循环react.py 中的ReactAgentPipeline基于 ReAct 范式planning acting实现。其stream()方法会逐步产出每个“思考/行动/观察”步骤并用prepare_citation()把每一步渲染成信息面板中的可折叠证据块。该流水线默认注册四类工具TOOL_REGISTRY工具名对应类说明GoogleGoogleSearchTool联网搜索WikipediaWikipediaTool维基百科检索LLMLLMTool调用 LLM 推理SearchDocDocSearchTool检索内部文档复用配置的 retrieversDocSearchTool会把检索到的表格、图片、聊天窗口等不同metadata[type]的内容按类型格式化拼接为证据并用CharacterTextSplitter按 4000 token 截断以控制上下文长度。用户可配置项包括 LLM、工具勾选默认SearchDocLLM、最大迭代次数默认 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_prompt、solver_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每条会话包含idUUID、name、user、is_public是否公开分享、data_sourceJSON 字段存储消息、当前文件与聊天建议以及date_created/date_updated时间戳未命名时会话默认生成Untitled - YYYY-MM-DD HH:MM:SS格式的名称。会话重命名有明确的校验规则is_conv_name_valid()规定名称不能为空、长度不能超过 40 个字符否则返回错误提示。会话相关工具函数集中在 utils/conversation.pysync_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_query、test_format_mentions_use_html_strong与test_get_mentions_regex_unquoted_filename_with_asterisks可直接用于验证提及解析的正确性。四、文件上传与上下文选择4.1 上传与索引文件上传由 index/file/ui.py 实现。其中自定义的File(gr.File)组件用于保留原始文件名避免!#$%^*().pdf这类特殊字符被 Gradio 改写并定义了MAX_FILENAME_LENGTH 20与MAX_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 的BaseUserusername/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。该页面按命名空间组织为多个 TabGeneralapplication.*应用级通用设置Retrieval settingsindex.options.*按索引类型如 File Index展示检索配置Reasoning settingsreasoning.*与reasoning.options.*先展示全局推理设置再按流水线 idsimple/complex/ReAct/ReWOO分组展示各自的专用设置。其底层渲染机制是render_setting_item()设置项声明中的component字段决定 UI 组件类型——text、number、checkbox映射到单值组件dropdown、radio、checkboxgroup映射到选择类组件见 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 厂商包括ChatOpenAI、AzureChatOpenAI、Anthropic、Gemini、Cohere、Ollama 与LlamaCppChat本地模型并可通过KH_LLM_EXTRA_VENDORS扩展自定义厂商。七、Info Panel证据、引用与附加信息展示变更日志中的“Info panel”承担着支撑性信息展示职责检索到的证据evidence、引用与参考来源都会在此呈现。这一机制贯穿三种流水线Simple QAshow_citations_and_addons()先清空信息面板再依次输出 Mindmap、引用可视化图、低相关度警告基于llm_trulens_score与CONTEXT_RELEVANT_WARNING_SCORE阈值比较、答案置信度分数以及“带引用 / 不带引用”两组证据见 simple.pyReAct / ReWOO每个思考步骤、Planner 计划与 Worker 执行日志都会格式化为可折叠信息块Render.collapsibleRender.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 至今沿用的四条架构原则插件化的推理引擎所有聊天流水线统一继承BaseReasoning通过get_info()/get_user_settings()/get_pipeline()三件套即可注册新流水线无需改动应用框架统一的数据持久层会话、用户、设置、索引配置全部落在 SQLModel 定义的数据库表中见 db/models.py且可通过KH_TABLE_CONV、KH_TABLE_USER、KH_TABLE_SETTINGS等配置替换为自定义表两级设置体系通用设置与流水线级设置分离设置项以声明式字典驱动 Gradio UI 自动渲染实现“配置即界面”证据优先的问答体验无论 Simple、ReAct 还是 ReWOO检索证据都会结构化地呈现在 Info Panel 中并支持引用高亮与置信度提示。因此阅读这份 changelogs 不只是了解一个版本的功能清单更是理解 Kotaemon“可扩展 RAG 应用框架”的最佳入口从 libs/ktem/ktem/reasoning/ 出发沿BaseReasoning→ 具体流水线 →get_user_settings→SettingsPage的链路即可快速掌握其扩展机制而后续版本中出现的 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),仅供参考