文件与检索把一次上传变成模型上下文,中间经过上传校验、内容提取、OCR、全文注入、向量化、RAG 和上下文压缩。这一页给出真实顺序、回退规则,以及每一段对应的配置键。
入口位置#
管理端 > 文件与检索。页面按上传限制、内容提取、全文注入、向量化检索、语义增强、RAG 分组。上下文压缩在会话配置 > 上下文管理里配置。
一个文件怎么变成上下文#
- 上传时校验数量、大小、MIME 类型和用户存储配额。
- 保存文件并识别类型。
- 提取文本。图片走 OCR,PDF 可以回退到 OCR。
- 为每个附件分配上下文模式:
- 本轮图片或用户消息里的图片按原图直传。
- 其余文件在全文注入和 RAG 之间选择。
- 对进入 RAG 的附件,先把查询向量化,再检索片段,按相似度过滤,并受注入 Token 预算限制。
- 检索为空、失败或超时,且文件在全文限制内时回退全文;否则跳过该附件。
- 组装好的上下文按 Token 预算裁剪,超过轮次或 Token 阈值时执行压缩。
自动模式的全文 / RAG 判断是:
- 文件无法全文注入,或开启了 Token 预算保护且文件文本超过模型有效输入预算的 40% 时,走 RAG。
- 其余情况走全文注入。
全文注入模式不会走 RAG。向量检索模式优先 RAG,但文件不可检索时回退全文。用户侧的 chat.file_mode 只是个人偏好,平台仍会套用自己的限制。
上传限制#
| 配置项 | 配置键 | 说明 |
|---|---|---|
| 附件数量上限 | storage.max_message_files | 单条消息 1–50 个文件。 |
| 默认大小上限 | storage.max_upload_file_bytes | 单文件默认上限,页面单位为 MB。 |
| 用户存储配额 | storage.user_storage_quota_bytes | 每位用户的总存储,页面单位为 MB,0 表示不限。 |
| 附件 MIME 白名单 | file.allowed_mime_types | 逗号分隔,只有列出的类型可以上传。 |
| 图像大小上限 | file.image_max_bytes | 覆盖图像的默认上限,留空使用默认值。 |
| 文档大小上限 | file.doc_max_bytes | 覆盖文档的默认上限,留空使用默认值。 |
图像或文档的实际上限取默认上限与覆盖值中较小的一个。MIME 类型不在白名单里时,文件在提取之前就会被拒绝。
内容提取与 OCR#
| 配置项 | 配置键 | 说明 |
|---|---|---|
| 提取引擎 | extract.engine | builtin、tika、docling 或 mineru。 |
| Tika 来源 / 地址 / 密钥 / 超时 | extract.tika_source、extract.tika_base_url、extract.tika_auth_token、extract.tika_timeout_seconds | 来源取 external 或 managed。 |
| Docling 地址 / 密钥 / 超时 | extract.docling_base_url、extract.docling_auth_token、extract.docling_timeout_seconds | 适合版式复杂的文档。 |
| MinerU 类型 / 地址 / 文件类型 / 密钥 / 超时 | extract.mineru_source、extract.mineru_base_url、extract.mineru_file_types、extract.mineru_auth_token、extract.mineru_timeout_seconds | 类型取 cloud 或 self_hosted;文件类型取 pdf、word、presentation、excel。 |
| 图片 OCR | extract.image_ocr_enabled | 图片附件进入 OCR,默认关闭。 |
| PDF OCR 回退 | extract.pdf_ocr_fallback_enabled | PDF 原生文本缺失或质量差时启用 OCR,默认关闭。 |
| OCR 引擎 | extract.ocr_engine | rapidocr、tesseract、paddle、tencent、aliyun、mistral 或 llm。 |
选中的引擎不支持某个文件时,文档类文件会回退到内置提取器。PDF 开启 OCR 回退后,先探测原生文本层,只对薄弱页做选择性 OCR,仍不足时再整体 OCR。
每种 OCR 引擎需要各自的连接字段,例如 extract.rapidocr_base_url、extract.tesseract_ocr_base_url、extract.paddle_ocr_base_url、extract.tencent_ocr_secret_id、extract.aliyun_ocr_access_key_id、extract.mistral_ocr_base_url 和 extract.llm_ocr_base_url。LLM OCR 使用配置的视觉模型;Mistral OCR 需要地址、API Key 和模型。
图片 OCR 关闭时,图片不产生文本,只能发给支持视觉输入的模型。文档提取失败时,文件仍可预览,但没有可检索文本。
全文注入#
全文注入把提取文本直接放进模型上下文。它信息完整,适合小文件、合同和短代码,但会占用上下文。
| 配置项 | 配置键 | 说明 |
|---|---|---|
| 全文注入限制 | file.full_context_limit_enabled | 关闭后忽略大小、Token 和页数限制。 |
| 全文大小上限 | file.file_full_context_max_bytes | 提取文本字节数,页面单位为 MB,留空或 0 表示不限。 |
| 全文 Token 上限 | file.full_context_max_tokens | Token 预算,留空或 0 表示不限。 |
| 全文页数上限 | file.full_context_pdf_max_pages | PDF 页数,留空或 0 表示不限。 |
视频不会走全文注入。只有文本非空且不超过所有已启用限制的文件才会注入。放不下的文件在检索可用时转向 RAG,否则被跳过。
向量化检索与 Embedding#
必须先启用并配置 Embedding,才能开启 RAG 或语义召回。修改模型、维度或接入地址会把已有向量标记为失效。
| 配置项 | 配置键 | 说明 |
|---|---|---|
| 启用 Embedding | file.embedding_enabled | 向量化和检索的前提。 |
| Embedding 服务地址 / 鉴权密钥 | file.embedding_host、file.embedding_key | 服务需兼容 OpenAI /embeddings 接口。 |
| Embedding 模型 | file.rag_model | 变更后旧向量失效。 |
| Embedding 超时 | file.embedding_timeout_seconds | 单次请求等待秒数。 |
| 向量维度 | file.embedding_output_dimensions | 64–4096,必须与模型输出一致。 |
| 维度参数策略 | file.embedding_dimensions_policy | send 携带 dimensions;omit 不携带,但仍按配置维度校验返回向量。 |
| 归一化向量 | file.embedding_normalize | 写库和检索前做 L2 归一化。 |
| 自动向量化 | file.embed_trigger_on_upload | 上传后自动触发向量化。 |
| 批次大小 | file.embed_batch_size | 单次请求携带的文本片段数。 |
| 分片大小 | file.embed_chunk_size_tokens | 按 Token 估算的分片大小。 |
| 分片重叠 | file.embed_chunk_overlap_tokens | 相邻分片的 Token 重叠。 |
| 召回片段数 | file.rag_top_k | 最终返回并注入的片段数,1–50。 |
服务商拒绝 dimensions 参数时用 omit。返回向量仍会按 file.embedding_output_dimensions 校验,尺寸不符会直接失败,不会写入错误维度的向量。
向量索引状态#
状态面板会显示模型签名和各状态的计数。首次保存后签名自动生成。
| 状态 | 含义 | 处理方式 |
|---|---|---|
| 就绪 | 向量与当前签名一致。 | 可以正常检索。 |
| 失效 | 模型、维度或接入地址已变更。 | 点击重建索引。 |
| 待处理 | 文件排队或处理中。 | 等任务完成后再测试检索。 |
| 无文本 | 提取没有产出文本,没有可向量化内容。 | 检查提取;修好 OCR 后可用重建含无文本文件。 |
| 失败 | 向量化失败。 | 检查提取文本、Embedding 服务和分片参数。 |
尚未建立索引时,面板会提示暂无数据,配置 Embedding 服务后才可用。只要存在失效向量,就会出现重建提示。重建是后台任务,文件越多耗时越长。
RAG#
| 配置项 | 配置键 | 说明 |
|---|---|---|
| RAG 开关 | chat.rag_enabled | 需要可用的 Embedding 服务。 |
| 相似度阈值 | chat.rag_min_similarity | 片段注入的最低分数。 |
| 注入 Token 预算 | chat.rag_token_budget | 检索片段可占用的上下文预算。 |
| 抓取倍数 | chat.rag_fetch_multiplier | 先抓取 top_k × 倍数 个候选再过滤。 |
| 就绪等待时长 | chat.rag_wait_ready_ms | 发送前等待检索的最长时间。 |
| 历史拼接轮次 | chat.rag_query_history_turns | 生成检索查询时带入的最近用户轮次。 |
| 检索缓存时长 | chat.rag_retrieval_cache_ttl_seconds | 缓存检索结果,0 表示不缓存。 |
| 混合检索 | chat.rag_hybrid_enabled | 并行执行向量检索和全文检索,用 RRF 合并。 |
缓存键包含查询、Embedding 地址与模型、维度、检索参数,以及每个文件的 ID、分片数、向量状态和更新时间,所以编辑文件会让对应缓存失效。
阈值太高可能召回为空,太低会带入噪声。没有片段通过时,系统不会注入无关内容,而是在文件放得下时回退全文,否则跳过。如果显式选择了知识库,知识库不可用会直接终止发送,召回为空则只给出“没有知识库依据”的提示。
语义增强#
| 配置项 | 配置键 | 说明 |
|---|---|---|
| 消息向量化 | chat.message_embedding_enabled | 每轮结束后生成消息向量,需要 Embedding 服务。 |
| 语义上下文召回 | chat.semantic_context_enabled | 发送前召回历史相关片段,需要先开启消息向量化。 |
消息向量化未开启时无法开启语义上下文召回。两者共用 Embedding 服务,修改 Embedding 配置也会影响历史召回效果。
上下文压缩#
压缩在会话配置 > 上下文管理里配置,用于把较早的对话整理成摘要,让长会话保持在模型预算内。
| 配置项 | 配置键 | 说明 |
|---|---|---|
| 上下文压缩 | chat.context_compact_enabled | 总开关;用户仍可在聊天设置里选择不使用。 |
| Token 预算保护 | chat.context_token_budget_enabled | 按模型有效输入预算裁剪历史。 |
| 压缩触发轮次 | chat.context_max_turns | 超过该轮次时触发,0 表示关闭。 |
| 默认上下文窗口 | chat.context_window_fallback_tokens | 无法识别模型窗口时使用。 |
| 压缩触发比例 | chat.context_compact_trigger_percent | 达到有效输入预算的该比例时触发,0 表示关闭。 |
| 原文保留轮次 | chat.context_compact_preserve_recent_turns | 压缩时保留的最近原始轮次。 |
| 每角色摘要条数 | chat.context_compact_highlights_per_role | 用户和助手各自保留的摘要条数。 |
| 片段字符上限 | chat.context_compact_snippet_chars | 单条消息片段的最大字符数。 |
| 证据保留天数 | chat.context_artifact_retention_days | RAG、历史和工具证据的保留时长,0 表示不自动过期。 |
| 后台执行压缩 | chat.compact_async_enabled | 回复完成后执行压缩。 |
| LLM 压缩 | chat.compact_llm_enabled | 用模型生成语义摘要;关闭时只用模板摘要。 |
| 压缩模型 | chat.compact_task_model | follow 表示跟随当前模型,非聊天模型回退到默认聊天模型。 |
| 熔断阈值 | chat.compact_max_failures | 连续失败达到该次数后降级为模板摘要。 |
| 全量 / 轻量摘要提示词 | chat.compact_system_prompt、chat.compact_light_prompt | 自定义摘要指令。 |
回退规则#
| 条件 | 系统行为 |
|---|---|
| 上传校验失败 | 文件被拒绝。 |
| 提取失败 | 文件可预览,但没有可检索文本。 |
| OCR 关闭或失败 | 图片或扫描件文本对不支持视觉的模型不可用。 |
| 全文超过限制 | 文件转向 RAG;检索不可用时跳过。 |
| Embedding 未启用 | RAG 和语义召回不可用。 |
| 索引失效或失败 | 检索不完整,需要重建索引。 |
| RAG 召回为空 | 不注入无关片段;放得下时回退全文。 |
| 上下文过长 | 执行 Token 预算裁剪或压缩。 |
验证配置#
- 设置上传数量、大小、MIME、图像与文档上限和存储配额。
- 配置提取引擎,用 PDF、Word、表格和文本文件分别测试。
- 只在需要时开启图片 OCR 和 PDF OCR 回退,并配置对应引擎。
- 为小文档开启全文注入限制。
- 配置 Embedding 服务、模型、维度、分片和自动向量化。
- 上传样例文件,确认索引状态为就绪。
- 开启 RAG,调整相似度阈值、召回片段数、Token 预算和混合检索。
- 长会话场景再开启消息向量化、语义召回和上下文压缩。
常见问题#
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 上传被拒绝 | MIME 类型、大小、数量或配额。 | 检查白名单以及大小、配额限制。 |
| 模型答不到文件内容 | 提取失败或索引未就绪。 | 检查提取状态、预览文本和索引状态。 |
| PDF 没有文本 | 属于扫描件,且 PDF OCR 回退关闭。 | 开启 PDF OCR 回退并配置 OCR 引擎。 |
| RAG 召回为空 | 阈值过高、索引失效,或没有分片。 | 调低阈值、重建索引,并检查 file.rag_top_k。 |
| 检索很慢 | Embedding 服务慢,或 chat.rag_wait_ready_ms 过长。 | 检查服务延迟并调低等待时长。 |
| 结果忽略更早的对话 | 消息向量化或语义召回未开启。 | 先开启消息向量化,再开启语义上下文召回。 |
| 长会话丢失早期信息 | 压缩触发太晚,或保留轮次太少。 | 调低触发比例,提高原文保留轮次。 |
参考:配置键#
| 链路 | 配置键 |
|---|---|
| 上传限制 | storage.max_message_files、storage.max_upload_file_bytes、storage.user_storage_quota_bytes、file.allowed_mime_types、file.image_max_bytes、file.doc_max_bytes |
| 提取引擎 | extract.engine、extract.tika_source、extract.tika_base_url、extract.tika_auth_token、extract.tika_timeout_seconds、extract.docling_base_url、extract.docling_auth_token、extract.docling_timeout_seconds、extract.mineru_source、extract.mineru_base_url、extract.mineru_file_types、extract.mineru_auth_token、extract.mineru_timeout_seconds |
| OCR 开关 | extract.image_ocr_enabled、extract.pdf_ocr_fallback_enabled、extract.ocr_engine |
| 本地 OCR | extract.rapidocr_source、extract.rapidocr_base_url、extract.rapidocr_auth_token、extract.rapidocr_timeout_seconds、extract.tesseract_ocr_base_url、extract.tesseract_ocr_auth_token、extract.tesseract_ocr_timeout_seconds、extract.paddle_ocr_base_url、extract.paddle_ocr_auth_token、extract.paddle_ocr_timeout_seconds |
| 云与 LLM OCR | extract.tencent_ocr_secret_id、extract.tencent_ocr_secret_key、extract.tencent_ocr_region、extract.tencent_ocr_endpoint、extract.tencent_ocr_timeout_seconds、extract.aliyun_ocr_access_key_id、extract.aliyun_ocr_access_key_secret、extract.aliyun_ocr_region、extract.aliyun_ocr_endpoint、extract.aliyun_ocr_timeout_seconds、extract.mistral_ocr_base_url、extract.mistral_ocr_auth_token、extract.mistral_ocr_model、extract.mistral_ocr_timeout_seconds、extract.llm_ocr_base_url、extract.llm_ocr_auth_token、extract.llm_ocr_model、extract.llm_ocr_timeout_seconds、extract.llm_ocr_prompt |
| 全文注入 | file.full_context_limit_enabled、file.file_full_context_max_bytes、file.full_context_max_tokens、file.full_context_pdf_max_pages |
| Embedding | file.embedding_enabled、file.embedding_host、file.embedding_key、file.rag_model、file.embedding_timeout_seconds、file.embedding_output_dimensions、file.embedding_dimensions_policy、file.embedding_normalize、file.embed_trigger_on_upload、file.embed_batch_size、file.embed_chunk_size_tokens、file.embed_chunk_overlap_tokens |
| 语义增强 | chat.message_embedding_enabled、chat.semantic_context_enabled |
| RAG | chat.rag_enabled、file.rag_top_k、chat.rag_min_similarity、chat.rag_token_budget、chat.rag_fetch_multiplier、chat.rag_wait_ready_ms、chat.rag_query_history_turns、chat.rag_retrieval_cache_ttl_seconds、chat.rag_hybrid_enabled |
| 上下文压缩 | chat.context_compact_enabled、chat.context_token_budget_enabled、chat.context_max_turns、chat.context_window_fallback_tokens、chat.context_compact_trigger_percent、chat.context_compact_preserve_recent_turns、chat.context_compact_highlights_per_role、chat.context_compact_snippet_chars、chat.context_artifact_retention_days、chat.compact_async_enabled、chat.compact_llm_enabled、chat.compact_task_model、chat.compact_max_failures、chat.compact_system_prompt、chat.compact_light_prompt |