Skip to content

使用 AI 与 RAG 进行领域分析

Embedding RAG GraphRAG

ceshiren.com


大纲

  • 嵌入模型 Embedding
  • 检索增强生成 RAG
  • 基于知识图谱的 RAG GraphRAG
  • 垂直领域分析 UML

嵌入模型 Embedding Model


嵌入模型的主要用途

  • Search 搜索(结果按与查询字符串的相关性排序)
  • Clustering 聚类(文本字符串按相似性分组)
  • Recommendations 推荐(推荐具有相关文本字符串的条目)
  • Anomaly detection 异常检测(识别出相关性很小的异常值)
  • Diversity measurement 多样性测量(分析相似性分布)
  • Classification 分类(其中文本字符串按其最相似的标签分类)

嵌入模型介绍

嵌入模型(Embedding Model)是一种将高维数据(如文本、图像、音频等)转化为低维向量表示的模型。它的主要目标是通过将输入数据映射到一个嵌入空间,使得语义相近的输入能够在嵌入空间中接近彼此。这种表示形式常用于自然语言处理(NLP)、图像处理和推荐系统等任务。


嵌入模型的纬度(Dimension)

纬度是指嵌入向量的长度,即向量空间的维度。纬度的大小决定了模型输出的向量有多少个值来表示一个数据点。较高的纬度:表示能力强,模型可以捕捉到更复杂和更多的特征,但也会增加计算成本,模型泛化能力可能下降。较低的纬度:表示简单,计算开销小,适用于需要低计算资源的任务,但表达能力可能受限。参数量 = 词汇量 * 嵌入维度


嵌入纬度的变化


嵌入的表示

嵌入


多模态嵌入模型

  • Word Embedding:如 Word2Vec,将词转化为固定维度的向量表示。
  • 句子或文档嵌入:BERT 能够对整句话或段落进行编码,输出句子的嵌入表示。
  • 图像嵌入:ResNet、Inception 等,通过卷积神经网络将图像转化为低维向量

embedding modal


常用嵌入模型

嵌入模型 纬度
mxbai-embed-large 1024
nomic-embed-text 768
qwen2.5 3584
llama3.2 3072
llama3 llama3.1 4096
text-embedding-3-small 1536
text-embedding-3-large 3072

mxbai-embed-large 介绍

截至 2024 年 3 月,该模型在 MTEB 上为 Bert-large 模型实现了 SOTA 性能。它的表现优于 OpenAI 的 text-embedding-3-large 模型等商业模型,并且与其 20 倍大小的模型的性能相当。 mxbai-embed-large 是在没有 MTEB 数据重叠的情况下进行训练的,这表明该模型在多个领域、任务和文本长度上具有良好的泛化能力。


利用 ollama 的嵌入模型计算嵌入向量

