Gemini + LlamaIndex:手把手教你构建图像理解驱动的智能推荐系统

7

探索Gemini视觉模型与LlamaIndex的融合:构建智能推荐系统的实践指南

在人工智能领域,图像理解和内容生成正变得日益重要。本文将深入探讨如何利用Google的Gemini视觉模型进行图像分析,并结合LlamaIndex框架,构建一个简单而强大的推荐生成系统。我们将详细介绍环境配置、图像加载、图像理解、推荐生成以及系统构建的各个环节,并提供实际案例和代码示例,帮助读者更好地理解和应用这些技术。

环境配置:搭建开发基石

要开始我们的项目,首先需要配置开发环境。以下是一些必要的Python包及其安装方法:

%pip install llama-index-multi-modal-llms-gemini
%pip install llama-index-vector-stores-qdrant
%pip install llama-index-embeddings-gemini
%pip install llama-index-llms-gemini
!pip install llama-index 'google-generativeai>=0.3.0' matplotlib qdrant_client

这些库将为我们提供 Gemini 模型的接口、向量存储、嵌入模型以及构建索引和查询引擎所需的工具。

使用Gemini加载图像:视觉信息的起点

接下来,我们需要从URL加载图像。以下代码展示了如何使用Gemini加载图像,并将其转换为LlamaIndex可以处理的格式:

import os

GOOGLE_API_KEY = "YOUR_GOOGLE_API_KEY"  # 在此处添加您的Google API密钥
os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY

from llama_index.multi_modal_llms.gemini import GeminiMultiModal
from llama_index.core.multi_modal_llms.generic_utils import load_image_urls

image_urls = [
    "https://storage.googleapis.com/generativeai-downloads/data/scene.jpg",
    # 在此处添加您的图像URL
]

image_documents = load_image_urls(image_urls)

gemini_pro = GeminiMultiModal(model_name="models/gemini-pro-vision")

from PIL import Image
import requests
from io import BytesIO
import matplotlib.pyplot as plt

img_response = requests.get(image_urls[0])
print(image_urls[0])
img = Image.open(BytesIO(img_response.content))
plt.imshow(img)

这段代码首先设置了Google API密钥,然后使用load_image_urls函数从指定的URL加载图像。加载的图像被转换为image_documents对象,该对象可以被Gemini模型进一步处理。最后,我们使用matplotlib库显示加载的图像,以便进行可视化验证。

Gemini视觉理解:解析图像的内在含义

图像加载完成后,我们可以使用Gemini模型进行图像理解。以下代码展示了如何使用Gemini模型识别图像中的城市:

complete_response = gemini_pro.complete(
    prompt="Identify the city where this photo was taken.",
    image_documents=image_documents,
)

print(complete_response)

在这段代码中,我们向Gemini模型发送了一个提示(prompt),要求它识别图像中的城市。Gemini模型分析图像,并返回识别结果。这种图像理解能力是构建推荐系统的基础。

基于图像生成建议:个性化推荐的起点

接下来,我们将展示如何基于图像内容生成建议。我们将使用Pydantic库定义一个数据模型,用于描述餐厅信息,并使用Gemini模型生成符合该模型的推荐结果。

from pydantic import BaseModel

class GoogleRestaurant(BaseModel):
    restaurant: str
    food: str
    location: str
    category: str
    hours: str
    price: str
    rating: float
    review: str
    description: str
    nearby_tourist_places: str

from llama_index.multi_modal_llms.gemini import GeminiMultiModal
from llama_index.core.program import MultiModalLLMCompletionProgram
from llama_index.core.output_parsers import PydanticOutputParser

prompt_template_str = """\
    can you summarize what is in the image\
    and return the answer with json format \
"""

def pydantic_gemini(model_name, output_class, image_documents, prompt_template_str):
    gemini_llm = GeminiMultiModal(
        api_key=GOOGLE_API_KEY, model_name=model_name
    )

    llm_program = MultiModalLLMCompletionProgram.from_defaults(
        output_parser=PydanticOutputParser(output_class),
        image_documents=image_documents,
        prompt_template_str=prompt_template_str,
        multi_modal_llm=gemini_llm,
        verbose=True,
    )

    response = llm_program()
    return response

这段代码定义了一个GoogleRestaurant类,用于描述餐厅的各种属性。然后,我们定义了一个pydantic_gemini函数,该函数使用Gemini模型和Pydantic输出解析器,根据图像内容生成符合GoogleRestaurant模型的推荐结果。

构建推荐生成系统:整合与优化

现在,我们将构建一个完整的推荐生成系统。该系统将使用Gemini模型进行嵌入,使用Qdrant向量存储存储嵌入向量,并使用LlamaIndex构建索引和查询引擎。

from llama_index.core.schema import TextNode
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.embeddings.gemini import GeminiEmbedding
from llama_index.llms.gemini import Gemini
from llama_index.vector_stores.qdrant import QdrantVectorStore
import qdrant_client

client = qdrant_client.QdrantClient(path="qdrant_gemini_3")

vector_store = QdrantVectorStore(client=client, collection_name="collection")

Settings.embed_model = GeminiEmbedding(model_name="models/embedding-001", api_key=GOOGLE_API_KEY)
Settings.llm = Gemini(api_key=GOOGLE_API_KEY)

storage_context = StorageContext.from_defaults(vector_store=vector_store)

index = VectorStoreIndex(nodes=nodes, storage_context=storage_context)

query_engine = index.as_query_engine(similarity_top_k=1)

response = query_engine.query("recommend a Orlando restaurant for me and its nearby tourist places")
print(response)

这段代码首先创建了一个本地Qdrant向量存储,然后使用Gemini模型进行嵌入。嵌入向量被存储在Qdrant向量存储中。接下来,我们使用LlamaIndex构建索引和查询引擎。最后,我们向查询引擎发送一个查询,要求它推荐一家奥兰多餐厅及其附近的旅游景点。

通过以上步骤,我们成功构建了一个基于Gemini视觉模型和LlamaIndex的推荐生成系统。该系统可以根据图像内容生成个性化的推荐结果,为用户提供更好的体验。

总结与展望

本文详细介绍了如何使用Google的Gemini视觉模型和LlamaIndex框架构建一个推荐生成系统。我们深入探讨了环境配置、图像加载、图像理解、推荐生成以及系统构建的各个环节,并提供了实际案例和代码示例。希望本文能够帮助读者更好地理解和应用这些技术,并在实际项目中取得成功。

未来,我们可以进一步优化该系统,例如,可以引入更多的图像理解模型,提高图像理解的准确性;可以引入更多的推荐算法,提高推荐结果的多样性和个性化程度;可以引入用户反馈机制,不断改进系统的性能。

常见问题解答

  1. API密钥错误:确保在环境变量中正确设置了Google API密钥。检查密钥是否过期或被禁用。
  2. 模块导入错误:确保所有需要的库都已正确安装。使用pip list命令检查库是否已安装,并使用pip install命令重新安装缺失的库。
  3. 图像加载失败:检查图像URL是否正确,以及网络连接是否正常。尝试使用其他图像URL进行测试。
  4. Gemini模型返回错误:检查请求参数是否正确,以及API调用是否超过了速率限制。查看Gemini API文档,了解更多关于错误代码的信息。
  5. Qdrant向量存储连接失败:检查Qdrant服务器是否正在运行,以及连接参数是否正确。查看Qdrant文档,了解更多关于连接参数的信息。

通过不断学习和实践,我们可以更好地掌握这些技术,并在实际项目中创造出更大的价值。