dify 配置 ollama rerank

模型与算力

讲清 Dify 检索流程里怎么接本地 Ollama 重排模型,从选模型、起接口到联调排错的完整动作。

你在 Dify 里搭知识库,向量召回出来的段落总是答非所问,想加一层重排把最相关的顶到前面,但发现 Ollama 的接口跟 Dify 里填的字段对不上,保存后测试也没反应。这篇按顺序把判断标准和操作步骤拆开讲:先确认你的 Ollama 版本有没有重排能力,再决定走原生接口还是 OpenAI 兼容层,最后给一份联调排查顺序。

你在 Dify 里搭知识库,向量召回出来的段落总是答非所问,想加一层重排把最相关的顶到前面,结果发现 Ollama 的接口跟 Dify 里填的字段对不上,保存后测试也没反应。这篇按顺序把判断标准和操作步骤拆开讲:先确认你的 Ollama 版本有没有重排能力,再决定走原生接口还是 OpenAI 兼容层,最后给一份联调排查顺序。整篇不讲原理堆砌,只讲你下一步该动手做什么。

开始之前先准备一个东西:同一批测试问题。没有它,加重排前后你根本分不清是变好了还是错觉。准备三五个你业务里的真实问题,记下当前召回的前几条长什么样,这是后面所有判断的基线。

先想清楚:这一步到底解决什么问题

向量召回看的是语义距离,重排看的是问题与段落的直接相关性,两者叠加才把「像」变成「对」。段落多、问题短、专业术语密集的场景收益最明显。但要说清楚不适用的边界:语料只有几十条、召回结果本来就稳定,加重排只会拖慢响应,还可能因为重排模型判断失误把正确段落压下去。

  • 重排模型只输出相关性分数、不做生成,别把它当成第二个对话模型去配,Dify 里对应的是 Rerank 位置而不是 LLM 位置;
  • 先量基线:用准备好的那批问题跑一遍不加重的召回,把命中情况记下来,加重排之后再对一次,否则你没法判断这一步值不值;
  • 如果你只是想让回答更通顺,重排帮不上忙,那是模型和提示词的事,别在这里绕;
  • 重排会增加一次额外推理,响应时间大概率上升,能不能接受要在动手前定下来。

你的 Ollama 到底能不能跑重排

这一步别急着改 Dify,先确认本地服务本身有没有这个能力。Ollama 原生并不一定暴露重排端点,你要先用命令行或直接发 HTTP 请求打一次,看返回结构里有没有分数字段。拿不到分数,后面所有配置都是白搭,那就得考虑走兼容层或换部署方式。

显存这块也要提前算。重排模型通常比对话模型小,但依然要占显存,和对话模型抢卡是小机器上最常见的坑。具体多大的模型装得下、当前卡能跑到什么程度,到 部署测算(/models/deploy) 按你手上的硬件核对当时的数字,别照着别人的配置抄。

检查项怎么看不通过怎么办
有没有重排端点发一次带查询和候选段落的请求,看返回里有没有分数没有就走兼容层或换部署方式
返回结构字段名、分数范围、排序方式是否符合预期后面在中间层做格式转换
显存余量重排模型和对话模型能不能同时装下分时段调用或分进程部署
中文表现拿你的中文语料试打分,看排序是否稳定换模型,具体型号到站内按当时清单挑

重排模型的选择思路和对话模型不一样,看的是中文语料表现、最大输入长度和打分稳定性,不看参数规模。具体挑哪一类,到 嵌入模型(/embeddings) 页面按当时的型号清单核对,那里会随实际情况更新。

在 Dify 里把这条路接起来

先明确 Dify 认的是哪一类接口:Rerank 位置通常要求返回带相关性分数的列表。你本地接口的字段名和它期望的不一致时,不要硬填原始地址,在中间做一次格式转换更省事。这一步是整个配置里最容易卡住的地方,卡住时先别怀疑模型。

  1. 确认期望格式在 Dify 的重排配置界面看它要求什么字段、分数是越大越好还是越小越好,把这个格式记下来。
  2. 搭一层薄转发写个小服务:接收 Dify 传来的查询和候选段落,转成你本地模型能吃的请求,再把分数映射回期望字段。不用复杂,能转发加映射就够。
  3. 改地址Dify 如果跑在容器里,localhost 指向容器自己,要换成宿主机可达的地址;端口、路径前缀、末尾斜杠按你实际服务改,别照抄示例。
  4. 联调验证回到知识库的召回测试,用同一组问题对比加重排前后的命中位置。命中位置变了,说明链路通了;没变或者变差,先查中间层映射,不是模型不行。

这里有个细节值得单独提:转发服务里要做超时处理。重排请求比普通请求慢,Dify 侧超时设太短会直接判失败,表现就是「测试没反应」,其实请求发出去了只是没等到结果。

顺序排查:保存不了、没反应、变慢了

接完之后出问题,按下面的顺序查,别东一榔头西一棒子。这三类症状的成因不一样,查的顺序也不一样。

症状先查什么再查什么
保存失败从 Dify 所在机器发请求打你填的地址,看通不通返回结构是否符合 Dify 期望的字段
测试通过但线上没变化这条重排配置有没有挂到当前知识库的召回设置上配置是不是被别的设置覆盖了
响应明显变慢重排模型是否和对话模型抢显存候选段落数量是不是过大,超时是不是太短

测试通过但线上问答没变化,是出现频率最高的一类。很多人的配置确实存下来了,但没有真正启用,配置存在不等于生效,先去召回设置里点一遍确认。判断不了是模型问题还是链路问题时,用 接口测速(/tools/speed-test) 量一下本地重排接口的延迟基线,有了这个数才能区分是链路慢还是模型慢。

重排解决的是排序问题,不是召回问题;先把候选段落捞对,再谈谁排前面。
下一步如果你的重排链路一直连不通,或者想看看别人踩过哪些同类坑,到站内中转站可信度检测页对比一下你正在用的服务,再回来重跑一次联调,能省掉不少来回试的时间。

常见问题

Dify 里没有 Rerank 这个选项,是不是版本不支持?

先看你的 Dify 版本和部署方式,部分版本的重排入口放在知识库的召回设置里而不是模型供应商页,位置不一样但功能在。如果确实没有对应入口,就要靠中间层把重排结果并进召回流程,改动量会大一些,建议先确认版本再动手。

本地重排模型的分数和 Dify 期望的格式对不上怎么办?

这是最常见的一类问题。典型做法是加一层很薄的转发,把本地返回的分数、索引字段重命名成 Dify 认得的结构,再做一次归一化。不要试图在模型侧改输出,改动越靠后越好维护,也方便你以后换模型。

加了重排以后回答反而变差,先查哪里?

先取一小批之前答对的问题做回归,看命中段落是被压后还是完全消失。多数情况是中间层把分数顺序映射反了,或者候选段落被截断导致正确段落根本没进重排。排掉这两个再怀疑模型本身。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。