Dify聊天正常却无法建库:用验收矩阵拆穿假绿灯

一套 Dify 环境准备上线,负责人做了两项检查:模型供应商页面显示验证成功,测试聊天也能正常回复。会议里很快出现了那句熟悉的话:"模型已经接通了。"

随后,第一批文档进入知识库。解析完成,索引却失败;换成小文件后偶尔成功,恢复真实批量又开始超时。有人建议换 API Key,有人准备重装服务,还有人提出把所有超时参数统一放大。每个建议都可能碰巧改善现象,却没有回答最关键的问题:前面那两项成功,究竟证明了什么?

问题出在"接通"这个词太大。凭据校验、聊天生成、文本向量化、文档索引和工作流执行不是同一个动作。它们可能共用一套供应商配置,却分别依赖不同的模型类型、资源路径、请求字段、响应结构和时间预算。某一步出现绿灯,只能说明这一步完成,不能替未执行的链路签字。

本文不再给出一份从上到下照抄的配置教程,而是建立一张可证伪的验收矩阵。每一行只回答一个问题,每一个结论都配一项能够推翻它的实验。目标不是尽快把页面变绿,而是把"知识库不可用"收敛为某个可以复现、定位、修复和回归验证的具体故障。

先把"模型可用"拆成六个命题

验收的第一步不是发请求,而是改写问题。不要问"模型能不能用",应当分别问:凭据校验能否通过、LLM 能否生成、Text Embedding 能否返回向量、小批量向量化是否稳定、文档能否完成索引、工作流能否在预算内走完。六个问题对应六行记录,不允许用其中一行的成功填满整张表。

Dify 的模型插件把 LLM、Text Embedding、Rerank 等能力区分为不同模型类型。类型不是界面上的装饰标签,而是调用方法、输入输出和后续处理的选择条件。LLM 返回生成结果,Text Embedding 返回与输入对应的向量;知识库建索引依赖的不是"模型会说话",而是文本能否经过向量化并被后续组件接收。

因此,"凭据验证成功"只说明插件执行的校验路径得到了可接受的结果。校验请求可能与真实业务请求不同,不能证明所有模型标识都有权限,也不能证明每种能力都实现了对应契约。"聊天成功"则多证明了一步:在当前网络、凭据、模型标识和输入条件下,LLM 链路可用。它依旧没有执行 Embedding 调用,更没有触碰索引写入。

一张最小验收矩阵至少应包含:验收对象、触发入口、模型类型、实际模型标识、最终请求路径、预期响应、实际结果、耗时、追踪标识和结论边界。结论边界尤其重要。例如"LLM 单轮非流式基线通过"是合格记录,"供应商全部正常"则是证据越界。

每一行再加一个反证实验。声称凭据有效,就用目标能力真实调用一次;声称 Embedding 可用,就检查返回项数量、数值类型和维度;声称超时来自上游,就证明请求确实到达上游且外层计时器没有先到期。反证不是抬杠,而是阻止团队把一个舒服的解释提前当成事实。

矩阵还有一个好处:它天然允许"未知"。没有捕获最终 URL,就把路径写成未知;客户端断开后无法确认服务端状态,就把结果写成未知。未知项会推动下一次取证,而虚构出来的完整结论只会让排查在错误方向上越走越远。

怎样写出一行可以复核的结论

矩阵不是把"正常""异常"换成更复杂的表格。合格的一行记录应同时包含条件、观察和边界。例如:"在 Dify 工作容器内,使用当前凭据和固定模型标识发送单条中文输入,向量接口返回一项有限数值数组,维度与本轮基线一致,用时一点八秒。"这句话明确了从哪里发起、测了哪种能力、输入规模多大、什么叫成功,也没有擅自把结论扩展到批量、生产网络或完整知识库。

