Skip to main content
Amazon DocumentDB(兼容 MongoDB) 使得在云中设置、操作和扩展兼容 MongoDB 的数据库变得轻而易举。 使用 Amazon DocumentDB,您可以运行与 MongoDB 相同的应用程序代码,并使用相同的驱动程序和工具。 Amazon DocumentDB 的向量搜索结合了基于 JSON 的文档数据库的灵活性和丰富的查询能力,以及向量搜索的强大功能。
本笔记本向您展示如何使用 Amazon DocumentDB 向量搜索 将文档存储在集合中、创建索引,并使用近似最近邻算法(如“余弦”、“欧几里得”和“点积”)执行向量搜索查询。默认情况下,DocumentDB 会创建分层可导航小世界(HNSW)索引。要了解其他支持的向量索引类型,请参阅上面链接的文档。 要使用 DocumentDB,您必须首先部署一个集群。有关更多详细信息,请参阅 开发者指南 免费注册 以立即开始。
!pip install pymongo
import getpass

# DocumentDB 连接字符串
# 例如,"mongodb://{username}:{pass}@{cluster_endpoint}:{port}/?{params}"
CONNECTION_STRING = getpass.getpass("DocumentDB 集群 URI:")

INDEX_NAME = "izzy-test-index"
NAMESPACE = "izzy_test_db.izzy_test_collection"
DB_NAME, COLLECTION_NAME = NAMESPACE.split(".")
我们希望使用 OpenAIEmbeddings,因此需要设置 OpenAI 环境变量。
import getpass
import os

# 设置 OpenAI 环境变量
if "OPENAI_API_KEY" not in os.environ:
    os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
os.environ["OPENAI_EMBEDDINGS_DEPLOYMENT"] = (
    "smart-agent-embedding-ada"  # 嵌入模型的部署名称
)
os.environ["OPENAI_EMBEDDINGS_MODEL_NAME"] = "text-embedding-ada-002"  # 模型名称
现在,我们将把文档加载到集合中,创建索引,然后对索引执行查询。 如果您对某些参数有疑问,请参阅 文档
from langchain.vectorstores.documentdb import (
    DocumentDBSimilarityType,
    DocumentDBVectorSearch,
)
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

SOURCE_FILE_NAME = "../../how_to/state_of_the_union.txt"

loader = TextLoader(SOURCE_FILE_NAME)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# OpenAI 设置
model_deployment = os.getenv(
    "OPENAI_EMBEDDINGS_DEPLOYMENT", "smart-agent-embedding-ada"
)
model_name = os.getenv("OPENAI_EMBEDDINGS_MODEL_NAME", "text-embedding-ada-002")


openai_embeddings: @[`OpenAIEmbeddings`] = OpenAIEmbeddings(
    deployment=model_deployment, model=model_name
)
from pymongo import MongoClient

INDEX_NAME = "izzy-test-index-2"
NAMESPACE = "izzy_test_db.izzy_test_collection"
DB_NAME, COLLECTION_NAME = NAMESPACE.split(".")

client: MongoClient = MongoClient(CONNECTION_STRING)
collection = client[DB_NAME][COLLECTION_NAME]

model_deployment = os.getenv(
    "OPENAI_EMBEDDINGS_DEPLOYMENT", "smart-agent-embedding-ada"
)
model_name = os.getenv("OPENAI_EMBEDDINGS_MODEL_NAME", "text-embedding-ada-002")

vectorstore = DocumentDBVectorSearch.from_documents(
    documents=docs,
    embedding=openai_embeddings,
    collection=collection,
    index_name=INDEX_NAME,
)

# 上述模型使用的维度数
dimensions = 1536

# 指定相似度算法,有效选项为:
#   cosine (COS), euclidean (EUC), dotProduct (DOT)
similarity_algorithm = DocumentDBSimilarityType.COS

vectorstore.create_index(dimensions, similarity_algorithm)
{ 'createdCollectionAutomatically' : false,
   'numIndexesBefore' : 1,
   'numIndexesAfter' : 2,
   'ok' : 1,
   'operationTime' : Timestamp(1703656982, 1)}
