首页 > 教程攻略 > ai资讯 >RAGFlow(2):集成深度文档理解能力的RAG引擎

RAGFlow(2):集成深度文档理解能力的RAG引擎

来源:互联网 时间:2026-08-03 13:55:40

RAG常见的应用架构,说白了核心就两大块:一个是向量数据库,专门负责文档的向量存储和查询召回;另一个是中间件,比如LangChain、LlamaIndex这类工具,它们负责把文档切成合适的块,再转成相应的Embedding。下面这张图基本就把整个流程说清楚了。

RAGFlow(2):集成深度文档理解能力的RAG引擎

RAG现存问题与解决方法

问题1:向量表征的语义召回粒度难以控制

这个问题其实挺常见的。文档切分的粒度直接决定了语义的精确度和召回效率。想要平衡这两者,就得靠LangChain、LlamaIndex这类中间件来帮忙,它们能让文档的切分变得合理可控。

问题2:文档切分策略的确定

目前比较有效的做法是基于空白的文字分段,同时把标题和段落合并在一起。这样一来,每个段落既能体现局部文字的语义,又不会脱离整篇文章或章节的主题。

问题3:RAG系统与LLM微调的争论

过去大家老在纠结到底该用RAG还是微调LLM,时间久了才发现,这两者根本不是非此即彼的关系。它们各有各的优势,结合起来用效果反而更好。而且,RAG在实时性和成本上确实比LLM微调更有优势,所以现在更受青睐。

问题6:长上下文LLM对RAG的挑战

长上下文LLM确实能处理长文本和复杂图表,但别指望它能包打天下。一来成本高,二来速度慢,而且就算它再厉害,也满足不了用户对海量数据的需求——它只能对特定的长文本或图片提问。所以,在个人知识库问答这个场景里,RAG依然是不可或缺的。两者完全可以结合着用。其实,LLM的长上下文能力对RAG来说反而是个大利好。用OpenAI联创Andrej Karpathy的一张图来打个比方:他把LLM比作计算机的CPU,上下文比作内存,而以向量为代表的数据库,就相当于这台计算机的硬盘。

问题7:RAG的查询和排序能力

单纯靠向量数据库做单路召回,很难真正满足RAG落地的要求。目前RAG大多面向C端个人知识库这种简单场景,用户数据基本都是文档,提问也多半是摘要总结类的,答案差不多能看就行。但一旦面向B端,单靠向量检索就有点力不从心了——既无法精准召回信息,又难以和企业内部的信息系统(尤其是那些结构化数据)集成。所以,必须在检索阶段引入多路召回和重排序,才能保证数据查询的准确度。

问题8:如何应对复杂多变的数据

现实中的数据格式五花八门,复杂的还包含各类图表。如果没理解清楚这些语义就直接上RAG方案——比如简单按文字空白切段落——那语义丢失几乎是必然的,最终的查询结果自然也是一团乱麻。针对这一点,infiniFlow推出的Infinity AI原生数据库,就是为了解决RAG在企业级应用中面临的复杂查询挑战:如何把企业现有的各类数据(既包括文档、图片这类非结构化内容,也包括结构化的信息系统)有效整合,并在此基础上实现多路召回和最终的融合排序。

部署体验

RAGFlow本地容器化部署

先拉一下代码:

git clone https://github.com/infiniflow/ragflow.git

RAGFlow默认会从Hugging Face下载模型。如果你没有梯子,就配置一下ragflow/docker/docker-compose.yml文件里的HF端点地址,改成https://hf-mirror.com。接着按下面的步骤启动容器:

cd ragflow/docker/

chmod +x ./entrypoint.sh

sudo sysctl -w vm.max_map_count=262144

sudo docker compose up -d

服务启动后,可以查看一下日志:

sudo docker logs -f ragflow-server

看到日志正常跑起来就OK了。然后打开http://localhost:80,页面会跳转到登录界面,注册之后就可以进去了。

通过ngrok配置转发RAGFlow服务

ngrok在Ubuntu上安装很快:

sudo apt install snapd  # 先安装snap
snap install ngrok

装完之后需要在官网注册一下,并配置token:

ngrok config add-authtoken 2d********Jpg

可以用下面这个命令查看ngrok的配置路径:

ngrok config check

打开配置路径,可以在authtoken字段下面增加tunnel字段。有个小坑:官方只提供一个免费域名,也就是说只能有一个 App绑定这个域名,其他App只能随机分配域名。

tunnels:
  ssh:
    proto: tcp
    addr: 2222
  jupyter:
    proto: http
    addr: 8888
    domain: assured-fowl-gladly.ngrok-free.app
  ragflow:
    proto: http
    addr: 80

除了上面protoaddrdomain这些字段,还有一点要注意:ngrok的管道只能启动一次。比如你要同时启动jupyter和ragflow两个App,必须一次性启动它们:

ngrok start jupyter ragflow

不能分开在两个终端里分别执行ngrok start jupyterngrok start ragflow。当然,如果你不想改动配置管道,也可以在启动RAGFlow服务时直接指定域名,像这样:

ngrok http --domain=assured-fowl-gladly.ngrok-free.app 80