在构建AI应用时,如何有效地管理和查询向量化的文本数据,是一个非常重要的挑战。Chroma 是一个专门用于此类应用的向量数据库,它支持通过嵌入技术构建高效的AI应用。在这篇文章中,我们将演示如何创建一个基于Chroma的向量存储,并且使用SelfQueryRetriever进行智能查询。
1. 技术背景介绍
随着AI技术的发展,处理自然语言的能力越来越强大。为了更好地利用这些能力,我们需要一个高效的向量存储解决方案,来保存和检索基于嵌入的文本表示。Chroma 提供了一种轻便、易于使用的向量数据库解决方案,特别适合于与OpenAI这样的嵌入生成器结合使用。
2. 核心原理解析
Chroma是一个向量数据库,专用于处理和存储由嵌入生成器产生的向量数据。结合OpenAI生成的自然语言嵌入,我们可以实现高精度的文本检索。SelfQueryRetriever是一个强大的工具,利用语言模型的能力,根据文档的元数据和内容进行智能查询。
3. 代码实现演示
我们将逐步展示如何创建并查询Chroma向量存储。
安装必要的库
首先,我们需要安装lark
和langchain-chroma
库:
%pip install --upgrade --quiet lark
%pip install --upgrade --quiet langchain-chroma
获取OpenAI API Key
import getpass
import os
# 设置OpenAI API Key
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
创建Chroma向量存储
from langchain_chroma import Chroma
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
# 使用OpenAI生成嵌入
embeddings = OpenAIEmbeddings()
# 示例文档数据
docs = [
Document(page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose", metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"}),
Document(page_content="Leo DiCaprio gets lost in a dream within a dream within a dream within a ...", metadata={"year": 2010, "director": "Christopher Nolan", "rating": 8.2}),
Document(page_content="A psychologist / detective gets lost in a series of dreams within dreams within dreams and Inception reused the idea", metadata={"year": 2006, "director": "Satoshi Kon", "rating": 8.6}),
Document(page_content="A bunch of normal-sized women are supremely wholesome and some men pine after them", metadata={"year": 2019, "director": "Greta Gerwig", "rating": 8.3}),
Document(page_content="Toys come alive and have a blast doing so", metadata={"year": 1995, "genre": "animated"}),
Document(page_content="Three men walk into the Zone, three men walk out of the Zone", metadata={"year": 1979, "director": "Andrei Tarkovsky", "genre": "science fiction", "rating": 9.9}),
]
# 创建Chroma向量存储
vectorstore = Chroma.from_documents(docs, embeddings)
创建自我查询检索器
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import OpenAI
metadata_field_info = [
AttributeInfo(name="genre", description="The genre of the movie", type="string or list[string]"),
AttributeInfo(name="year", description="The year the movie was released", type="integer"),
AttributeInfo(name="director", description="The name of the movie director", type="string"),
AttributeInfo(name="rating", description="A 1-10 rating for the movie", type="float"),
]
document_content_description = "Brief summary of a movie"
llm = OpenAI(temperature=0)
# 创建检索器
retriever = SelfQueryRetriever.from_llm(llm, vectorstore, document_content_description, metadata_field_info, verbose=True)
测试检索器
# 按内容查询
retriever.invoke("What are some movies about dinosaurs")
# 按评分过滤
retriever.invoke("I want to watch a movie rated higher than 8.5")
# 复杂过滤器应用
retriever.invoke("What's a highly rated (above 8.5) science fiction film?")
4. 应用场景分析
这种基于向量的存储与检索技术,在海量文本数据的分析与处理场景中十分有效。无论是自然语言处理、推荐系统还是知识检索,Chroma与OpenAI的结合都能提供高效的解决方案。
5. 实践建议
在实际应用中,建议:
- 利用有效的元数据:为每个文档提供详细的元数据信息,以便更准确地检索。
- 定期更新文档集:确保向量存储中的数据是最新的,以保证查询结果的准确性。
- 仔细管理API调用:由于使用OpenAI生成嵌入会消耗API配额,需注意调用频率。
如果遇到问题欢迎在评论区交流。
—END—