相反,"Embedding 已验证"仍然过于模糊。它没有说明是通过界面还是直接请求验证,没有说明单条还是批量,也没有说明只检查了状态码还是检查了数据结构。换一个同事、换一个环境后,这句结论几乎无法重现。验收记录真正的消费者不是刚完成实验的人,而是几天后需要判断能否发布、几个月后需要解释回归的人。

还可以为每行增加有效期和失效条件。插件升级、代理规则变化、模型标识切换、凭据轮换或向量模型迁移后,相关行应自动回到"待验证",不能继续沿用旧绿灯。系统会变化,证据也会过期。把版本、配置摘要和测试数据版本写进记录,才能知道一项成功属于哪一个系统快照。

最后区分"技术通过"和"业务通过"。接口返回合法向量属于技术契约通过;检索结果达到业务可接受水平属于质量验收通过。前者不能替代后者,后者也不能掩盖前者的不稳定。两类标准分开,才能避免一次效果不错的问答被误当成底层链路可靠,也避免协议完全正确却无人评估实际召回质量。

一张复现卡,先让所有人讨论同一次请求

很多故障会议看似热闹,实际参与者说的不是同一个实验。开发者在宿主机用短文本测试,运维在容器内观察批量任务,产品同事通过浏览器触发知识库,三个人最后都只留下"成功"或"失败"。这些结论无法比较,因为入口、网络、模型类型、输入规模和时间窗口都不同。

复现卡的职责是冻结实验条件。先记录触发时间与时区、Dify 版本证据、部署方式和触发入口;再记录模型类型、实际模型标识、脱敏后的最终 URL、请求方法、响应状态码、媒体类型和正文摘要;最后补上 DNS、连接、首字节、完整响应、节点完成等时间点,以及 Dify 运行 ID、网关请求 ID 和上游追踪 ID。

所谓"最终 URL"不是配置框里看到的字符串,而是插件拼接、版本前缀和代理改写之后真正发送的地址。只记 Base URL 很容易忽略重复的版本段、缺失的资源路径或被网关改写的路由。只记状态码也不够:一个 200 响应可能是符合契约的 JSON,也可能是登录页、代理提示页或字段不完整的兼容层结果。

复现卡必须标明本轮唯一变化。第一次只换模型标识,第二次只换网络出口,第三次只改变输入批量;不要一次同时换 Key、地址、模型和超时。如果四项一起变,成功时不知道谁修复了问题,失败时也无法排除任何假设。单变量实验看起来慢,实际上减少了大量重复争论。

敏感信息不应为了"完整"进入复现材料。API Key 记录环境变量名、版本号或不可逆短指纹即可,Authorization 头只保留结构。用户正文可以记录字符数、分段数、哈希和经过审查的短摘要,不需要把原文复制到日志、截图、工单和群聊。好的证据链应当既可关联,又不扩大泄露面。

还应记录失败前最后一个确定成功的阶段。例如"文档解析得到 48 个分段,向量请求尚未返回"比"知识库卡住"更有用;"模型节点已输出,索引写入节点失败"会立刻把调查范围移出模型供应商。排错不是把所有信息收集得越多越好,而是找到能够切断责任范围的那条证据。

四个相邻输入框,其实属于四个责任层

凭据、Base URL、模型标识和模型类型经常出现在相邻配置区域,因此很容易被理解成同一个"连接设置"。实际上,它们回答四个不同问题:以谁的身份访问、请求从哪里开始构造、调用哪个资源、按哪一套能力契约调用。任何一项错误都可能显示为"模型调用失败",但修复方向完全不同。

凭据解决身份问题。校验成功说明某次认证或授权检查通过,不等于目标模型、目标能力和目标操作都获得许可。若真实调用返回 401 或 403,应检查请求是否携带预期认证头、Key 是否来自正确环境、权限是否覆盖目标资源,以及中间代理是否丢弃或改写认证信息。继续增加超时时间通常无效,因为请求已经被快速拒绝。

