RAGFlow

一、介绍

RAGFlow是一个完整的、开源的RAG(检索增强生成)系统。你可以把它看作一个已经搭建好的智能问答应用框架。

RAGFlow不是一个需要你从零编码的库,而是一个可以直接运行起来的服务。它内置了我们聊过的RAG的完整流程:上传文档 -> 自动解析 -> 切片 -> 调用Embedding模型生成向量 -> 存储 -> 检索 -> 调用大模型生成回答。

RAGFlow 官网

二、搭建一个智能问答系统

整体架构:

你的文档 (PDF/Word/PPT) 
[RAGFlow核心] 
    ├─ 深度文档解析 → 保留表格/图片/格式
    ├─ 智能分块 → 按语义切割文档
    ├─ 向量化 → 调用Embedding模型
    └─ 向量存储 → 存入数据库
用户提问 → [检索引擎] → [你的微调模型] → 带引用的精准回答

2.1 部署RAGFlow

这里使用 Docker 方式 环境要求:

  • CPU ≥ 4 cores (x86);
  • RAM ≥ 16 GB;
  • Disk ≥ 50 GB;
  • Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1.
  • gVisor: Required only if you intend to use the code executor (sandbox) feature of RAGFlow.

部署RAGFlow

# 克隆RAGFlow仓库
git clone https://github.com/infiniflow/ragflow.git
cd ragflow/docker

# 检查并设置虚拟内存(Elasticsearch需要)
sudo sysctl -w vm.max_map_count=262144

# 启动所有服务(首次会拉取镜像,约2GB,耐心等待)
docker-compose -f docker-compose.yml up -d

# 查看启动日志
docker-compose logs -f ragflow-server

看到类似输出说明启动成功 :

ragflow-server  | INFO:     Application startup complete.
ragflow-server  | INFO:     Uvicorn running on http://0.0.0.0:80

访问RAGFlow界面: 打开浏览器访问 http://localhost(如果是远程服务器,用IP替换localhost)。

首次访问需要注册账号,输入邮箱和密码即可 。

2.2 配置Ollama模型(接入你的微调模型)

我们之前在另一篇 模型微调 ,微调的莎士比亚模型,现在让RAGFlow调用

确保Ollama正在运行

# 查看Ollama状态
docker ps | grep ollama

# 如果没有运行,启动它
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

在RAGFlow中配置模型: 登录RAGFlow后,点击右上角头像 → 设置 → 模型提供商:

  • 找到 Ollama 图标,点击"添加模型"

  • 配置连接信息:

    • API地址http://host.docker.internal:11434(Windows/Mac)

    • http://172.17.0.1:11434(Linux)

  • 添加聊天模型(你的微调模型):

    • 模型名称:my-shakespeare-model

    • 模型类型:Chat

  • 添加嵌入模型(用于向量化):

    • 模型名称:推荐 bge-m3nomic-embed-text

    • 先在Ollama拉取:docker exec ollama ollama pull bge-m3

设置默认模型: 在"设置默认模型"中 :

  • LLM 模型:选择 my-shakespeare-model

  • Embedding 模型:选择 bge-m3

  • Rerank 模型:(可选)暂时不选

2.3 创建你的第一个知识库

2.3.1 准备测试文档

创建一个测试文件 shakespeare.txt:

十四行诗 18
我能否将你比作夏日?
你比夏日更可爱温和:
狂风会吹落五月的花蕾,
夏天租赁的期限太短:
有时天堂之眼照得太热,
常常他的金色面容被遮掩;
被机遇或自然的变迁摧毁,
没有永恒的美不凋残;
但你永恒的夏天不会褪色,
不会失去你拥有的美颜,
死亡不能夸口你在他的阴影里徘徊,
当你在永恒的诗行中随时间生长:
只要人类能呼吸,眼睛能看见,
此诗将永存,并赐予你生命。

十四行诗 116
让我承认,两颗真心的结合
是阻碍不了的。爱算不得爱,
如果人家变心,它也跟着改变,
或者人家改道,它也看着消散。
哦,不!爱是永远固定的标志,
面对风暴,永远不会动摇;
它是星,指引每只漂泊的船,
价值无法估量,虽然可被丈量。
爱不受时间愚弄,即使红唇粉颊
终将在时间的镰刀下凋谢;
爱不随短暂的时光改变,
直到世界末日也依然存在。
如果这说法错了,并证明不对,
就算我从未写诗,也从未爱过。

2.3.2 创建知识库

  • 点击顶部导航栏 知识库创建知识库

  • 填写信息:

    • 名称:莎士比亚诗集

    • 解析方法:选择 General(通用)

  • 点击 保存

2.3.3 上传文档

  • 进入刚创建的知识库

  • 点击 上传文档 → 选择 shakespeare.txt

  • 勾选 创建时解析,点击确定

  • 等待解析完成(可以点击刷新查看状态)

解析完成后,你可以点击文档查看分块效果,RAGFlow会自动把长文本切成适合检索的片段 。

2.4 创建智能问答应用

2.4.1 创建聊天助手

  • 点击 聊天创建聊天

  • 填写:

    • 名称:莎士比亚问答助手

    • 关联知识库:勾选刚才创建的"莎士比亚诗集"

  • 点击 保存

2.4.2 设置对话开场白(可选)

在助手设置中,可以添加系统提示词:

开场白: 你好,我是以莎士比亚风格创作的AI助手,请用诗意的语言向我提问。

2.4.3 开始对话

点击你的助手,在对话框中提问 :

  • “What is love?"(你的微调模型会以莎士比亚风格回答)

  • “Write a poem about the moon”

  • “十四行诗第18首的内容是什么?"(RAG会从知识库检索)

2.5 调用你的RAGFlow应用

2.5.1 获取API密钥

  • 点击右上角头像 → APIAPI KEY

  • 点击 创建新密钥,生成一个以 ragflow- 开头的密钥

  • 复制保存,注意不要泄露

2.5.2 获取对话ID

  • 进入你创建的"莎士比亚问答助手"聊天界面

  • 从浏览器地址栏复制URL中的 dialogId

    • 格式类似:http://localhost/chat/123e4567-e89b-12d3-a456-426614174000

2.5.3 PHP调用

通过Composer安装社区维护的RAGFlow PHP客户端

composer require lyhiving/ragflow-laravel

编写调用代码 如ragflow_test.php

<?php

require 'vendor/autoload.php';

use RAGFlow\Laravel\Facades\RAGFlow;

// 配置(也可以放在.env文件中)
$apiKey = 'ragflow-你的密钥';  // 替换为你的API密钥
$baseUrl = 'http://localhost/api/v1';  // 替换为你的RAGFlow地址
$dialogId = '你的dialog-id';  // 替换为你的对话ID

// 初始化客户端
$client = new \RAGFlow\Client([
    'api_key' => $apiKey,
    'base_uri' => $baseUrl,
]);

// 发送对话请求
$response = $client->chat()->create([
    'dialog_id' => $dialogId,
    'messages' => [
        [
            'role' => 'user',
            'content' => 'What is love?'
        ]
    ],
    'stream' => false
]);

// 输出回答
echo "问题:What is love?\n";
echo "回答:" . $response['choices'][0]['message']['content'] . "\n";

// 输出引用来源(RAGFlow的特色功能)
if (isset($response['citations'])) {
    echo "\n引用来源:\n";
    foreach ($response['citations'] as $citation) {
        echo "- " . $citation['document_name'] . " (第" . $citation['chunk_id'] . "段)\n";
    }
}