从零开始构建的多模态RAG架构:如何将文本与图像完美融合?

多模态RAG系统架构:分层设计与跨模态对齐实战 多模态RAG(检索增强生成)是实现文本、图像、音频、视频等异构数据联合检索与推理的关键技术。其核心原理在于打破模态壁垒,通过模态感知、特化编码、跨模态对齐、意图路由与反馈闭环五层结构,保障各模态语义纯粹性与协同可用性。技术价值体现在显著提升首检命中率、降低生成延迟、抑制幻觉,并支撑工业质检、医疗影像分析、智能知识库等高要求场景。本文聚焦真实产线验证的架构实践,深入解析模态分片向量库、语义关键帧提取、Anchor-Guided对齐等关键技术,尤其强调模态感知层与模态路由引擎在工程落地中的决定性作用。 阅读详情
不同方法的全面概述

null

检索增强生成(RAG)系统和多模态大型语言模型(LLMs)正在迅速发展,应用范围从增强搜索体验到生成复杂内容。这些方法不断被改进,以扩展人工智能的能力边界。但是,如果你可以结合它们的优势,构建一个不仅处理文本,还能无缝处理图像的RAG系统呢?

现在想象一下,进一步发展这个系统,而不依赖于像LangChain或LlamaIndex这样的预构建框架?

无框架的方法使你拥有完全的控制权,让你可以根据自己的确切需求量身定制应用,而不受外部依赖或版本限制的约束。

在这篇博客中,我们将带你深入了解这个过程。从比较文本和图像提取工具,到从零开始构建一个强大的多模态RAG系统,我们将逐步引导你,帮助你创建自己的定制解决方案。

本教程的完整代码可在以下Colab笔记本中找到(文章中的代码格式可能会出现问题):

Colab Notebook: Multimodal RAG Implementation

在这里插入图片描述

Part 1: 数据摄取用于多模态RAG系统

任何RAG系统的基础是可靠的数据。为了使系统能够检索和生成准确的结果,它处理的内容需要干净、完整且结构良好。处理PDF时,这意味着不仅要提取文本,还要提取图像和表格,确保没有有价值的信息丢失。

选择合适的PDF处理工具至关重要。由于可用的库众多,决定哪个最适合您的需求可能会让人感到不知所措。有些优先考虑速度,有些则注重准确性,还有一些在两者之间提供平衡。为了帮助您做出明智的决策,我们评估了三个流行的库:PyMuPDF、PDFium和PDFPlumber。

在 RAG 系统中选择合适的 PDF 处理工具
PDFPlumber:

pdfplumber 可以从 PDF 中提取相当准确的文本和表格。然而,它有一个显著的缺点:对于复杂的 PDF 文件,它可能会非常耗时。例如,从一个 100 页的 PDF 中提取内容可能需要 1 分钟和 10-30 秒。这是一个相当大的延迟,特别是在处理多个 PDF 时。

Code Example:

!pip install pdfplumber
import pdfplumber
import time
defread_text_pdfplumber(pdf_path):
""" Extracts text and tables from pdf using pdfplumber """

  text_results=[]
  tables=[]
with pdfplumber.open(pdf_path) as pdf:
      for page in pdf.pages:
          # Text extraction
          text = page.extract_text()
          text_results.append(text)
          # Table extraction
          table = page.extract_tables()
          tables.append(table)
return(text_results,tables)

对于一个 622 页的 PDF,该脚本花费了 152.35 秒 来提取文本和表格。

PDFium:

pdfium 是一个快速的库,可以在 5–15 秒内将 PDF 内容转换为文本。由于其将 PDF 页面转换为图像并从中提取文本的方法,文本提取相当准确。这使得它成为快速文本提取的绝佳选择。然而,它有一个限制:它并不明确支持将图像或表格与文本分开。

Code Example:

!pip install pypdfium2
import pypdfium2 as pdfium
defread_text_pdfium(path):
   """ Extracts text from pdf using pdfium """
   
   pdf = pdfium.PdfDocument(path)
   version = pdf.get_version()  # get the PDF standard version
   n_pages = len(pdf)
   pdfium_text=""
   for i inrange(len(pdf)):
    page = pdf[i]  # load a page
     width, height = page.get_size()
     textpage = page.get_textpage()
     text_part = textpage.get_text_bounded(left=50, bottom=100, right=width, top=height)
     pdfium_text+=text_part
   
   return pdfium_text

对于一个 622-页的 PDF,该脚本花费 5–10 秒 提取文本。

PyMuPDF

如果您正在寻找从PDF中提取内容的最佳工具之一,PyMuPDF无疑是一个不错的选择。它非常快速,处理一个PDF仅需4到7秒。它不仅可以提取文本,还能处理图像,使其成为一个全面的选项。如果您需要在多个PDF中获得快速且可靠的结果,PyMuPDF绝对值得考虑。