Base URL 决定路由起点,但插件可能继续追加版本前缀与资源路径。配置中填写域名、兼容前缀还是完整资源地址,取决于插件如何拼接,不能从另一个客户端的填写方式直接类推。一个 404 只说明当前资源未被找到,调查仍需结合最终 URL、请求方法和响应来源,判断是路径拼错、资源不存在,还是请求落到了错误服务。

模型标识是发送到 API 的 machine-readable 值,不一定等于界面展示名称。界面标签可以为了易读而改变,API 标识则必须与服务端可识别资源一致。遇到 model not found 一类错误,应保留原始模型值并核对调用所处环境,不能靠猜测增加前缀、删掉后缀或把营销名称直接填入请求。

模型类型决定调用方法。把一个会生成文本的标识登记为 Text Embedding,不会让它自动获得向量能力;反过来也一样。类型错误可能在配置保存时未暴露,直到知识库真正执行向量化才失败。此时换 Key 或重启 Dify 只会重新执行同一份错误契约。

四层排查可以按观察结果分流,但不要机械套用:401、403 优先看身份与权限,404 优先看路径与资源,稳定的参数错误优先看请求结构,解析异常优先看媒体类型和响应字段。网关可能重写状态码,所以这些只是调查优先级,不是最终判决。最终结论必须同时说明谁返回了什么、请求实际发往哪里,以及哪项实验复现了结果。

同一个域名,也可以承载两份完全不同的协议

OpenAI 兼容通常描述的是接口形态,而不是一句"所有能力完全等价"的承诺。聊天与向量化可以共享域名、认证方式和部分错误结构,却仍使用不同资源路径、请求字段与响应对象。把共享入口误解为共享能力,是"聊天正常但建库失败"最常见的认知漏洞。

聊天请求通常围绕 model 和 messages 组织,响应包含生成消息、结束原因、工具调用或用量信息。Embedding 请求通常围绕 model 和 input 组织,响应核心是与输入逐一对应的浮点向量。Dify 收到聊天响应后会进入生成结果处理,收到向量响应后则要检查数据项、顺序、向量值与维度,再把结果交给索引链路。

这意味着兼容性至少有五层。第一层是路由兼容:目标端点存在并接受正确方法。第二层是认证兼容:认证头能到达目标服务。第三层是请求兼容:必填字段、数组形式和编码被接受。第四层是响应兼容:媒体类型与字段结构可被客户端解析。第五层是语义兼容:返回数据不仅"长得像",还满足后续逻辑,例如每个输入都有向量、向量维度稳定、顺序没有错位。

HTTP 200 只能证明服务器把这次 HTTP 交换归为成功类别,不能替第五层作证。代理返回的 HTML 页面也可能带 200;兼容层可能返回合法 JSON,却缺少向量字段;数据项可能存在,却与输入数量不一致。验收时应同时检查 Content-Type、顶层对象、数据项数量、向量是否为有限数值、维度是否一致,以及输入与输出是否能够一一对应。

维度一致仍不代表两个 Embedding 模型位于同一向量空间。更换模型后,即便新旧数组长度相同,也不能据此继续混用旧文档向量与新查询向量。向量模型迁移需要评估重建索引、并行验证和回滚路径。否则接口层全部通过,检索质量仍可能静默下降,而系统不会给出明显报错。

所以,判断"兼容"时不要只写一个布尔值。更好的记录方式是:"聊天非流式契约通过;聊天流式未验证;Embedding 单条通过;Embedding 批量失败;索引写入未验证。"这种不漂亮的结论,反而比一个醒目的绿色徽标更接近真实系统。

离开配置页面,建立两条最小调用基线

界面报错往往把插件、网络、上游和解析器压缩成一句提示。最小 HTTP 请求的价值,是先确认上游契约本身,再回到 Dify 比较差异。它不是为了绕过 Dify,而是建立一个足够小、足够稳定的对照组。

