使用Chroma和SelfQueryRetriever构建智能向量数据库应用

技术背景介绍

在构建AI应用时,向量数据库(Vector Database)是一个相当关键的组件。它能够存储文本、图像等数据的向量表示,从而支持高效的相似度搜索。Chroma是一个用于构建AI应用的向量数据库,可以方便地存储和检索嵌入向量。

在本文中,我们将展示如何使用SelfQueryRetriever结合Chroma向量数据库,实现一个智能的文档检索系统。

核心原理解析

Chroma向量数据库

Chroma允许将文档以向量的形式存储,并基于向量的相似度进行高效检索。这对于需要快速查找相似内容的AI应用非常有用。

SelfQueryRetriever

SelfQueryRetriever是LangChain库中的一个可用对象,它能够基于预定义的文档元数据和内容描述进行智能查询,自动构建查询表达式并过滤检索结果。

代码实现演示

1. 安装必要依赖

%pip install --upgrade --quiet lark langchain-chroma

2. 获取OpenAI API Key

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

3. 创建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},
    )
    # 更多文档...
]

# 创建向量存储
vectorstore = Chroma.from_documents(docs, embeddings)

4. 创建自查询检索器

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
)

5. 测试检索功能

# 基于查询进行检索
result = retriever.invoke("What are some movies about dinosaurs")
print(result)

# 基于过滤进行检索
result = retriever.invoke("I want to watch a movie rated higher than 8.5")
print(result)

# 基于查询和过滤进行检索
result = retriever.invoke("Has Greta Gerwig directed any movies about women")
print(result)

应用场景分析

  • 电影推荐系统:通过嵌入向量表示电影剧情和相关信息,快速推荐用户感兴趣的电影。
  • 文档管理系统:在大量文档中,通过内容检索和元数据过滤,快速找到相关文档。
  • 智能问答系统:基于用户问题及文档元数据,提供精准答案。

实践建议

  1. 选择合适的嵌入模型:根据具体应用场景,选择适合的嵌入模型(如OpenAI嵌入)。
  2. 合理设计元数据结构:确保文档元数据尽可能详细和规范,方便智能检索。
  3. 优化查询机制:结合实际需求调整查询和过滤策略,提高检索效率和准确性。

如果遇到问题欢迎在评论区交流。

### LangChain 数据处理工具的功能与使用 LangChain 是一种用于构建复杂 AI 应用程序的框架,其核心功能之一是数据处理能力。以下是关于 LangChain 数据处理工具的主要功能及其使用的详细介绍。 #### 1. **文档索引** LangChain 提供了一种灵活的方式来创建管理文档索引。通过 `SQLRecordManager` 其他存储后端(如 Elasticsearch),可以高效地管理查询大量文档数据[^3]。 ```python from langchain.indexes import SQLRecordManager, index from langchain_core.documents import Document # 创建记录管理器 record_manager = SQLRecordManager("sqlite:///example.db") # 添加文档到索引 docs = [ Document(page_content="这部电影是一部经典科幻作品", metadata={"genre": "科幻"}), Document(page_content="这是一场激烈的战斗场景", metadata={"genre": "动作"}) ] index.add_documents(docs) ``` #### 2. **自定义检索器 (SelfQueryRetriever)** LangChain 的 `SelfQueryRetriever` 组件允许基于自然语言查询动态生成过滤条件并检索相关文档。此功能依赖于预定义的元数据字段信息文档内容描述[^2]。 ```python from langchain.chains.query_constructor.base import AttributeInfo from langchain.retrievers.self_query.base import SelfQueryRetriever from langchain_openai import ChatOpenAI metadata_field_info = [ AttributeInfo(name="genre", description="电影的类型", type="string"), AttributeInfo(name="year", description="电影上映年份", type="integer") ] document_content_description = "电影简介" llm = ChatOpenAI(temperature=0) retriever = SelfQueryRetriever.from_llm( llm, vectorstore, document_content_description, metadata_field_info ) ``` #### 3. **向量数据库集成** LangChain 支持多种向量数据库(如 Pinecone、Weaviate 等)。这些数据库能够加速相似度计算过程,并提高大规模文本嵌入模型的应用效率[^1]。下面是一个简单的例子: ```python from langchain.vectorstores import Chroma from langchain.embeddings.openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings() vectorstore = Chroma(embedding_function=embeddings) ``` #### 4. **链式操作 (Chains)** LangChain 中的 Chains 可以将多个组件串联起来形成复杂的流水线。例如,在数据处理过程中,可以通过 Chain 将文本提取、清洗、嵌入等多个步骤组合在一起[^3]。 --- ### 总结 LangChain 的数据处理模块提供了强大的灵活性可扩展性,适用于各种应用场景。无论是简单的小型项目还是大型企业级应用,都可以利用 LangChain 来简化开发流程并提升性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值