Skip to main content
Open In Colab在 GitHub 上打开

Momento 矢量指数 (MVI)

MVI:适用于您的数据的最高效、最易用的无服务器向量索引。要开始使用 MVI,只需注册一个帐户即可。无需处理基础设施、管理服务器或担心扩展。MVI 是一项可自动扩展以满足您的需求的服务。

要注册和访问 MVI,请访问 Momento 控制台

设置

安装先决条件

您将需要:

  • momentopackage 用于与 MVI 交互,以及
  • 用于与 OpenAI API 交互的 openAI 包。
  • 用于对文本进行标记的 tikToken 包。
%pip install --upgrade --quiet  momento langchain-openai langchain-community tiktoken

输入 API 密钥

import getpass
import os

Momento:用于索引数据

访问 Momento 控制台以获取您的 API 密钥。

if "MOMENTO_API_KEY" not in os.environ:
os.environ["MOMENTO_API_KEY"] = getpass.getpass("Momento API Key:")

OpenAI:用于文本嵌入

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

加载数据

这里我们使用来自 Langchain 的示例数据集,即工会地址的状态。

首先我们加载相关模块:

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import MomentoVectorIndex
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

然后我们加载数据:

loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
len(documents)
1

请注意,数据是一个大文件,因此只有一个文档:

len(documents[0].page_content)
38539

因为这是一个大文本文件,所以我们将其拆分为多个块以进行问答。这样,用户问题将从最相关的块中得到回答。

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
len(docs)
42

为数据编制索引

为数据编制索引就像实例化MomentoVectorIndex对象。这里我们使用from_documentshelper 实例化和索引数据:

vector_db = MomentoVectorIndex.from_documents(
docs, OpenAIEmbeddings(), index_name="sotu"
)

这将使用您的 API 密钥连接到 Momento Vector Index 服务并为数据编制索引。如果索引以前不存在,则此过程将为您创建该索引。数据现在是可搜索的。

查询数据

直接针对索引提出问题

查询数据最直接的方法是针对索引进行搜索。我们可以使用VectorStore应用程序接口:

query = "What did the president say about Ketanji Brown Jackson"
docs = vector_db.similarity_search(query)
docs[0].page_content
'Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections. \n\nTonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service. \n\nOne of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. \n\nAnd I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.'

虽然这确实包含有关 Ketanji Brown Jackson 的相关信息,但我们没有一个简洁、易读的答案。我们将在下一节中解决这个问题。

使用 LLM 生成 Fluly 答案

通过在 MVI 中索引数据,我们可以与任何利用向量相似性搜索的链集成。这里我们使用RetrievalQA链来演示如何回答索引数据中的问题。

首先,我们加载相关模块:

from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
API 参考:RetrievalQA | 聊天OpenAI

然后我们实例化检索 QA 链:

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm, retriever=vector_db.as_retriever())
qa_chain({"query": "What did the president say about Ketanji Brown Jackson?"})
{'query': 'What did the president say about Ketanji Brown Jackson?',
'result': "The President said that he nominated Circuit Court of Appeals Judge Ketanji Brown Jackson to serve on the United States Supreme Court. He described her as one of the nation's top legal minds and mentioned that she has received broad support from various groups, including the Fraternal Order of Police and former judges appointed by Democrats and Republicans."}

后续步骤

就是这样!现在,您已经为数据编制了索引,并可以使用 Momento Vector Index 对其进行查询。您可以使用同一索引从任何支持向量相似性搜索的链中查询数据。

使用 Momento,您不仅可以索引矢量数据,还可以缓存 API 调用并存储聊天消息历史记录。查看其他 Momento langchain 集成以了解更多信息。

要了解有关 Momento 向量索引的更多信息,请访问 Momento 文档