本文使用的服务根地址是 https://api.vectorengine.cn,OpenAI 兼容前缀是 https://api.vectorengine.cn/v1,Chat Completions 地址是 https://api.vectorengine.cn/v1/chat/completions。三者分别代表入口、版本前缀和具体资源,填写时应服从实际客户端的拼接规则,而不是把三个值随意互换。

先在安全终端中准备 VECTORENGINE_API_KEYVECTOR_CHAT_URLVECTOR_EMBEDDINGS_URLCHAT_MODELEMBEDDING_MODEL 等环境变量。示例只展示结构,不提供模型清单,也不暗示任何未核验的能力。聊天与向量请求应分别执行:

bash 复制代码
curl "${VECTOR_CHAT_URL}" \
  -H "Authorization: Bearer ${VECTORENGINE_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"model":"'"${CHAT_MODEL}"'","messages":[{"role":"user","content":"只回复 baseline-ok"}]}'

curl "${VECTOR_EMBEDDINGS_URL}" \
  -H "Authorization: Bearer ${VECTORENGINE_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"model":"'"${EMBEDDING_MODEL}"'","input":["固定基线文本"]}'

聊天基线验证的是:目标聊天资源可达、认证有效、请求结构被接受、响应可解析。向量基线验证的是另一组条件:目标向量资源可达、模型类型和标识匹配、input 形式被接受、响应包含数值向量。两次实验应尽量使用同一运行环境和网络出口,这样差异更可能落在端点与能力,而不是宿主机与容器之间的网络条件。

不要在第一次实验中加入长提示词、工具调用、流式输出、超大批量或生产文档。基线的任务是减少变量。单条向量通过后,再按 2、4、8 等受控批量逐步增加输入,同时记录每次请求的项数、总字符数、响应项数、维度、耗时和错误。阈值附近的稳定失败,往往比一次全量任务的模糊超时更有诊断价值。

若终端基线成功而 Dify 失败,比较两者的最终 URL、认证头、模型值、请求字段、代理路径和运行网络;若终端也失败,先把问题留在上游契约一侧,不要用重装 Dify 制造新的变量。若两者都成功而知识库仍失败,应继续向文档分段、批处理、索引写入和存储方向移动调查边界。

先按失败阶段分型,再决定看哪一层

"失败"不是一个足够精确的类别。把现象按发生阶段分型,可以在几分钟内排除大量无效动作。实用的第一版分类包括立即失败、结构失败、等待失败、下游失败和结果未知。

立即失败通常很快返回 4xx、模型不存在或参数校验错误。它说明系统没有在等待一个慢结果,而是在早期拒绝了请求。优先核对凭据、权限、最终路径、模型标识、模型类型和必填字段。把三十秒超时改成三百秒,不会让一个确定性 404 自行变成正确路由。

结构失败发生在某个服务已经响应之后。常见证据是期望 JSON 却收到 HTML、字段缺失、向量数据不是数值数组、输入与输出数量不一致或解析器拒绝媒体类型。这时状态码只是线索,必须保存经过脱敏的响应头和正文片段,并确认产生响应的是上游、网关还是登录层。一个"成功"状态配错误媒体类型,通常比统一错误文案更接近根因。

等待失败表现为长时间无首字节、流式中途停顿,或在接近固定秒数时被切断。它需要时间线,而不是一句"接口慢"。记录连接建立、首字节、最后一字节、插件结束、节点结束和客户端断开的时刻,才能判断时间消耗发生在上游处理、网络读取、内部重试还是下游节点。

下游失败发生在模型已经给出合格响应以后。向量数量和维度都正确,不代表索引写入、数据库事务或后续检索结构一定成功。Dify 运行历史若显示模型节点已完成、下一节点失败,就应把调查焦点向后移动。继续更换模型只会给原本清晰的边界增加噪声。

