AI-Chain

Meilisearch 不只是搜寻框:用 Hybrid Search 把 RAG 的检索层做成可维护服务

分享:
Meilisearch 不只是搜寻框:用 Hybrid Search 把 RAG 的检索层做成可维护服务

Meilisearch 不只是搜寻框:用 Hybrid Search 把 RAG 的检索层做成可维护服务

我最近在挑选适合 AI 应用的开源基础工具时,常遇到一个很实际的问题:团队想做知识库问答、文件搜寻或自然语言查询,第一个念头通常是「先接一个向量资料库,再把 LLM 串上去」。但真正开始做之后,问题很快从模型选择转成资料索引、关键字命中、过滤、排序、权限与延迟。

这也是我认为 Meilisearch 值得重新看的原因。它不是只提供向量搜寻的 AI 元件,而是一个以 API 为核心的搜寻引擎:原本就有全文搜寻、容错、筛选、排序、同义词与地理搜寻,现在再把 semantic search、hybrid search、conversational search 与 MCP 整合放进同一个产品脉络里。对 AI Chain 这类需要把模型接进既有产品的团队来说,这个定位比「又一个向量资料库」更有意思。

我的结论先讲在前面:如果你的产品需要同时处理精确词汇与自然语言意图,Meilisearch 很适合先扮演检索层;如果你只是要储存 embedding,或需要极度专门化的向量索引与分散式控制,则不应该因为它有 AI 功能就直接替换现有架构。

真正的问题不是「要不要用向量」,而是两种相关性怎么共存

纯全文搜寻擅长处理产品名称、错误码、订单编号、专有名词与使用者明确输入的关键字。假设使用者搜寻「RAG chunk overlap」,搜寻引擎应该要能找到包含这串术语的文件,而不是只因为语意相近就把它改写成另一个概念。

纯 semantic search 则擅长处理「怎么降低文件问答的幻觉」这种不一定包含原文关键词的问题。它比较在意句子的意思,而不是字面是否完全相同。但若搜寻内容包含 SKU、版本号、API 参数或人名,单靠语意相似度又可能把看起来相近、实际上不能互换的结果排在前面。

Hybrid search 的价值,就在于把这两种讯号放进同一次搜寻。Meilisearch 官方文件把它描述成全文关键字搜寻与语意搜寻的组合:查询送进去后,两条路径可以并行处理,再透过评分机制合并结果。这不是把两份结果粗暴串接,而是让系统依查询内容判断精确匹配与语意匹配各自应该占多少比重。

文件目前以 semanticRatio 表示语意结果的比例,预设值是 0.5,但它不是一个必须盲调的神奇旋钮。真正重要的是先建立一组代表性的查询集,包含错字、缩写、精确术语、自然语言问题与带条件的查询,然后观察两种结果在真实任务上的差异。搜寻品质应该用资料与使用者任务验证,而不是只看 demo 里一个漂亮的回答。

Meilisearch 把 embedding pipeline 收进索引流程,降低整合复杂度

很多 RAG 专案早期会自己处理这条管线:读取文件、切 chunk、呼叫 embedding provider、储存向量、处理重试、文件更新时重新计算,最后再把向量查询结果交给应用程式。每一个步骤都不难,但加在一起就会出现大量需要维护的边界条件。

Meilisearch 的做法是让使用者在 index 上设定 embedder。设定完成后,系统可以为文件产生 embedding、保存结果,并在文件内容变更时重新处理;官方文件也提到,它会以批次方式送出 embedding 请求,遇到 provider rate limit 时自动重试。这种设计让应用程式可以把注意力放在「哪些栏位该被搜寻」与「搜寻结果如何服务产品」,而不是维护另一条平行的向量同步服务。

但这里有一个不能忽略的成本:改变 embedder 的模型、provider 或 document template,可能触发整个 index 的重新 embedding。资料量一大,这不只代表等待时间,也可能代表外部 embedding API 的费用。因此我会把 embedder 设定视为资料 schema 的一部分,和 index mapping、栏位权限一样纳入版本控管,不会把它当成可以随时在 production 手动切换的普通参数。

另一个实务判断是:不是所有栏位都适合送进 embedding。文件标题、正文、产品分类与版本资讯可能需要不同处理;像 ID、价格、状态或租户栏位,通常更适合交给 filter 与排序,而不是期待 embedding 理解它们的精确语意。Hybrid search 的完整价值,正是让这些不同类型的讯号分工,而不是把所有资料都压成一个向量。

从零开始:先用 Docker 建一个可验证的搜寻服务

