响应生成与引用
响应生成与引用
相关源文件
本章引用的主要源码文件:
agent/canvas.pyagent/component/agent_with_tools.pyagent/component/base.pyagent/component/categorize.pyagent/component/llm.pyagent/tools/base.pyapi/db/__init__.pyapi/db/db_models.pyapi/db/services/dialog_service.pyapi/db/services/document_service.pyapi/db/services/file_service.pyapi/db/services/knowledgebase_service.pyapi/db/services/llm_service.pyapi/db/services/task_service.pyapi/db/services/user_service.pycommon/mcp_tool_call_conn.pyrag/nlp/search.pyrag/prompts/generator.pyrag/raptor.pyrag/svr/task_executor.pyweb/src/components/document-preview/md/index.tsxweb/src/components/floating-chat-widget-markdown.tsxweb/src/components/highlight-markdown/index.tsxweb/src/components/markdown-content/index.tsxweb/src/components/next-markdown-content/index.tsxweb/src/constants/markdown-remark-plugins.tsweb/src/pages/next-search/markdown-content/index.tsx
目的与范围
本文档描述了 RAGFlow 的响应生成与引用系统,该系统将检索到的文档片段格式化为提示词(Prompt),流式传输大语言模型(LLM)响应,并插入内联引用,将答案链接回源文档。系统负责上下文组装、引用标记插入、引用追踪以及空响应处理。
系统总览
响应生成管线协调多个组件,从检索到的知识中生成带有引用的答案。它弥合了原始文档片段与连贯、可归因响应之间的差距。
响应生成数据流
来源: DialogService 协调:api/db/services/dialog_service.py:98-100 提示词生成函数:api/db/services/dialog_service.py:51-51 搜索逻辑集成:rag/nlp/search.py:132-140 对话模型字段:api/db/services/dialog_service.py:168-191
上下文格式化与 Token 管理
系统使用 kb_prompt() 将检索到的片段组装成结构化的提示词,同时遵守大语言模型的 Token 限制。
片段格式化实现
chunks_format() 函数将检索到的片段标准化为包含内容、文档 ID 和相似度分数的格式 api/db/services/dialog_service.py:51-51。在 DialogService 中,这些片段会通过 _chunk_kb_id_for_doc 处理,以包含 kb_id 等元数据,从而支持多数据集查询 api/db/services/dialog_service.py:63-66。
Token 截断
为防止上下文溢出,message_fit_in() 会计算对话历史中每条消息的 Token 数量,并截断内容以确保总 Token 数不超过模型限制 api/db/services/dialog_service.py:51-51。LLMBundle 在调用底层模型提供商之前,也会使用 num_tokens_from_string 对输入文本进行基于 Token 的截断 api/db/services/llm_service.py:101-106。
来源: 提示词生成逻辑:api/db/services/dialog_service.py:51-51 LLMBundle Token 安全性:api/db/services/llm_service.py:99-106 对话服务引用解析:api/db/services/dialog_service.py:57-58
引用机制与 UI 渲染
RAGFlow 实现了一个引用系统,将后端大语言模型输出与前端文档预览连接起来。
引用生成
citation_prompt() 函数为大语言模型提供如何引用来源的指令,通常使用与格式化上下文对应的标记 api/db/services/dialog_service.py:51-51。这确保了大语言模型将特定事实归因于系统提示词中提供的检索片段。
前端引用处理
前端使用专门的组件来渲染带有引用的响应。MarkdownContent 和 NextMarkdownContent 处理包含引用标记的文本片段 web/src/components/markdown-content/index.tsx web/src/components/next-markdown-content/index.tsx。
| 组件 | 角色 | 代码实体 |
|---|---|---|
| 后端提示词 | 指示大语言模型使用引用 | citation_prompt api/db/services/dialog_service.py:51-51 |
| 大语言模型封装 | 统一聊天接口 | LLMBundle api/db/services/llm_service.py:85-87 |
| 搜索处理器 | 提供片段元数据 | Dealer.SearchResult rag/nlp/search.py:42-51 |
| Markdown 渲染 | 渲染带引用的文本 | NextMarkdownContent web/src/components/next-markdown-content/index.tsx |
来源: 引用提示词定义:api/db/services/dialog_service.py:51-51 大语言模型执行:api/db/services/llm_service.py:171-180 Markdown 组件:web/src/components/next-markdown-content/index.tsx
元数据丰富
引用由通过 DocMetadataService 检索的详细文档元数据支持。
元数据流
- 检索:使用
Dealer类检索片段,字段包括doc_id、kb_id和img_idrag/nlp/search.py:149-153。 - 元数据获取:
DocMetadataService.get_metadata_for_documents用于获取当前页面中出现的文档的元数据api/db/services/document_service.py:107-107。 - 丰富:
enrich_chunks_with_document_metadata函数将这些元数据字段映射回片段,为引用提供上下文api/db/services/dialog_service.py:60-61。
来源: 搜索服务字段:rag/nlp/search.py:149-153 文档元数据映射:api/db/services/document_service.py:107-109 参考信息丰富:api/db/services/dialog_service.py:60-61
空响应与错误处理
RAGFlow 管理检索失败或用户未授权的情况。
空响应处理
当标准检索上下文不足时,ASK_SUMMARY 提示词被用作摘要任务的回退 api/db/services/dialog_service.py:51-51。如果未找到任何知识,系统通常依赖提示词配置来定义回退行为。
任务与文档状态
在生成之前,系统会使用 KnowledgebaseService.is_parsed_done() 检查知识库中的文档是否已完全解析 api/db/services/knowledgebase_service.py:106-136。如果任务失败或在 3 次尝试后被放弃,则会在 TaskService 中标记为放弃状态 api/db/services/task_service.py:130-141。
| 场景 | 处理机制 | 代码位置 |
|---|---|---|
| 解析未完成 | is_parsed_done 检查 | api/db/services/knowledgebase_service.py:106-136 |
| 任务被放弃 | 3 次重试后进度设置为 -1 | api/db/services/task_service.py:130-141 |
| 过期片段 | _prune_deleted_chunks 在 Dealer 中 | rag/nlp/search.py:76-118 |
| 模型用量限制 | increase_usage_by_id 失败 | api/db/services/llm_service.py:111-112 |
来源: 提示词回退:api/db/services/dialog_service.py:51-51 任务重试逻辑:api/db/services/task_service.py:130-141 文档健康检查:api/db/services/knowledgebase_service.py:106-136 过期数据清理:rag/nlp/search.py:76-118
流式传输实现
RAGFlow 支持使用服务器推送事件(SSE)进行实时响应流式传输。
流式传输数据流
LLMBundle.chat 方法与模型提供商交互以接收 Token 流。后端将这些片段传递给客户端。
来源:
- 大语言模型聊天执行:
api/db/services/llm_service.py:171-180 - Token 用量更新:
api/db/services/llm_service.py:111-112