结果未知最危险。客户端超时或连接断开时,服务端可能仍在执行,甚至已经完成写入。对含副作用的任务立即重试,可能产生重复索引或重复记录。应先用运行 ID、任务状态或幂等机制确认最终结果,再决定是否重放。未知不是失败的同义词,它要求的是查询与对账。

分类结果应写入结构化字段,而不是只保留自然语言错误。错误文案会随版本和语言变化,稳定的类别、状态码、组件名和追踪标识更适合统计与自动分支。自然语言正文仍有价值,但它应作为人工调查线索,而不是唯一判断条件。

超时不是根因,它只是最先响起的计时器、

一次知识库任务可能同时受上游客户端、模型插件、插件守护进程、工作流、应用、前端流式读取和反向代理等时间边界约束。谁先到期,谁就终止当前观察路径。页面显示"超时",只说明某个计时器先响了,并没有说明真正耗时的工作位于这一层。

Dify 自托管环境文档分别列出工作流、应用和插件执行等范围的超时配置。多个配置项并存,本身就否定了"Dify 只有一个超时"的想象。若只把最容易找到的参数扩大,可能暂时让外层等待更久,也可能只是把失败从三十秒推迟到五分钟,并掩盖内部重试、上游排队或下游阻塞。

正确做法是画时间预算。把一次调用拆为排队、DNS、连接、请求发送、首字节等待、响应读取、解析、重试退避和后续节点。每个阶段记录开始、结束与责任组件。若每次都在接近相同秒数中断,把这个边界与各层配置逐一对照;若耗时漂移明显,则继续关注负载、网络或共享资源竞争。

首字节是很有用的分界。始终没有首字节,调查上游排队、连接和服务处理;首字节很快到达却中途停止,调查流式边界、空闲超时、代理缓冲和读取逻辑;模型响应早已完成而工作流仍运行,调查解析、队列、存储和后续节点。相同的"等了很久",可能对应完全不同的责任层。

还要计算重试后的总预算。单次上游调用允许二十秒,三次尝试加退避就可能超过一分钟。如果外层应用只允许三十秒,用户会先看到超时,而后台仍在继续请求。此时再次点击会叠加更多任务。预算应从外向内留出可解释余量:外层允许内层完成有限尝试和清理,内层又不能无限占用外层。

扩大超时之前,至少回答三个问题:哪一层先到期、耗时集中在哪个阶段、延长后希望观察到什么新证据。如果答案只是"也许能跑完",这仍是一次实验,不是修复。实验应限定环境和规模,记录修改前后时间线,并准备恢复原值。

运行历史负责回答:流程到底走到了哪里

静态配置只能说明系统打算怎样运行,运行历史才说明某一次执行实际上发生了什么。排查知识库或工作流时,应先找到与复现卡时间和运行 ID 对应的记录,再从第一个异常节点向前后观察,而不是在供应商配置页来回修改。

第一步确认流程是否启动。没有任何运行记录,问题可能发生在应用入口、鉴权、路由或客户端请求,尚未进入工作流。已经启动,则检查节点状态、输入、输出和耗时。不要被后续连锁失败吸引,真正有价值的是第一个从预期转为异常的节点。

第二步判断数据走到哪里。文档是否完成解析,分段数量是否合理,Embedding 节点是否收到预期文本,模型节点是否产生输出,索引写入是否开始。敏感输入不必原样保存,可以记录长度、类型、字段存在性、片段数和哈希。证据的目标是确认结构和流向,不是复制业务数据。

第三步比较成功样本。若尚无整条链路成功记录,也可以建立阶段性基线:一次成功的聊天作为 LLM 基线,一次单条向量请求作为 Embedding 基线,一份小文档作为索引链前半段基线。把失败运行与这些基线比较最终路径、模型类型、输入规模、响应结构、节点耗时和重试次数。

耗时分布可以快速排除一些假设。零点几秒内稳定失败通常不像读取超时;每次接近同一上限中断通常不像模型名拼写错误;模型节点耗时正常、写入节点长时间停顿,则不应继续把供应商作为唯一嫌疑。注意这些仍是概率判断,需要请求与日志证据确认。