代码示例:

!pip install pymupdf
import fitz  # PyMuPDF library
def read_text_pymupdf(path):
    """Extracts text from a PDF using PyMuPDF."""
    doc = fitz.open(path)
    text_results = []
    for page in doc:
        text = page.get_text()
        text_results.append(text)
    return text_results

在这里,我将使用PyMuPDF从PDF中提取图像。这些图像将保存在输出目录中。

代码示例:

import fitz  # PyMuPDF
import os
defextract_images_from_pdf(pdf_path, output_folder):
"""  Extract images from pdf using PyMuPDF """

    pdf_document = fitz.open(pdf_path)

    os.makedirs(output_folder, exist_ok=True)
    for page_number inrange(len(pdf_document)):
        page = pdf_document[page_number]
        images = page.get_images(full=True)
                for image_index, img inenumerate(images):
                    xref = img[0]
                    base_image = pdf_document.extract_image(xref)
                    image_bytes = base_image["image"]
                    image_ext = base_image["ext"]
                    image_filename = f"page_{page_number+1}_image_{image_index+1}.{image_ext}"
                    image_path = os.path.join(output_folder, image_filename)
                    withopen(image_path, "wb") as image_file:
                        image_file.write(image_bytes)
                    print(f"Saved: {image_path}")
            pdf_document.close()

对于一个622页的PDF,PyMuPDF仅用5到6秒就提取了文本,提供了相对于其他库的显著性能优势。这种效率使其成为处理大型或多个PDF的绝佳选择。然而,理想的库取决于您的具体用例和需求。

PDF库的处理时间比较

下表比较了使用三种库(PDFium、PyMuPDF和PDFPlumber)处理不同页数的PDF所需的时间。

null

根据性能分析,PyMuPDF的性能始终优于PDFium和PDFPlumber,对于处理页数超过1,000的PDF,速度比PDFium快2.3倍,比PDFPlumber快59倍。

主要要点
  • • PyMuPDF 是最快的,非常适合大规模或时间敏感的任务。
  • • PDFium 在速度和准确性之间提供了平衡,但缺乏图像提取功能。
  • • PDFPlumber 较慢,但在从复杂PDF中提取详细表格方面表现出色。
库性能比较

null

如果您想了解更多关于PDF基准测试的信息,请查看这个仓库:

https://github.com/py-pdf/benchmarks?tab=readme-ov-file

第二部分:嵌入文本和图像

现在我们已经处理了PDF内容,下一步是构建一个多模态RAG系统。这涉及将提取的文本和图像集成到一个检索增强的管道中。

对于内容提取,我将使用PyMuPDF,因为它具有卓越的速度和处理文本与图像的能力。为了构建多模态检索器,我将利用QdrantDB作为向量存储。

处理和嵌入文本和图像

文本内容被拆分为更小、可管理的块,以优化嵌入性能和检索准确性。在这里,我们使用 LangChain 的 RecursiveCharacterTextSplitter,因为它简单且可配置。然而,拆分文本可以通过多种方式完成,例如编写自定义拆分器或利用 NLTK 或 spaCy 等库。

在这个例子中,我们为每个块添加元数据,包括 PDF 路径和唯一的 UUID。元数据有助于在检索过程中保持上下文。

安装依赖:

#for colab to load openai client
%%capture
!pip install openai==1.55.3 httpx==0.27.2 --force-reinstall --quiet
!pip install transformers torch pillow
!pip install --upgrade nltk
!pip install sentence-transformers
!pip install --upgrade qdrant-client fastembed Pillow
!pip install -U langchain-community
将文本拆分为块

我们将为每个块添加相关的元数据,元数据可以是任何东西,可以帮助检索块。但在这里,我只是将 pdf 路径和唯一的 uuid 作为文本的元数据添加。

from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1024,
    chunk_overlap=20,
    length_function=len,
    is_separator_regex=False,
)
#here text_results contain all text from pdf
doc_texts = text_splitter.create_documents(text_results)
import uuid
for i inrange(len(doc_texts)):
  unique_id = str(uuid.uuid4())
  doc_texts[i].metadata['document_info'] = pdf_path
  doc_texts[i].metadata['uuid'] = unique_id
print(doc_texts[0].metadata)
嵌入文本块

一旦分割,文本块将使用 Nomic text embedding model 进行嵌入。这将每个块转换为适合存储在检索器中的向量表示。