# 在查询的嵌入和文档的嵌入之间执行相似性搜索
query = "总统对凯坦吉·布朗·杰克逊说了什么"
docs = vectorstore.similarity_search(query)
print(docs[0].page_content)
今晚。我呼吁参议院:通过《自由投票法案》。通过《约翰·刘易斯投票权法案》。并且,在你们这样做的时候,通过《披露法案》,以便美国人能够知道谁在资助我们的选举。

今晚,我想向一位毕生致力于服务这个国家的人致敬:斯蒂芬·布雷耶大法官——一位陆军退伍军人、宪法学者,以及即将退休的美国最高法院大法官。布雷耶大法官,感谢您的服务。

总统最严肃的宪法职责之一是提名某人在美国最高法院任职。

而我四天前就这样做了,我提名了巡回上诉法院法官凯坦吉·布朗·杰克逊。她是我国顶尖的法律头脑之一,将继续布雷耶大法官卓越的遗产。
一旦文档加载完毕且索引创建完成,您现在可以直接实例化向量存储并对索引运行查询。
vectorstore = DocumentDBVectorSearch.from_connection_string(
    connection_string=CONNECTION_STRING,
    namespace=NAMESPACE,
    embedding=openai_embeddings,
    index_name=INDEX_NAME,
)

# 在查询和已摄取的文档之间执行相似性搜索
query = "总统对凯坦吉·布朗·杰克逊说了什么"
docs = vectorstore.similarity_search(query)
print(docs[0].page_content)
今晚。我呼吁参议院:通过《自由投票法案》。通过《约翰·刘易斯投票权法案》。并且,在你们这样做的时候,通过《披露法案》,以便美国人能够知道谁在资助我们的选举。

今晚,我想向一位毕生致力于服务这个国家的人致敬:斯蒂芬·布雷耶大法官——一位陆军退伍军人、宪法学者,以及即将退休的美国最高法院大法官。布雷耶大法官,感谢您的服务。

总统最严肃的宪法职责之一是提名某人在美国最高法院任职。

而我四天前就这样做了,我提名了巡回上诉法院法官凯坦吉·布朗·杰克逊。她是我国顶尖的法律头脑之一,将继续布雷耶大法官卓越的遗产。
# 在查询和已摄取的文档之间执行相似性搜索
query = "总统分享了哪些关于美国经济的统计数据"
docs = vectorstore.similarity_search(query)
print(docs[0].page_content)
与上届政府通过的、惠及美国最顶层 1% 人群的 2 万亿美元减税不同,《美国救援计划》帮助了劳动人民——并且没有遗漏任何人。

而且它奏效了。它创造了就业机会。大量的就业机会。

事实上——仅去年一年,我们的经济就创造了超过 650 万个新就业岗位,创造的就业岗位数量超过了美国历史上任何一年。

去年我们的经济增长率为 5.7%,这是近 40 年来最强劲的增长,这是为这个国家的劳动人民带来根本性变革的第一步,因为这个经济体系在太长时间里没有为他们服务。

在过去的 40 年里,我们被告知,如果我们给最顶层的人减税,好处会涓滴到其他所有人。

但这种涓滴理论导致了更疲软的经济增长、更低的工资、更大的赤字,以及近一个世纪以来顶层人群与其他所有人之间最悬殊的差距。

问答

qa_retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 25},
)
from langchain_core.prompts import PromptTemplate

prompt_template = """使用以下上下文来回答最后的问题。如果您不知道答案,就说您不知道,不要试图编造答案。

{context}

问题:{question}
"""
PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"]
)
from langchain_classic.chains import RetrievalQA
from langchain_openai import OpenAI

qa = RetrievalQA.from_chain_type(
    llm=OpenAI(),
    chain_type="stuff",
    retriever=qa_retriever,
    return_source_documents=True,
    chain_type_kwargs={"prompt": PROMPT},
)

docs = qa({"query": "gpt-4 计算要求"})

print(docs["result"])
print(docs["source_documents"])