我建议第一次试用不要先从复杂的 agent 或聊天 UI 开始,而是先完成三个可验证任务:启动服务、写入文件、用 API 搜寻。这样才能分辨问题是在 Meilisearch、资料格式、权限,还是上层 LLM。

官方自托管安装文件提供 cURL、Docker、Homebrew、APT 与 source build 等方式。以下用 Docker 示范;版本标签应以官方文件与 release page 为准,范例采用文件目前展示的 v1.37:

docker pull getmeili/meilisearch:v1.37
docker run --name meilisearch --rm \\
  -p 7700:7700 \\
  -e MEILI_MASTER_KEY='replace-with-a-long-random-key' \\
  getmeili/meilisearch:v1.37

这个 master key 只是示范值,实际环境不要把密钥直接写进 shell history、公开的 compose 档或文章范例后照抄。启动后,先准备一个 movies.json:

[
  {
    "id": 1,
    "title": "The Matrix",
    "overview": "A computer hacker discovers that reality is not what it seems.",
    "genres": ["Action", "Science Fiction"],
    "year": 1999
  },
  {
    "id": 2,
    "title": "Arrival",
    "overview": "A linguist works to communicate with visitors from another world.",
    "genres": ["Drama", "Science Fiction"],
    "year": 2016
  }
]

接着建立 movies index 并加入文件:

curl \\
  -X POST 'http://localhost:7700/indexes/movies/documents' \\
  -H 'Content-Type: application/json' \\
  -H 'Authorization: Bearer replace-with-a-long-random-key' \\
  --data-binary @movies.json

Meilisearch 的写入与索引处理是非同步任务。API 回应中的 task 资讯应该保存下来,并用官方 Tasks API 或 SDK 确认任务完成,再把搜寻结果拿来做测试。不要因为 HTTP request 回传成功,就假设文件已经能被查到;这是初次整合很常见的误判。

curl \\
  'http://localhost:7700/indexes/movies/search?q=computer+hacker' \\
  -H 'Authorization: Bearer replace-with-a-long-random-key'

完成这一步后,再接入你的应用程式 SDK。Meilisearch 官方文件提供多种语言与框架的整合入口;我会先用最小 API client 验证索引契约,再把它包进服务层,避免前端直接依赖搜寻引擎的细节。

把一般搜寻升级成 Hybrid Search 时,应该先做哪些设计

第一步是定义搜寻任务,而不是先选模型。至少准备以下五类查询:

1. 精确术语:错误码、产品型号、API 名称、版本号。

1. 自然语言描述:使用者不知道正确关键字,只能描述想完成的事情。

1. 混合查询:同时包含专有名词与意图,例如「如何修正 v2 API 的 timeout」。

1. 带条件查询:需要搭配日期、分类、价格、权限或租户范围。

1. 负面案例:看起来语意相近,但业务上不能算正确的文件。

第二步是整理可检索栏位与 metadata。正文可以进 embedding,但 tenant_id、visibility、language、version 与状态等栏位,应明确设计成 filter 或权限层条件。搜寻引擎能找到某份文件,不代表目前使用者有权看到它;RAG 最危险的错误之一,就是检索层没有把资料边界一起带进来。

第三步才是设定 embedder 与 hybrid options。先从官方支援的 provider 开始,记录模型、版本、document template 与成本,再用固定查询集比较不同 semanticRatio。如果每次改参数都只靠人工点几次搜寻框,最后很难知道品质变好是因为索引变了、模型变了,还是刚好换了一组问题。

第四步是把评估指标拆开。搜寻结果可以看 recall、precision、排序位置与空结果率;如果再接 LLM,则另外评估回答是否引用正确文件、是否超出来源、是否在没有答案时诚实拒答。不要把「LLM 回答看起来通顺」当成检索成功的证据。

Conversational Search 可以做什么,又不能承诺什么

Meilisearch 目前也提供 conversational search 的能力。官方文件把它定位成建立在搜寻引擎上的 AI 功能:使用者提出自然语言问题后,系统先从 index 取回相关文件,再让 LLM 根据这些结果产生回答;文件也强调回答可以附上来源文件,让使用者核对依据。

这个设计对产品团队有吸引力,因为它把「查询理解、hybrid retrieval、回答生成」串成较短的路径。若你的目标是快速验证一个内部知识库或文件问答入口,这比自行拼出整套 orchestration 更快看见结果。