from transformers import AutoTokenizer, AutoModel
### Load the tokenizer and model
text_tokenizer = AutoTokenizer.from_pretrained("nomic-ai/nomic-embed-text-v1.5", trust_remote_code=True)
text_model = AutoModel.from_pretrained("nomic-ai/nomic-embed-text-v1.5", trust_remote_code=True)
defget_text_embeddings(text):
    inputs = text_tokenizer(text, return_tensors="pt", padding=True, truncation=True)
    outputs = text_model(**inputs)
    embeddings = outputs.last_hidden_state.mean(dim=1)
    return embeddings[0].detach().numpy()
### Example usage
text = "This is a test sentence."
embeddings = get_text_embeddings(text)
print(embeddings[:5])
#embedding text
texts_embeded = [get_text_embeddings(document.page_content) for document in doc_texts]
text_embeddings_size=len(texts_embeded[0])
text_embeddings_size
#output: 768
嵌入图像

图像从指定目录读取,并使用 Nomic Vision embedding model 嵌入。last_hidden_state 输出的均值用于将每个图像表示为固定长度的向量。

这是加载模型和测试图像的示例代码:

from transformers import AutoModel, AutoProcessor
from PIL import Image
import torch
model = AutoModel.from_pretrained("nomic-ai/nomic-embed-vision-v1.5", trust_remote_code=True)
processor = AutoProcessor.from_pretrained("nomic-ai/nomic-embed-vision-v1.5")
### Load the image
#testing an image on loaded model 
image = Image.open("/content/drive/MyDrive/images/Screenshot 2024-09-08 025257.png")
inputs = processor(images=image, return_tensors="pt")
model.eval()
#testing model
with torch.no_grad():
    outputs = model(**inputs)
embeddings = outputs.last_hidden_state
print(embeddings)

对于我们的多模态 RAG,图像将通过使用 PIL 从目录中读取,然后使用加载的视觉模型进行嵌入,使用以下代码。

import os
import numpy as np
image_embeddings = []
image_files = os.listdir(output_directory)
for img in image_files:
    try:
        image = Image.open(os.path.join(output_directory, img))
        inputs = processor(images=image, return_tensors="pt")
        model.eval()
        with torch.no_grad():
            outputs = model(**inputs)
        embeddings = outputs.last_hidden_state
        print(f"Image: {img}, Embedding shape: {embeddings.shape}")
        if embeddings.size(0) > 0:  
            image_embedding = embeddings.mean(dim=1).squeeze().cpu().numpy()
            image_embeddings.append(image_embedding)
        else:
            print(f"Skipping image {img} due to empty embeddings.")
    except Exception as e:
        print(f"Error processing {img}: {e}")
#setting image embedding model length:
image_embeddings_size=len(image_embeddings[0])

关键注意事项:

  • • 工具的灵活性:虽然这里使用了 Nomic 模型,但可以替换为 Sentence Transformers 或自定义模型以满足特定需求。
  • • 元数据的重要性:添加相关的元数据,如唯一标识符,可以确保可追溯性并提高检索准确性。

在文本和图像嵌入准备就绪后,下一步是将它们整合到统一的检索管道中。这将使系统能够在不同模态之间无缝地检索和生成响应。

设置 Qdrant 以进行多模态检索

在文本和图像嵌入准备就绪后,下一步是初始化 Qdrant client 并将其配置为多模态检索。Qdrant 作为向量数据库,允许在文本和图像嵌入之间进行高效的相似性搜索。

初始化 Qdrant 客户端

在这里,我们使用 Qdrant 的内存配置进行测试。对于生产环境,请将 :memory: 替换为持久数据库路径,以确保可扩展性。

from qdrant_client import QdrantClient, models
client = QdrantClient(":memory:")
为文本和图像创建单独的集合

我们创建两个单独的集合:一个用于文本,另一个用于图像。每个集合都根据所使用的嵌入模型配置了向量参数(size 和 distance)。

### Check if the collection exists, and create it if not
ifnot client.collection_exists("images"):  #creating a Collection
    client.create_collection(
        collection_name="images",
        vectors_config=models.VectorParams(
        size=image_embeddings_size,  # Vector size is defined by model being used for embedding
        distance=models.Distance.COSINE,
    ),
   )

ifnot client.collection_exists("text"):
 client.create_collection(
        collection_name ="text",
      vectors_config=models.VectorParams(
        size=text_embeddings_size,  # Vector size is defined by model being used for embedding
        distance=models.Distance.COSINE,
    ),
 )
将嵌入上传到 Qdrant

在创建集合后,我们用嵌入和元数据填充它们。元数据确保在检索过程中保持上下文和可追溯性。

上传文本嵌入

我们通过上传文本嵌入及其相关元数据(例如内容和唯一标识符)来填充文本集合。

