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"])
将这些文档连接 到 Claude、VSCode 等,通过 MCP 获取实时答案。