运行 ID 应尽量贯穿 Dify、插件、网关和上游。若各层都有日志却不能关联,它们只是几组相似时间的故事;一旦能够用请求 ID 和时间戳串起来,才能回答某次调用经过哪些组件、在哪里等待、由谁返回错误。无法修改所有组件时,至少把可控层的标识写入日志上下文。

最终记录应精确到类似这样的句子:"Embedding 节点向脱敏后的最终路径发送两项输入,三秒后收到 HTML,HTTP 状态为 200,解析器在媒体类型检查处拒绝响应。"它比"兼容接口不稳定"更长,却能直接生成修复任务和回归用例。

重试只属于可能自行恢复的故障

Dify 的节点错误处理和重试能力很实用,但它们不是通用修复。重试的隐含前提是:条件不变时,下一次仍有合理概率成功。若无法解释这个概率来自哪里,就不应先用更多请求把现场冲淡。

路径错误、模型类型错误、缺失字段和固定的响应结构不兼容都属于确定性问题。同样输入重复十次,通常得到同样结果。认证失败、明确的权限拒绝和不存在的资源也需要修改身份或配置,而不是等待。盲目重试还可能触发新的限流,使最初清晰的错误被二次错误覆盖。

适合有限重试的通常是短暂连接中断、明确的临时不可用或带有重试提示的限流响应。即使如此,也要设置最大次数、退避、随机扰动和总预算,并记录每一次尝试的原因、耗时与结果。否则一次一分钟的失败可能包含三次调用,调查人员却误以为上游只收到一次请求。

含副作用的操作需要更严格。索引创建、写入或任务提交在客户端断开时可能已经成功,重试前必须查询状态或使用幂等键。对于无法天然幂等的步骤,可以把"提交"和"确认"分开记录,让恢复流程先对账再决定重放,而不是把网络错误等同于业务未发生。

异常分支不应只输出"模型调用失败"。内部至少区分认证、权限、资源、请求结构、限流、连接、读取超时、响应解析、模型输出校验和下游写入。用户提示可以简洁,工程记录必须保留类别、责任组件、追踪标识和是否可重试。分类稳定后,团队才能统计真正的故障分布,而不是被几十种文案淹没。

一个简单的重试评审问题是:"在不改变任何条件的情况下,下一次为什么可能成功?"如果答案是网络抖动已经消失、限流窗口会重置或实例可能恢复,可以设计有限重试;如果答案只是"试试看",先停止自动化,补齐证据。

把一次排错,变成以后每次升级的发布闸门

故障修复完成不等于工作结束。若经验只留在群聊里,下一次升级 Dify、插件、代理或上游服务时,同样的假绿灯还会出现。最有价值的收尾,是把验收矩阵转成可重复执行的契约测试。

测试应按风险逐级放大。第一层验证凭据与最小聊天、最小 Embedding 请求;第二层验证固定小批量,确认输入输出数量、向量维度和顺序;第三层使用不含敏感信息的小文档,检查解析、分段、向量化和写入;第四层在受控环境回放接近真实规模的任务,观察时间预算、重试和资源占用。

每一层都应有明确通过条件。不是"页面没报错",而是状态码符合预期、媒体类型正确、必要字段存在、向量为有限数值、维度稳定、分段与索引数量可对账、运行在预算内结束。失败时也要有明确分类,避免所有异常被压成同一个红灯。

成功用例之外还需要反证。使用无效模型标识,确认错误落到资源类别;让模拟上游超过内层预算,确认预期计时器先中止;返回缺失向量字段的 JSON,确认解析器拒绝结果;制造一次可重试连接错误,确认次数、退避和总时长受控。错误路径符合契约,系统才真正可维护。