client.upload_points(
    collection_name="text",
    points=[
        models.PointStruct(
            id=doc.metadata['uuid'],
            vector=np.array(texts_embeded[idx]),
            payload={ #save meta data and content as payload
                "metadata": doc.metadata,
                "content": doc.page_content
            }
        )
        for idx, doc in enumerate(doc_texts)
    ]
)

上传图像嵌入

对于图像,每个嵌入都与其对应的图像路径在负载元数据中关联。我们存储图像路径,以便在多模态 LLM 检索时重新加载图像。这种有组织的方法允许在集合中高效搜索图像。

#for image embeddings
### Ensure that image_embeddings are not empty
iflen(image_embeddings) > 0:
    # Upload points to Qdrant
    client.upload_points(
        collection_name="images",
        points=[
            models.PointStruct(
                id=str(uuid.uuid4()),  # unique id of a point
                vector= np.array(image_embeddings[idx])  ,
                payload={"image_path": output_directory+'/'+str(image_files[idx])}  # Image path as metadata
            )
            for idx inrange(len(image_files))  
    )
else:
    print("No valid embeddings found, nothing to upload.")

第 3 部分:创建检索器

最后,我们通过设置多模态检索器将所有内容整合在一起,使我们能够检索与用户查询匹配的文本块和图像。检索器配置为根据相似性得分从每个集合中返回前 3 个结果,文本和图像。

为什么要分开集合?

文本和图像嵌入在不同的特征空间中操作,它们的相似性得分不可直接比较。通过分开集合并运行独立查询,我们确保文本和图像结果都能以适当的权重和相关性被检索。这样可以避免某一种模态(例如,文本)因更高的相似性得分而主导结果,从而掩盖另一种模态的相关结果。

使用独立集合确保:

  • • 文本块是根据与查询的语义相似性进行检索的。
  • • 图像是根据其视觉相似性进行检索的,与文本得分无关。

这种分离对于多模态系统至关重要,因为这两种模态在满足用户意图方面同样重要。

检索器函数
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
defMultiModalRetriever(user_query):
    """
    检索多模态结果(文本和图像)。
    参数:
    - user_query: 用户的查询字符串。
  
    """
    query = get_text_embeddings(user_query)
    # 检索文本结果
    text_hits = client.query_points(
        collection_name="text",
        query=query,
        limit=3, #根据需求设置自己的限制
    ).points
    # 检索图像结果
    Image_hits = client.query_points(
        collection_name="images",
        query=query,
        limit=3, #根据需求设置自己的限制
    ).points
    return text_hits, Image_hits

现在构建一个查看器以显示检索结果:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
#text_trunc_length: 显示文本结果时的最大字符数,超过部分将被截断。
defMultiModalRetrieverDisplay(text_hits,Image_hits, text_trunc_length=150):
   """
    显示来自多模态检索器的文本和图像结果。  
    参数:
    ----------
    text_hits :包含 `id`、`payload` 和 `score` 的文本结果列表。
    Image_hits :包含 `id`、`payload` 和 `score` 的图像结果列表。
    text_trunc_length : int, 显示文本内容的最大长度(默认值为150)。
    显示:
    --------
    - 以粗体显示文本结果,包含 ID、截断内容和分数。
    - 在 matplotlib 图中显示图像结果,标题中包含分数。
    """

    print("\\033[1m文本结果:\\033[0m")
    for i, hit inenumerate(text_hits, 1):
        print("NODEID:",hit.id)
        content = hit.payload['content']
        truncated_content = content[:text_trunc_length] + "..."iflen(content) > text_trunc_length else content
        bold_truncated_content = f"\\033[1m{truncated_content}"
        print(f"{i}. {bold_truncated_content} | 分数: {hit.score}")
   
    print("\\n图像结果:")
    fig, axes = plt.subplots(1, len(Image_hits), figsize=(15, 5))  # 根据需要调整 figsize
    for ax, hit inzip(axes, Image_hits):
        image_path = hit.payload['image_path']
        print(f"显示图像: {image_path} | 分数: {hit.score}")
        img = mpimg.imread(image_path)
        ax.imshow(img)
        ax.axis('off')
        ax.set_title(f"分数: {hit.score}", fontsize=10)
    plt.suptitle("图像结果", fontsize=16)
    plt.tight_layout()
    plt.show()

测试多模态检索器和查看器功能

text_hits, Image_hits=MultiModalRetriever("how much of acre burned in 2022?")
MultiModalRetrieverDisplay(text_hits,Image_hits, text_trunc_length=150)

null

null

RAG Pipeline with Multimodal LLM Integration

要构建一个 MultiModal RAG 系统管道,您可以集成任何多模态 LLM 来处理文本和图像。以下是工作原理:

  1. \1. 准备数据:将文本块(上下文列表)和图像分离成其文件路径的列表。
  2. \2. 处理图像:将图像文件路径转换为编码的图像数据。这些编码的图像将根据模型的要求以 URL 或编码对象的形式传递给模型。
  3. \3. 输入模型:将文本块和编码的图像组合成单一的输入格式。多模态 LLM 将使用文本块作为上下文,图像作为视觉数据来生成答案。

这种方法使模型能够无缝处理文本和视觉信息,提供全面而准确的响应。

构建 RAG 功能:

from openai import ChatCompletion
import openai
import base64
from base64 import b64decode
import os
defMultiModalRAG(
    context: list,
    images: list,
    user_query: str,
    client: client,
    model: str = "yourMLLM"):  # 您使用的多模态 LLM 的名称
    generation_prompt = f"""
    根据给定的上下文,回答用户查询:{user_query},
    上下文可以是表格、文本或图像。从上下文中提供答案。
    用户查询:{user_query}
  
    上下文:{context}\\n
    输出:
    """
    # 辅助函数将图像编码为 base64 字符串
    defencode_image(image_path):
        if image_path:
            withopen(image_path, "rb") as image_file:
                return base64.b64encode(image_file.read()).decode()
        returnNone
   
    image_paths = images
    messages = [
        {
            "role": "system",
            "content": "您是一个乐于助人的助手。"
        },
        {
            "role": "user",
            "content": generation_prompt,
        }
    ]

    # 编码图像并在存在时将其添加到消息中
    for image_path in image_paths:
        img_base64 = encode_image(image_path)
        if img_base64:
            # 将图像的 base64 字符串作为文本内容的一部分添加
            messages.append({
                "role": "user",
                "content": [
                  {
                      "type": "image_url",
                      "image_url": {
                          "url": f"data:image/jpeg;base64,{img_base64}"# 发送 base64 编码的图像
                      },
                  },
              ],
            })
   
    # 创建聊天完成
    chat_completion = client.chat.completions.create(
        messages=messages,
        model=model,
        temperature=0.5,
        top_p=0.99,
    )  

    return chat_completion.choices[0].message.content

我们的多模态 RAG 功能接受图像路径作为输入,打开并编码图像,然后将其传递给多模态 LLM 以回答用户查询。这些图像路径存储在有效负载中,如图像嵌入收集步骤中所讨论的。当检索器获取图像嵌入时,我们使用它们的有效负载来获取多模态 LLM 的图像路径。

def RAG(query):
  text_hits, Image_hits=MultiModalRetriever(query)
  retrieved_images=[i.payload['image_path'] for i in Image_hits]
  answer=MultiModalRAG(text_hits,retrieved_images,query,openaiclient)
  return(answer)

RAG("""2022 年全国因野火烧毁的土地面积中,有多少百分比是在联邦土地上,这与 10 年平均水平相比如何?""")

null

第4部分:结论:让多模态数据为您服务。

构建一个多模态RAG系统的关键在于将复杂、多样的数据转化为真正有用的东西。从使用像PyMuPDF这样的工具提取内容,到使用像Nomic Vision和Text这样的模型嵌入文本和图像,再到在Qdrant中组织所有内容,每一步都朝着一个无缝工作的系统迈进。最终添加一个多模态LLM将所有内容整合在一起,使系统能够提供不仅准确而且上下文丰富、全面的答案。

所述过程演示了如何:

  • • 提取多模态数据。
  • • 在Qdrant中嵌入和存储数据。
  • • 为基于多模态LLM的处理检索数据。

这个过程展示了AI如何弥合不同类型的数据、文本和视觉之间的差距,以解决现实世界中的问题。通过正确的方法,RAG系统不仅仅是一个工具;它成为获取有意义见解和做出更明智决策的方式。

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

手撕RAG核心链路:PyMuPDF解析PDF+ChromaDB构建向量库 RAG(检索增强生成)是当前AI应用落地的关键范式,其本质是将外部知识以向量形式编码并高效检索。理解其原理需回归基础:文档如何被结构化解析?文本与图像如何协同分块?向量数据库如何存储语义关系?PyMuPDF凭借对PDF底层规范的精准支持,实现坐标级文本提取与无损图像获取;ChromaDB则以轻量持久化设计,提供可调试、可审计的向量索引能力。二者结合,构成去框架化RAG实现的技术底座,广泛适用于科研文献智能问答、企业知识库构建、合规文档摘要等场景。本文聚焦真实生产环境中的图文双轨处理与语义检索闭环。 阅读详情

相关推荐

混元图像3.0:工业级中文多模态生图模型解析

文生图模型正从像素生成迈向语义理解与物理建模的新阶段。其核心原理在于将文本语义、视觉常识、材质物理属性和跨模态对齐统一建模,通过世界知识集成模块(WKIM)和可微分渲染头(PAH)实现逻辑自洽与真实感跃升。技术价值体现在对中文提示词的深度理解、端到端文字生成精度及原生多模态表征能力,显著优于传统扩散模型。典型应用场景覆盖电商主图生成、教育插画批量产出、游戏分镜设计及四格漫画叙事表达。本文聚焦混元图像3.0这一具备80B参数规模与工业级部署能力的开源模型,深入剖析其在中文语义理解与多模态协同生成上的突破性实践

weixin_33938733的博客 333

多模态RAG深度解析:揭秘AI新技术

多模态检索增强生成(Multimodal Retrieval Augmented Generation,简称RAG)是一种新兴的设计范式,允许AI模型与文本、图像、视频等多种信息存储接口进行交互。 在探讨这个主题时,我们首先会介绍什么是检索增强生成(RAG),多模态的概念,以及如何将两者结合以构建现代多模态RAG系统。在理解了多模态RAG的基本概念后,我们将使用Google Gemini和一种类似CLIP的编码模型来构建一个多模态RAG系统。

bugyinyin的博客 3147

工业AI大模型实战:从零构建私有化部署与RAG应用

人工智能大模型正从通用领域向工业场景深化,其核心价值在于处理海量多模态数据、实现复杂模式识别与智能决策。技术原理上,大模型基于Transformer架构,通过预训练与微调适应特定任务。在工业领域,其技术价值体现在推动AI从“感知诊断”向“认知决策”跃迁,例如实现复杂根因分析、生产流程优化与知识沉淀。应用场景广泛覆盖智能质检、供应链调度与预测性维护等关键环节。本文聚焦工业AI大模型落地,深入探讨如何通过检索增强生成(RAG)框架与私有化部署解决数据安全与模型“幻觉”问题,并提供从提示工程、微调到基于LangC

weixin_33853827的博客 427

从RAG到多模态RAG,收藏这一篇就够了!!!

什么是RAG:Retrieval Augmented Generation,检索增强生成。是一种结合了信息检索技术和大型语言模型提示功能的框架。它通过从数据源检索信息来辅助LLM生成答案,提高了模型在知识密集型任务中的准确性和可信度。

bugyinyin的博客 2066

RAG技术解析:从原理到实践的全栈指南

检索增强生成(RAG)是当前AI领域结合信息检索与大语言模型的前沿技术,通过先检索后生成的范式有效解决传统大模型的幻觉问题和数据滞后性。其核心技术包含语义检索、向量数据库和文本生成三大组件,其中Sentence-BERT和Chroma等工具为开发者提供了高效实现方案。在工程实践中,合理的文档分块策略、元数据标注和向量化处理对系统性能至关重要。该技术已广泛应用于金融、医疗等领域知识库构建,配合查询扩展和重排序等技巧可显著提升准确率。对于希望快速上手的开发者,从GTX 1660到RTX 4090的不同硬件配置均

weixin_34082854的博客 627

探索检索增强生成(RAG)技术的无限可能:Vector+KG RAG、Self-RAG、多向量检索器多模态RAG集成

探索检索增强生成(RAG)技术的无限可能:Vector+KG RAG、Self-RAG、多向量检索器多模态RAG集成

丨汀、的博客 5391

RAG-Anything深度评测:一站式多模态RAG框架的实战与思考

检索增强生成(RAG)技术通过结合信息检索与大型语言模型,有效解决了大模型知识滞后与幻觉问题,已成为构建企业知识库与智能问答系统的核心技术范式。其核心原理是将外部知识库向量化,在用户提问时进行语义检索,并将相关上下文注入LLM生成精准答案,从而显著提升回答的事实性与时效性。这一技术对于处理非结构化文档、构建专业领域助手具有重要价值。当前,多模态数据处理成为RAG演进的关键方向,旨在统一处理文本、图像、音频等异构数据源。开源框架RAG-Anything正是这一趋势下的实践产物,它通过构建统一的数据抽象层,集成

weixin_34224941的博客 426

多模态RAG--能够应用于图片表格的RAG系统

多模态RAG(检索增强生成)技术突破传统文本限制,实现文本、图像、音频等多模态数据的检索与融合生成。其核心在于跨模态对齐与融合,通过多模态嵌入技术将异源数据映射到统一向量空间。关键技术包括:多模态编码器(CLIP等模型实现跨模态编码)、多模态检索器(支持跨模态匹配)和多模态生成器(输出复合内容)。针对PDF等复杂文档,需先进行多模态解析(文本/图像/表格提取),再通过统一嵌入或模态转换实现向量化。优化技巧包括文本补全、结构化QA生成、上下文增强和领域微调等。新兴的ColPali范式提出页级别联合编码,简化了

qq_52053775的博客 283

建议你上手试试,搭一下这个多模态RAG系统(附源码+教学)

摘要:本文介绍了一种基于多模态RAG技术的专业文档解析方案,针对PDF、CAD图纸等复杂文档的三大识别难点(图表识别、复杂检索、混合语义)提出解决方案。系统采用模态归一化技术,将所有非文本信息转化为文本表示,通过预训练模型实现智能问答。文章详细解析了从VLM模型接入到智能问答的五步实现流程,并开源了完整代码及教学资源。该方案具有架构简单、成本低廉的特点,适合企业级应用场景。

fufan_LLM的博客 1043

RAG模型的高级优化技术

1. 背景介绍 1.1 图像分割的重要性 图像分割是计算机视觉领域的一个重要研究方向,它的目的是将图像划分为具有相似特征的区域,从而为后续的图像分析和理解提供基础。图像分割在许多实际应用中都有着广泛的应用,如目标检测、图像编辑、医学图像分析等。 1.2

AI天才研究院 350

STM32开发者必看:如何在正点原子探索者开发板上快速移植CANopenNode协议栈

本文为STM32开发者提供了在正点原子探索者开发板上快速移植CANopenNode协议栈的实战指南。文章详细介绍了从环境准备、硬件抽象层适配到协议栈初始化与测试的全过程,并分享了PDO配置与性能优化等关键技巧,帮助开发者高效实现CANopen标准化通信。

weixin_29173777的博客 462

LangChain RAG实战指南:5步构建智能问答系统的终极教程

检索增强生成(RAG)是当前最热门的AI应用技术之一,它能够将外部知识库与大型语言模型完美结合,构建出真正智能的问答系统。LangChain作为最流行的AI应用开发框架,提供了完整的RAG实现方案。本文将带你从零开始,通过5个关键步骤掌握LangChain RAG的核心技术。 ## 🔍 什么是RAG技术? **RAG(Retrieval-Augmented Generation)检索增强生成

gitblog_00983的博客 446

VoLTE吞字断续优化方案

网络侧通过各节点探针的数据采集,能够进行RTP和RTCP包的分析,确定各节点的上行或下行丢包情况。1.基于测试语音分析,每2秒中大约8个字,每个字约10个RTP语音包。通话过程中,语音有短暂停顿,收音段听语音中会出现“吞字/断续现象”2.连续丢3~5个RTP以上就可能会出现吞字断续的感觉。下行评价的丢包问题,很难有效指导定界定位分析,无从下手。2.部分终端可能存在RTCP不反馈,导致无法获取丢包。1.语音包为UDP包,无反馈,终端无法判定是否丢包。终端可依据自身的调度反馈或弃包进行上行丢包判决。

m0_73503557的博客 1510

RAG应用中的复杂文档解析:三种实用解决方案详解

本文探讨了RAG应用中复杂文档解析的挑战与解决方案。针对PDF/Word等富文本文档中混合的文字、表格、图片等内容,提出了三种处理方案:OCR技术成本低但结构保留有限;多模态模型能同时识别多种内容;自定义处理结合现有技术实现高质量解析但开发成本高。文章强调文档解析需根据业务需求定制化处理,通用方案效果有限。最后还提供了AI大模型学习资源包,包含视频教程、学习路线等技术资料。

m0_65555479的博客 390

ui(new Ui::MainWindow)的解析

Ui命名空间的变量名,和默认空间的变量名虽然一样,但实际是两个不同的东西。所以构造函数中调用MainWindow是没问题的,因为它不是在调用自身,而是在调用其他命名空间下的另一个同名的MainWindow类。这里使用C++的成员初始化列表语法,初始化成员变量指针ui,可这里有个问题,在MainWindow的构造函数中new 一个MainWindow,这又调用一下MainWindow的构造函数,这岂不是会死循环?ui_mainwindow.h文件。mainwindow.h文件.

sinat_31608641的博客 1193

基于deepseek本地模型的本地知识库构建

通过以上步骤,你已经成功构建了一个基于 AnythingLLM 和 LM Studio 的本地知识库。这个系统不仅能够高效地存储和检索知识,还能结合强大的语言模型生成准确的回答。你可以根据自己的需求进一步扩展和优化这个系统,比如增加更多的文档格式支持、优化检索算法等。

qq_30178745的博客 1381

TinyRAG:别再被 LLM 忽悠了!手搓 RAG,掌控 AI 的“知识命脉”

你是否也曾被 LLM(大型语言模型)的“智能”所震撼?它们能写诗、作画、编代码,甚至和你聊天……但,你是否也曾发现,这些看似无所不能的 AI,有时也会“一本正经地胡说八道”?这并非危言耸听。:世界瞬息万变,LLM 的“记忆”却可能停留在过去。:训练数据可能只覆盖了某些领域,导致 LLM 在其他领域“无知”。:训练数据本身就可能包含错误信息,导致 LLM “以讹传讹”。:LLM 强大的生成能力,有时也会“创造”出不存在的事实,即“幻觉”。

JasonRobert 957

H3C ACL的应用与配置1

SWHC1-acl-ipv4-adv-3000]rule 30 permit ip source 192.168.50.252 0 destination 192.168.70.252 0 //设置一条ID为30的过滤,允许源地址为 192.168.50.252 访问目的地址为192.168.70.252 的设备。高级ACL范围3000-3999:对源IP,目地IP,协议,端口号进行过滤。[SWHC1]acl number 3000 //创建高级ACL 3000。

