RAG基础介绍
1. 索引 — 将文档库分割成较短的 Chunk(文档切片),并通过编码器构建向量索引。
2. 检索 — 根据问题和 chunks 的相似度检索相关文档片段。
3. 生成 — 以检索到的上下文为条件,生成问题的回答。
主要流程及技术:
1)ETL-数据接入工具
2)标注系统-问答对生成
3)词嵌入模型-向量化/嵌入
4)向量数据库-向量存储&查询
5)知识库-知识存储
6)Search-知识和向量的检索能力
7)Rerank-混合检索后的重排
8)LLM-利用大模型的生成能力重新整理回答
本次主要介绍3)词嵌入模型和4)向量数据库
词嵌入模型(embedding model)
Q:什么是embedding?
A:用户输入的任意语言的文本,都会先进行嵌入操作,转换为向量表示。这个过程即embedding,也可以理解为向量化或者词嵌入的过程
主要模型介绍和对比
模型 | 公司 | 开源 | Sequence Length | Dimension | |
text-embedding-3-large | openAI | 否 | 8192 | 3072 | |
embedding-v1 | 百度云 | 否 | 384 | ||
bge-large-m3 | 智源研究院 | 是 | 8192 | 1024 | |
text-embedding-v3 | 阿里云 | 否 | 8192 | 1024 | |
m3e | Meta ai | 是 | 512 | 768 | |
Embedding | 讯飞 | 否 | |||
acge | 合合信息 | 是 | 1024 | 1792 | |
bce-embedding-base_v1 | 网易 | 是 | 512 | 768 | |
具体使用情况可以自行查阅榜单(在业界权威的中文语义向量评测基准C-MTEB(Chinese Massive Text Embedding Benchmark),是动态变化的。
代码举例
#功能:根据问题检索出最相似的文档(用的bge-m3) from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel(r'xxx\bge\bge\m3', use_fp16=True) app = FastAPI() #2个问题 queries = ["What is BGE M3?", "Defination of BM25"] #2个文档 docs = ["BGE M3 is an embedding model supporting dense retrieval, lexical matching and multi-vector interaction.", "BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document"] #问题向量化 query_embeddings = model.encode(queries, batch_size=12, max_length=1024,)['dense_vecs'] #文档向量化 docs_embeddings = model.encode(docs)['dense_vecs'] #问题和文档两两计算相似度 similarity = query_embeddings @ docs_embeddings.T #输出相似度结果 print(similarity) |
向量数据库
作为存储解决方案使RAG、AI Agent 具备记忆能力,能够保存和检索相关信息,实现长期学习和任务连续性。
目标:在数百万甚至数百亿的向量中高效地找到与给定向量最相似的那些向量,同时,也需要高效地存储和管理海量的 embedding。
传统数据库虽然能做,但是不专业:无法做到最优,特别是在处理大规模向量时依旧有很大的性能问题和存储开销。如redisearch,在 embedding 数量仅仅在百万级规模时,就要花巨量的内存(> 16G),以及非常漫长的构建索引的时间。有些还没有成熟的相似度算法支持。
向量数据库对比表:
数据库 | 公司 | 开源 | 支持语言 | 其他 |
Weaviate | Weaviate | 是 | Python、JavaScript、go | 使用图数据结构,专业向量数据库 |
Qdrant | Qdrant | 是 | Rust、Python、go | 专业向量数据库 |
pgvector | Supabase | 是 | 任何带有PostgreSQL客户端的语言 | PostgreSQL插件 |
Milvus | Zilliz | 是 | python、java、c++、go | 专业向量数据库 |
es | Elastic | 是 | python、java、c++、go | 7.10支持knn,8.0支持向量类型及nlp |
流行选择: Chroma, Weaviate, Pinecone, Qdrant, Milvus
特殊方案: Postgres + pgvector 扩展
也可自行查阅业界留下的向量数据库排行榜,动态变化。
RAG框架
已有很多成熟的框架封装好了上面说的一些技术组件并提供web形式的管控门户:
- AnythingLLM,具备完整的 RAG和AI代理能力。https://github.com/Mintplex-Labs/anything-llm
- MaxKB,即插即用。https://github.com/1Panel-dev/MaxKB
- RAGFlow,一个基于深度文档理解的开源RAG引擎。https://github.com/infiniflow/ragflow
- Dify,一个开源的大型语言模型应用开发平台。Dify直观的界面结合了AI工作流、RAG流程、代理能力、模型管理、可观测性功能。https://github.com/langgenius/dify
- FastGPT,提供即开即用的数据加工和模型调用能力,允许通过流程可视化进行工作流编排。https://github.com/labring/FastGPT 。项目技术栈:NextJs + TS(TypeScript) + ChakraUI + Mongo + Postgres (Vector 插件)
Graph-RAG框架
GraphRAG 及如今热门的 KAG框架的核心改进在于 RAG 的基础上,加强了实体、Chunk之间的关联,适当融入了知识图谱的功能,以此来提高信息检索挖掘潜在实体关联的能力,增强检索召回。
- LightRAG,简单快速的Graphrag检索增强生成。https://github.com/HKUDS/LightRAG
- microsoft-GraphRAG,一个模块化的基于图的检索增强生成(RAG)系统。https://github.com/microsoft/graphrag
- KAG,基于OpenSPG引擎的知识增强生成框架https://github.com/OpenSPG/KAG
- Fast-GraphRAG,GraphRAG的轻量化版本。https://github.com/circlemind-ai/fast-graphrag
- Tiny-GraphRAG,https://github.com/limafang/tiny-graphrag