但我不会把它直接描述成「不会幻觉的 RAG」。官方文件明确提醒 conversational search 仍在早期开发阶段,LLM 即使拿到正确的来源文件,仍可能产生不正确或误导性的内容。正式环境至少要做三件事:显示引用来源、设定 guardrails 限制回答范围、以及针对空结果、LLM 失败、rate limit 与不支援问题设计 fallback。

更重要的是,要把「检索层」与「生成层」的责任分开。Meilisearch 可以负责查询理解与 hybrid retrieval,但应用程式仍可以自行控制 prompt、模型、输出格式、审计与安全策略。这让它不必取代整个 RAG stack,而是可以先成为其中一个可靠、可观测、可替换的模组。

我会把它放进哪些 AI Chain 场景

企业知识库是最直接的场景。企业文件往往同时有精确词汇、版本差异与自然语言描述,使用者希望像搜寻引擎一样快,又希望能用问句找到答案。Meilisearch 可以处理 keyword、semantic、filter 与租户边界,LLM 再负责把结果整理成可读回答。

客服与产品搜寻也适合。客服问题通常包含产品名、错误讯息与口语描述;电商搜寻则需要语意理解、faceting、价格排序与库存条件。这些场景不只要「相似」,也要让使用者能缩小范围,因此全文、filter、sorting 与 semantic search 的组合比单一向量查询更贴近产品需求。

AI agent 的工具层则要更谨慎。Meilisearch 官方 README 提到 MCP 与 LangChain 整合,代表它可以接入更大的工具生态。但 agent 能呼叫搜寻,不等于 agent 应该看到所有 index,也不等于搜寻结果可以直接变成对外动作。需要在 API key、tenant token、filter、输入清理与输出验证上建立边界。

哪些地方不适合直接采用

第一,如果需求是超大规模向量检索、特殊硬体加速或高度客制化的 ANN 索引策略,应先和专门的向量资料库或搜寻平台比较,不要只因为 Meilisearch 的开发体验友善就忽略规模条件。

第二,如果资料更新频率极高,或 embedder 变更会频繁触发大规模重建,必须先估算 re-index 时间、provider API 费用与服务可用性。官方文件对这类重新 embedding 成本有明确提醒,这不是上线后才处理的优化项目。

第三,若团队需要完整的企业功能,要看 Community Edition 与 Enterprise Edition 的授权差异。专案 README 说明 Community Edition 以 MIT license 开源,Enterprise Edition 则包含部分进阶能力并受商业授权或 Business Source License 1.1 约束;采用前应直接阅读当前 LICENSE 与商业条款,不要用「这是开源专案」一句话概括全部功能。

第四,self-hosting 也不等于零治理。Meilisearch 官方文件说明会收集匿名 telemetry,并提供停用方式。对有合规要求的团队,应在部署检查表中确认 telemetry 设定、网路出口、API key 轮替、snapshot 备份与资料删除流程,而不是等资安审查才临时补文件。

我的导入顺序:先把搜寻做对,再把回答做漂亮

我会把导入拆成四个阶段。第一阶段只部署全文搜寻,建立文件 schema、filter、排序与权限测试。第二阶段加入 semantic search,固定 embedder 与评估资料集,观察语意结果是否真的改善任务成功率。第三阶段才开启 hybrid search,对不同查询类型调整 semanticRatio,并保留可以回退到纯全文搜寻的路径。第四阶段才把结果交给 LLM,加入来源显示、guardrails、fallback 与成本监控。

这个顺序看起来比较慢,却能避免把搜寻品质问题伪装成 prompt 问题。如果使用者拿到错的文件,LLM 再会写也只是在更流畅地放大错误。相反地,一个能被测试、能被过滤、能被追踪的检索层,才是 RAG 应用长期维护的地基。

因此,我对 Meilisearch 的评价不是「它能不能取代所有向量资料库」,而是它能不能在一个真实产品里,把全文搜寻、语意检索、metadata 条件与 API 整合放在同一个可操作的服务中。答案是:在中小型 AI 应用、企业文件搜寻、客服与产品搜寻等场景,它很值得先做一个小型 PoC;但 PoC 的验收标准应该是相关性、权限与可维运性,而不是只截一张聊天回答的画面。

如果你今天要开始,我建议先完成 Docker 启动、文件写入与 API 搜寻,再拿一小组真实查询比较全文与 hybrid 结果。当你能回答「哪些查询需要语意」、「哪些栏位必须 filter」、「重新 embedding 的成本是多少」这三个问题,Meilisearch 才真正从热门 GitHub 专案变成可被负责任导入的 AI 基础元件。


参考资料