第19回 构建企业内部 AI 助手 – 基于 RAG 实现的搜索式问答系统

前言

上一回我们整理了语义搜索的概念。 本文将在此基础上,使用 RAG(Retrieval-Augmented Generation)构建企业内部 AI 助手。

RAG 是一种”通过搜索找到相关文档,再由 LLM(大语言模型)基于文档内容生成回答”的机制。 由于回答基于企业内部文档生成,因此能够应对通用聊天 AI 无法回答的企业特有问题。

目标读者

  • 对构建企业内部 AI 助手感兴趣的人员

  • 希望学习 RAG 实现方法的人员

  • 希望了解 LLM 集成选项的人员

RAG 的工作原理

RAG 流水线

Fess 的 AI 搜索模式通过以下流水线运行:

  1. 意图分析(Intent):分析用户的问题并分类意图(搜索、摘要、FAQ、不明确)

  2. 搜索(Search):从 Fess 索引中检索相关文档(零命中时自动重新生成查询并重新搜索)

  3. 评估(Evaluate):LLM 评估检索到的文档的相关性

  4. 全文获取(Fetch):获取高相关性文档的全文

  5. 回答生成(Answer):LLM 基于文档内容生成带引用的流式回答

该流水线能够减轻 LLM”看似合理但不准确的回答(幻觉)”问题,提供有企业内部文档支撑的回答。

Fess 的 AI 搜索模式不需要向量搜索(嵌入模型)。 它直接利用现有的全文搜索索引,由 LLM 负责搜索结果的评估和回答生成。 因此,无需选择嵌入模型或构建向量数据库等额外的基础设施准备,即可立即引入基于 RAG 的 AI 搜索。

LLM 提供商的选择

Fess 支持三种 LLM 后端。 下面整理各提供商的特点和选择标准。

LLM 提供商比较
提供商 插件 成本 特点
OpenAI fess-llm-openai API 按量计费 高回答质量、支持 GPT-4o、易于上手
Google Gemini fess-llm-gemini API 按量计费 支持扩展思考、长上下文
Ollama fess-llm-ollama 硬件成本 本地运行、数据不外传、注重隐私

选择标准

选择云端 API(OpenAI / Gemini)的情况

  • 希望降低初始成本

  • 无法准备 GPU 服务器

  • 将回答质量作为最高优先级

  • 允许将数据发送到外部

选择本地运行(Ollama)的情况

  • 不允许将企业内部数据发送到外部

  • 安全和隐私要求严格

  • 能够准备 GPU 服务器

  • 希望降低运营成本(大量使用时)

AI 搜索模式的设置

插件安装

安装与所选 LLM 提供商对应的插件。

  1. 在管理界面中选择 [系统] > [插件]

  2. 安装对应的插件(例如:fess-llm-openai

启用 AI 搜索模式

在 Fess 的设置中启用 AI 搜索模式。

在管理界面的设置或配置文件中设置 rag.chat.enabled=true

LLM 连接设置

根据各 LLM 提供商配置连接信息。

OpenAI 的情况

  • API 密钥

  • 使用的模型(gpt-4o、gpt-4o-mini 等)

  • 最大 token 数

Ollama 的情况

  • Ollama 服务器 URL

  • 使用的模型名称

  • 通过 Docker Compose 添加服务

services:
  ollama:
    image: ollama/ollama
    volumes:
      - ollama-data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

AI 聊天体验

聊天界面

启用 AI 搜索模式后,Fess 的搜索界面将增加 AI 搜索模式。 用户可以在关键词搜索和 AI 聊天之间切换使用。

问答示例

问题:”请告诉我带薪休假的申请方法”

AI 回答

带薪休假的申请按以下步骤进行:

  1. 访问企业内部门户的”考勤管理”页面

  2. 在”休假申请”菜单中选择”带薪休假”

  3. 输入日期,选择上级后提交申请

请在休假前 3 个工作日之前完成申请。

参考:[就业规则 第15条](https://portal/rules/chapter15.html)

回答中包含信息来源链接,用户可以查看原始文档。

Chat API(SSE)的使用

从程序中使用 AI 搜索模式时,请使用 Chat API。 Chat API 通过 Server-Sent Events(SSE)返回流式响应。

使用流式响应(SSE)的情况:

GET /api/v1/chat/stream?message=带薪休假的申请方法

获取非流式 JSON 响应的情况:

POST /api/v1/chat
Content-Type: application/x-www-form-urlencoded

message=带薪休假的申请方法

通过 SSE,每当生成回答时都会实时发送给客户端。 用户无需等待回答完全生成,即可开始阅读逐渐显示的回答。

对话历史

Chat API 支持基于会话的对话历史。 可以基于前一个问题的上下文进行追加提问。

示例:

  • Q1:”请告诉我带薪休假的申请方法”

  • A1:(上述回答)

  • Q2:”如果超过了申请期限该怎么办?”

  • A2:(基于 Q1 上下文的回答)

RAG 调优

回答质量的改善

RAG 的回答质量受以下因素影响:

搜索质量

RAG 基于搜索结果生成回答,因此搜索质量直接影响回答质量。 通过第8回介绍的调优周期来改善搜索质量,也能带动 RAG 质量的提升。

文档质量

如果搜索目标文档本身过时、不准确或含糊,RAG 的回答质量也会下降。 文档的定期更新和质量管理非常重要。

提示词设置

通过调优发送给 LLM 的提示词(指令文本),可以调整回答的风格和精确度。

安全性考量

提示词注入防护

Fess 的 RAG 功能内置了提示词注入防御机制。 能够防范通过恶意输入试图操控 LLM 行为的攻击。

信息泄露防止

RAG 基于搜索结果生成回答,与基于角色的搜索(第5回)结合使用,可确保仅生成与用户权限相匹配的回答。 用户无权访问的文档内容不会包含在 RAG 的回答中。

总结

本文介绍了使用 Fess 的 AI 搜索模式构建企业内部 AI 助手的方法。

  • RAG 流水线的工作原理(意图分析 -> 搜索 -> 评估 -> 回答生成)

  • 三种 LLM 提供商(OpenAI、Gemini、Ollama)的选择标准

  • AI 搜索模式的设置与体验

  • 通过 Chat API(SSE)从程序中使用

  • 回答质量调优与安全性考量

借助基于企业内部文档的 AI 助手,知识利用方式将从”搜索”转变为”提问”。

下一回将介绍如何将 Fess 作为 MCP 服务器集成到 AI 代理中。

参考资料