Open WebUI + RAG 基础

  1. RAG 是什么

RAG 是 Retrieval Augmented Generation 的缩写,即检索增强生成。

使用 RAG 的目的是为模型提供更多的上下文,减少模型的幻觉,提高模型的注意力。

  1. RAG 常见原理

RAG 的核心思想是为模型补充上下文,上下文的来源可以是文档网页图片…。最终所有的信息都会被喂给聊天模型(ChatGPT,Claude,Gemini…)。

现在常用的 RAG 工作流都依赖嵌入向量模型,流程大概是:

  • 索引构建

收集整理要用的上下文文件(数据源),提交给嵌入向量模型(embedding),嵌入模型会返回数据的向量表示,客户端将向量数据保存到向量数据库中。

  • 查询构建

客户端将用户提问也转换为向量数据,然后使用向量查询算法从向量数据库中检索相关的信息,提取相关度最高的信息块(可能有多块)。

  • 模型问答

将以上提取到的信息块与用户的提问合并,调整提示词,喂回给聊天模型,实现上下文补充。

注意,向量检索过程中,用户提问和上下文都是向量数据。但是聊天模型不能直接使用向量数据,所以最终还是会从数据源中提取对应的内容(一般是文字)。

  1. RAG 质量关键
  • 嵌入向量模型:决定上下文向量化的质量。
  • 聊天模型:最终所有的信息还是靠聊天模型来分析思考。
  • 客户端:上下文整理(文件切割,预处理),以及使用的向量查询算法,内容提取算法。
  1. Open WebUI 集成 RAG

open webui 使用 RAG 的主要场景有两个:文档对话网页搜索。其实在使用网页搜索时,open webui 也会将搜索到的网页数据进行向量化处理。

配置核心是文档设置:向量模型可以使用自带的本地模型,也可以使用 openai 格式可用的在线模型。内容提取模型一般选择默认就好,tika 那个不一定可用。Batch Size 需要根据向量模型的文档设置(openai 的两个模型都支持 2048 大小),一般是越大越快。

  1. 一些建议

现在很多中转都只关心聊天模型,其实向量模型根本不可用…,这个需要自己鉴别。

在线向量模型一次请求能接受的数据是有限的,完成一次文档向量可能需要几十次甚至上百次请求,所以要注意网络和使用的中转质量。

彩蛋:我使用的BAAI/bge-m3模型是硅基流动的,这个模型官方没有限速,而且用的人很少,所以比较稳定。

11 个赞

BAAI/bge-m3一次能处理的数据比较少。我的一份几乎纯文本的,大小为 1.3 MB 的文档大概请求了 380 多次才完成向量化(次数多,但不慢)。

为什么检索的向量不能直接作为上下文提供呢?到模型也是要转成向量给模型,直接给就行啊。

学习了。正想把open webui好好用起来。

现在聊天模型只能理解文字(和图片)。

检索的向量跟模型输入需要的向量不是一个东西

向量化 每个文档做一次就够了,还是每次初始化对话他都得跑一次

都是向量为什么不是一个东西?

我知识库里的(1,0,0,0,0)和你知识库里的(1,0,0,0,0)能一样吗

能一样,可以一样也可以不一样。为什么一定不一样呢?

1 个赞

感谢你的教程

大佬,你语义向量模型地址哪里用的的openai的官key吗

用不起官 key,我用的是我本地搭建的 new api,里面聚合了一些中转。

大佬,我看你配置了。硅基流动BAAI/bge-m3这个模型怎么在new api里填?求助:硅基流动BAAI/bge-m3这个模型怎么在new api里填?

感謝整理 一直想全面學習這裡的知識

帶著老友的知識去跟polx學習了一波
Rag搭配提示詞可能更好用
我也覺得有道理
給老友們看看
https://www.perplexity.ai/search/rag-shi-shi-yao-rag-shi-retrie-TGMKH_t5SseeENSpnbg1gQ

1 个赞

做一次,但做好后,不可以更改embedding模型,