$ curl -q  http://localhost:11434/api/embeddings -d '{
  "model": "mxbai-embed-large",
  "prompt": "hello"
}'
{"embedding":[0.6889729499816895,0.09035132825374603,0.06848843395709991,0.3375093638896942,-0.27357494831085205,-0.5326277017593384,0.3095177412033081,

向量存储 Vector Store

向量存储(Vector Store) 是一种用于存储和管理高维向量的数据库或系统,主要用于支持类似于向量化搜索、相似度查询等任务。向量存储特别适用于机器学习和人工智能领域的嵌入模型,尤其是在自然语言处理、计算机视觉和推荐系统等应用场景中。

向量存储

note: 在传统的数据库中,数据通常是通过结构化查询语言(SQL)或其他索引方式来检索的,比如通过键值对、关系映射等。而在向量存储中,数据以向量的形式存储,允许用户根据向量之间的相似性进行搜索。这种存储方式尤其适合用于嵌入模型产生的向量数据。


Facebook AI 相似性搜索 (FAISS) 是一个用于高效相似性搜索和密集向量聚类的库。它包含搜索任意大小的向量集(最多可能不适合 RAM)的算法。它还包括用于评估和参数调整的支持代码。

FAISS


嵌入搜索 向量相似性(Vector Similarity)

  • 欧氏距离(Euclidean Distance)
  • 近似最近邻搜索 Approximate Nearest Neighbor, ANN


embedding 嵌入搜索例子

def test_embedding():
    embeddings = OllamaEmbeddings(model="qwen2.5")
    info(f'embeddings 纬度: {len(embeddings.embed_query("hello"))}')

    text_list = [
        'apple watch比较贵',
        '霍格沃兹测试开发学社是知名的测试开发培训机构',
        '1+1=2',
        'cat eats fish',
        '计算器可以用来做计算。'
    ]

    vectorstore = InMemoryVectorStore.from_texts(text_list, embedding=embeddings)
    # Use the vectorstore as a retriever
    retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
    # Retrieve the most similar text
    for query in ['测试', '测试开发', '测试开发培训机构哪家强', '1+1=?']:
        info(query)
        retrieved_documents = retriever.invoke(query)
        info([doc.page_content for doc in retrieved_documents])

嵌入搜索执行结果

embeddings 纬度: 3584

测试
['apple watch比较贵', '计算器可以用来做计算。', '霍格沃兹测试开发学社是知名的测试开发培训机构', '1+1=2']

测试开发
['霍格沃兹测试开发学社是知名的测试开发培训机构', 'apple watch比较贵', '计算器可以用来做计算。', '1+1=2']

测试开发培训机构哪家强
['霍格沃兹测试开发学社是知名的测试开发培训机构', 'apple watch比较贵', '计算器可以用来做计算。', '1+1=2']

1+1=?
['1+1=2', '计算器可以用来做计算。', '霍格沃兹测试开发学社是知名的测试开发培训机构', 'apple watch比较贵']

嵌入搜索与大模型生成的区别

嵌入搜索 大模型生成
目标 找到与输入相似的现有内容 根据输入生成全新的内容
计算 基于向量相似度查找 基于生成模型根据输入生成
输出 已有的相似内容 完全新生成的内容
应用 语义搜索、推荐系统、内容检索 文本生成、对话生成、代码生成
依赖 嵌入模型、向量数据库 大规模预训练语言模型 GPT

RAG 检索增强生成


RAG 检索增强生成的流程

向量嵌入


使用 Dify 创建知识库

dify 知识库


文本处理与嵌入模型选择

嵌入模型 文本分段


问答助手加入 RAG


GraphRAG


GraphRAG 介绍

GraphRAG 是一种结构化的、分层的检索增强生成 (RAG) 方法,不同于使用纯文本片段的简单语义搜索方法。GraphRAG 流程包括从原始文本中提取知识图谱、构建社区层次结构、为这些社区生成摘要,然后在执行基于 RAG 的任务时利用这些结构。

GraphRAG An LLM-generated knowledge graph built using GPT-4 Turbo.


传统 RAG 的不足

  • 当回答问题需要通过其共享属性遍历不同的信息以提供新的综合见解时表现不佳
  • 当被要求全面理解大型数据集甚至单个大型文档中的总结语义概念时表现不佳

GraphRAG 使用 LLM 基于输入语料库创建知识图谱用于增强查询时的提示。GraphRAG 在回答上述两类问题方面表现出显着的进步。


微软 GraphRAG 工具

基于模块化图的检索增强生成 (RAG) 系统,此存储库介绍了一种使用知识图谱内存结构来增强 LLM 输出的方法。请注意,提供的代码仅供演示,并非 Microsoft 官方支持的产品。 ⚠️ 警告:GraphRAG 索引可能是一项昂贵的操作,请阅读所有文档以了解所涉及的流程和成本,并从小处着手。


微软 GraphRAG 基本使用

pip install graphrag
mkdir -p ./ragtest/input
curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt -o ./ragtest/input/book.txt
python -m graphrag.index --init --root ./ragtest
python -m graphrag.index --root ./ragtest
python -m graphrag.query \
--root ./ragtest \
--method global \
"What are the top themes in this story?"

Kotaemon RAG UI

一个开源的干净且可自定义的 RAG UI,用于与您的文档进行聊天。在构建时充分考虑了最终用户和开发人员。

Kotaemon


Kotaemon docker 部署

#服务器安装方式
docker run \
--name graphrag -d \
-e GRADIO_SERVER_NAME=0.0.0.0 \
-e GRADIO_SERVER_PORT=7860 \
-p 7860:7860 \
--platform linux/arm64 \
-v $PWD/flowsettings.py:/app/flowsettings.py \
ghcr.io/cinnamon/kotaemon:main-full

#默认没有安装graphrag,需要独立安装,可以定制dockerfile或者简单在docker内安装
docker exec -it graphrag pip install graphrag future

#配置文件 /app/flowsettings.py
docker cp graphrag:/app/flowsettings.py .

Kotaemon python 启动

#环境 pip也可以
conda create -n kotaemon python=3.10
conda activate kotaemon

# clone this repo
git clone https://github.com/Cinnamon/kotaemon
cd kotaemon

pip install -e "libs/kotaemon[all]"
pip install -e "libs/ktem"
pip install graphrag future

# 编辑配置文件 graphrag的配置模板
# settings.yaml.example
# 环境默认配置
# .env
# 系统默认配置
# flowsettings.py

#启动
USE_CUSTOMIZED_GRAPHRAG_SETTING=true python app.py

配置修改示例

diff --git a/.env.example b/.env.example
index 2e15626..48e86d2 100644
--- a/.env.example
+++ b/.env.example
@@ -17,11 +17,11 @@ AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT=text-embedding-ada-002
 COHERE_API_KEY=<COHERE_API_KEY>

 # settings for local models
-LOCAL_MODEL=llama3.1:8b
-LOCAL_MODEL_EMBEDDINGS=nomic-embed-text
+LOCAL_MODEL=qwen2.5
+LOCAL_MODEL_EMBEDDINGS=qwen2.5

 # settings for GraphRAG
-GRAPHRAG_API_KEY=<YOUR_OPENAI_KEY>
+GRAPHRAG_API_KEY=
 GRAPHRAG_LLM_MODEL=gpt-4o-mini
 GRAPHRAG_EMBEDDING_MODEL=text-embedding-3-small

diff --git a/settings.yaml.example b/settings.yaml.example
index 7b0ca77..d4ea7a2 100644
--- a/settings.yaml.example
+++ b/settings.yaml.example
@@ -8,7 +8,7 @@ llm:
   api_key: ${GRAPHRAG_API_KEY}
   type: openai_chat # or azure_openai_chat
   api_base: http://127.0.0.1:11434/v1
-  model: qwen2
+  model: qwen2.5
   model_supports_json: true # recommended if this is available for your model.
   # max_tokens: 4000
   request_timeout: 1800.0
@@ -41,7 +41,7 @@ embeddings:
   llm:
     api_base: http://localhost:11434/v1
     api_key: ${GRAPHRAG_API_KEY}
-    model: nomic-embed-text
+    model: qwen2.5
     type: openai_embedding
     # api_base: https://<instance>.openai.azure.com
     # api_version: 2024-02-15-preview

使用本地模型

Kotaemon llm


本地嵌入模型

Kotaemon embeding


Kotaemon RAG 配置

Kotaemon  RAG


使用 RAG


垂直领域分析


领域数据抓取与分析

  • 文档:转换通用格式
  • 链接:爬取、下载,转换通用格式
  • 数据:进行数据处理,转化通用格式
  • 通用格式:png, .jpeg, .jpg, .tiff, .tif, .pdf, .xls, .xlsx, .doc, .docx, .pptx, .csv, .html, .mhtml, .txt, .md, .zip

Kotaemon upload


按照 5W1H 方法论 对数据进行探索

  • 静态图:类图 对象图 包图
  • 实现图:组件图 部署图
  • 剖面图:复合结构图
  • 行为式图形:活动图 状态图 用例图
  • 交互性图形:通信图 交互概述图 时序图 时间图

5W1H


Q&A