升级前后运行相同测试集,比较协议与结构,不比较自然语言回答是否逐字一致。对于 Embedding,应比较项数、维度、数值有效性和索引可用性;若更换模型,采用新旧索引并行验证,明确切换和回滚方式。不要因为新模型返回相同长度数组,就跳过重建与质量评估。

发布闸门还应检查可观察性与脱敏。测试凭据、标记文本和请求 ID 经过日志、运行历史、截图与工单导出链路后,确认敏感值没有原样出现,同时仍能关联同一次调用。若排错只能靠记录完整 Key 或用户全文,说明可观察性设计本身仍不合格。

别让验收矩阵变成另一张形式主义清单

清单最大的风险,是所有人只关心是否打勾,却不再检查勾后面的证据。每个通过项都应链接到可重放的测试、机器可读结果或经过脱敏的运行记录;每个失败项都要有责任边界和下一项实验;每个未知项都要说明缺少什么证据。只有颜色、没有原始观察的矩阵,很快会退化成另一块更复杂的绿灯。

通过条件也不应随故障临时放宽。若批量测试原本要求十次全部返回结构完整的向量,某次升级后出现两次解析失败,就不能因为"多试几次也能过"而把标准改成最终成功。标准确需调整时,应记录业务理由、风险接受者和回滚条件,让变化本身可审计。

闸门还要控制测试成本。最小基线可以在每次配置变更后运行,小文档索引可以在构建或部署阶段运行,接近真实规模的回放则安排在受控窗口。不是每次都执行最重测试,而是让不同强度的验证覆盖对应风险。快速测试负责尽早发现确定性错误,重测试负责暴露批量、时间和资源边界。

最后定期删除失去区分度的检查,增加真实事故暴露出的新反证。若某项测试无论系统怎样变化都永远通过,它可能没有覆盖有效风险;若某类故障曾越过闸门,就应把那次最小复现固化为新用例。验收体系不是一次写完的文档,而是一份随系统和事故共同演化的工程资产。

最后形成一份可执行清单:哪些能力已验证,哪些仍未知;每项基线的入口与通过条件;故障分类和重试策略;时间预算与责任层;索引迁移和回滚步骤。以后再看到供应商页面的绿灯,团队不再争论它"算不算接通",只需查看矩阵里还有哪些行没有证据。

回到开头:绿灯没有撒谎,它只是回答了一个更小的问题。真正危险的是我们替它补上了"所以其他能力也都正常"。把大而模糊的"模型可用"拆成能够被逐项推翻的命题,Dify 知识库故障就不再是一团黑箱,而是一组有边界的工程事实。

如需继续阅读接口配置与通用排错资料,可查看 https://178.nz/dn。该入口只用于延伸阅读,任何具体能力仍应以可追溯资料和实际测试结果为准。

参考资料

  1. Dify, Model Schema
    https://docs.dify.ai/en/develop-plugin/features-and-specs/plugin-types/model-schema
  2. Dify, Model Design Rules
    https://docs.dify.ai/en/develop-plugin/features-and-specs/plugin-types/model-designing-rules
  3. Dify, Model API Interface
    https://docs.dify.ai/en/develop-plugin/features-and-specs/plugin-types/model
  4. Dify, Develop a Model Plugin
    https://docs.dify.ai/en/develop-plugin/dev-guides-and-walkthroughs/develop-a-model-plugin
  5. Dify, Model Providers
    https://docs.dify.ai/en/use-dify/models/model-providers
  6. Dify, LLM Node
    https://docs.dify.ai/en/use-dify/nodes/llm
  7. Dify, Run History
    https://docs.dify.ai/en/use-dify/monitoring/logs
  8. Dify, Environment Variables
    https://docs.dify.ai/en/self-host/deploy/configuration/environments
  9. OpenAI, Create Embeddings
    https://platform.openai.com/docs/api-reference/embeddings/create
  10. RFC Editor, RFC 9110: HTTP Semantics
    https://www.rfc-editor.org/rfc/rfc9110.html