weixin_41120428的博客 2425

GPT-4多模态能力真相:不是看图说话,而是语义锚定

多模态AI是指模型能协同处理文本、图像等多种信息形式的技术范式,其核心原理在于跨模态对齐——将不同模态数据映射到统一语义空间进行联合推理。相比传统OCR或纯视觉识别,GPT-4的突破不在于像素级理解,而在于将图像视为‘另一种语言’,通过视觉编码器与文本编码器共享注意力机制,实现零样本泛化与强鲁棒性。这一技术价值显著提升了信息提取、意图理解与逻辑组织能力,广泛应用于教育批改、金融单据审核、工业质检等需图文协同分析的场景。本文聚焦GPT-4的视觉理解本质,深入解析其‘只读不写’的设计逻辑、真实能力边界及可落地的

weixin_30432579的博客 496

SerDes学习笔记:均衡技术详解 01

本文系统阐述了高速SerDes链路中均衡技术的应用原理与实现方法。重点介绍了发射端预加重/FIR均衡和接收端CTLE/DFE/FFE等主流均衡方案,详细探讨了各类均衡器的频域特性、时域效果及硬件实现架构。

一只豌豆象的博客 1295

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 614

LLM、RAG与Agent技术栈:从原理到企业级应用实践

大型语言模型(LLM)作为自然语言处理的基础技术,通过预训练获得强大的语言理解能力,但其知识局限性和幻觉问题制约了实际应用。检索增强生成(RAG)技术通过向量检索机制,将外部知识库与LLM结合,有效解决了信息时效性和准确性问题。在企业级应用中,RAG与智能体(Agent)技术协同工作,构建出能够自主规划、执行复杂任务的AI系统。这种技术架构特别适用于企业内部知识库问答、客户服务自动化等场景,其中向量数据库选择和嵌入模型优化成为关键环节。通过合理的文档预处理和工具链设计,开发者可以构建出可靠的大模型应用系统,

