使用Chroma和LlamaIndex构建多模态检索系统

在本篇文章中,我们将介绍如何使用Chroma和LlamaIndex构建一个多模态检索系统。Chroma是一个专为开发者生产力和幸福感设计的AI原生开源向量数据库,本教程将展示如何在其中创建多模态索引并进行检索。

安装所需库

首先,安装所需的软件包:

pip install chromadb
pip install llama-index
pip install llama-index-vector-stores-qdrant
pip install llama-index-embeddings-huggingface
pip install llama-index-vector-stores-chroma
pip install sentence-transformers
pip install pydantic==1.10.11
pip install open-clip-torch

创建Chroma索引

首先,我们来创建一个Chroma索引:

# 导入必要的库
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from IPython.display import Markdown, display
import chromadb

# 设置OpenAI API Key
import os
import openai

OPENAI_API_KEY = "你的OpenAI API密钥"
openai.api_key = OPENAI_API_KEY
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

下载维基百科图片和文本

我们将从维基百科中下载一些文本和图片数据:

import requests
from pathlib import Path
import urllib.request

def get_wikipedia_images(title):
    response = requests.get(
        "https://en.wikipedia.org/w/api.php",
        params={
            "action": "query",
            "format": "json",
            "titles": title,
            "prop": "imageinfo",
            "iiprop": "url|dimensions|mime",
            "generator": "images",
            "gimlimit": "50",
        },
    ).json()
    image_urls = []
    for page in response["query"]["pages"].values():
        if page["imageinfo"][0]["url"].endswith(".jpg") or page["imageinfo"][0]["url"].endswith(".png"):
            image_urls.append(page["imageinfo"][0]["url"])
    return image_urls

image_uuid = 0
MAX_IMAGES_PER_WIKI = 20

wiki_titles = {
    "Tesla Model X",
    "Pablo Picasso",
    "Rivian",
    "The Lord of the Rings",
    "The Matrix",
    "The Simpsons",
}

data_path = Path("mixed_wiki")
if not data_path.exists():
    Path.mkdir(data_path)

for title in wiki_titles:
    response = requests.get(
        "https://en.wikipedia.org/w/api.php",
        params={
            "action": "query",
            "format": "json",
            "titles": title,
            "prop": "extracts",
            "explaintext": True,
        },
    ).json()
    page = next(iter(response["query"]["pages"].values()))
    wiki_text = page["extract"]

    with open(data_path / f"{title}.txt", "w") as fp:
        fp.write(wiki_text)

    images_per_wiki = 0
    try:
        list_img_urls = get_wikipedia_images(title)
        for url in list_img_urls:
            if url.endswith(".jpg") or url.endswith(".png"):
                image_uuid += 1
                urllib.request.urlretrieve(url, data_path / f"{image_uuid}.jpg")
                images_per_wiki += 1
                if images_per_wiki > MAX_IMAGES_PER_WIKI:
                    break
    except:
        print(str(Exception("No images found for Wikipedia page: ")) + title)
        continue

设置嵌入模型

我们需要设置默认的文本和图像嵌入函数:

from chromadb.utils.embedding_functions import OpenCLIPEmbeddingFunction

embedding_function = OpenCLIPEmbeddingFunction()

构建Chroma多模态索引

通过LlamaIndex构建Chroma多模态索引:

from llama_index.core.indices import MultiModalVectorStoreIndex
from llama_index.vector_stores.qdrant import QdrantVectorStore
from chromadb.utils.data_loaders import ImageLoader

image_loader = ImageLoader()

# 创建客户端和新的集合
chroma_client = chromadb.EphemeralClient()
chroma_collection = chroma_client.create_collection(
    "multimodal_collection",
    embedding_function=embedding_function,
    data_loader=image_loader,
)

# 加载文档
documents = SimpleDirectoryReader("./mixed_wiki/").load_data()

# 设置ChromaVectorStore并加载数据
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
    documents,
    storage_context=storage_context,
)

从多模态索引中检索结果

最后,我们将从多模态索引中检索结果:

retriever = index.as_retriever(similarity_top_k=50)
retrieval_results = retriever.retrieve("Picasso famous paintings")

from llama_index.core.schema import ImageNode
from llama_index.core.response.notebook_utils import (
    display_source_node,
    display_image_uris,
)

image_results = []
MAX_RES = 5
cnt = 0
for r in retrieval_results:
    if isinstance(r.node, ImageNode):
        image_results.append(r.node.metadata["file_path"])
    else:
        if cnt < MAX_RES:
            display_source_node(r)
        cnt += 1

display_image_uris(image_results, [3, 3], top_k=2)

可能遇到的错误

  1. 缺少依赖库:确保所有所需的Python库都已安装。
  2. API Key错误:确保你已正确设置了OpenAI API Key。
  3. 网络问题:可能会由于网络问题导致无法从维基百科下载数据。
  4. 文件路径问题:确保指定的文件路径存在或是可读可写的。

参考资料:

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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Chroma 3380是一款高性能的数字万用表,广泛应用于电子、电气、通信、机械、化学等领域。它具有高精度、高稳定性和丰富的测量功能,能够满足复杂的测试需求。 该仪器的使用说明书详细介绍了Chroma 3380的功能特点、性能参数、测量方法和注意事项等内容,方便用户了解和使用该仪器。 首先介绍Chroma 3380的功能特点。该仪器具有多种测量功能,包括电压、电流、电阻、电容、频率、温度等测量模式,同时还支持相位、功率因数、交流/直流测量等功能。另外Chroma 3380具有自动和手动测量模式,用户可以根据需要选择。 接着介绍该仪器的性能参数。Chroma 3380的精度高达0.0085%,具有1,200,000个计数的高分辨率,同时具有较高的带宽和采样率。另外,该仪器采用双数码显示,显示结果直观清晰,方便用户使用使用Chroma 3380需要注意以下事项:1.在测量前,要确认仪器是否校准,如果需要校准,可以参考使用说明书进行操作;2.在选择测量模式时需要注意所测量的信号类型和量程范围,选择合适的模式和量程;3.在测量过程中,应严格遵守仪器的使用要求,将探头正确连接到被测物体上,避免短路和过载现象。 总之,Chroma 3380是一款高性能、多功能的数字万用表,在电子、电气、通信、机械、化学等领域广泛应用。它的使用说明书详细介绍了该仪器的功能特点、性能参数、测量方法和注意事项等内容,方便用户更好地使用该仪器,实现精确、高效的测量结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值