506

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

自适应多模态智能体框架:构建能规划与协作的AI工作流引擎

在人工智能与自动化领域,多模态理解和复杂任务规划是核心技术挑战。其原理在于通过模块化设计,将专业化的AI模型封装为独立的智能体,并利用工作流引擎进行任务分解与调度,从而实现跨模态数据的协同处理。这一架构的技术价值在于兼顾了处理专业性、系统可维护性与复杂逻辑执行能力,能够显著提升自动化流程的灵活性和效率。其典型应用场景包括金融分析、文档审查、客户服务以及研发知识管理等需要整合文本、图像、表格等多种数据源的业务流程。本文探讨的自适应多模态智能体框架,正是基于**智能体协同**与**工作流引擎**这两个核心热词,

weixin_30940783的博客 445

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

KG-enhanced LLM入门指南:从零开始掌握知识图谱与大模型的融合艺术(Part 1/3)

知识图谱增强大语言模型的技术路径与应用前景 本文系统探讨了知识图谱(KG)与大语言模型(LLM)融合的三大技术路径:预训练增强、推理增强和可解释性增强。通过分析LLM的局限性(如信息错误、时效性差等),提出KG可有效提升模型的事实准确性和推理能力。关键技术包括预训练阶段的知识注入、推理阶段的实时知识融合,以及利用KG解释模型决策过程。尽管面临集成复杂性和可扩展性等挑战,该技术在企业级应用中展现出显著价值,能够提升AI系统的事实准确性、领域适应性和决策透明度,为智能系统发展提供了新方向。 (149字)

Trb701012的博客 625

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 零基础在Zotero7中部署DeepSeek V3,高效阅读文献
下一篇: 通过Ollama在本地安装和使用DeepSeek-R1
我爱学大模型
博客等级 码龄3年 7883粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值