> ## Documentation Index
> Fetch the complete documentation index at: https://cndoc-langchain.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Amazon DocumentDB 集成

> 使用 LangChain Python 与 Amazon DocumentDB 向量存储集成。

> [Amazon DocumentDB（兼容 MongoDB）](https://docs.aws.amazon.com/documentdb/) 使得在云中设置、操作和扩展兼容 MongoDB 的数据库变得轻而易举。
> 使用 Amazon DocumentDB，您可以运行与 MongoDB 相同的应用程序代码，并使用相同的驱动程序和工具。
> Amazon DocumentDB 的向量搜索结合了基于 JSON 的文档数据库的灵活性和丰富的查询能力，以及向量搜索的强大功能。

本笔记本向您展示如何使用 [Amazon DocumentDB 向量搜索](https://docs.aws.amazon.com/documentdb/latest/developerguide/vector-search.html) 将文档存储在集合中、创建索引，并使用近似最近邻算法（如“余弦”、“欧几里得”和“点积”）执行向量搜索查询。默认情况下，DocumentDB 会创建分层可导航小世界（HNSW）索引。要了解其他支持的向量索引类型，请参阅上面链接的文档。

要使用 DocumentDB，您必须首先部署一个集群。有关更多详细信息，请参阅 [开发者指南](https://docs.aws.amazon.com/documentdb/latest/developerguide/what-is.html)。

[免费注册](https://aws.amazon.com/free/) 以立即开始。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
!pip install pymongo
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
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 环境变量。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
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"  # 模型名称
```

现在，我们将把文档加载到集合中，创建索引，然后对索引执行查询。

如果您对某些参数有疑问，请参阅 [文档](https://docs.aws.amazon.com/documentdb/latest/developerguide/vector-search.html)。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
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
)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
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)
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{ 'createdCollectionAutomatically' : false,
   'numIndexesBefore' : 1,
   'numIndexesAfter' : 2,
   'ok' : 1,
   'operationTime' : Timestamp(1703656982, 1)}
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 在查询的嵌入和文档的嵌入之间执行相似性搜索
query = "总统对凯坦吉·布朗·杰克逊说了什么"
docs = vectorstore.similarity_search(query)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print(docs[0].page_content)
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
今晚。我呼吁参议院：通过《自由投票法案》。通过《约翰·刘易斯投票权法案》。并且，在你们这样做的时候，通过《披露法案》，以便美国人能够知道谁在资助我们的选举。

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

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

而我四天前就这样做了，我提名了巡回上诉法院法官凯坦吉·布朗·杰克逊。她是我国顶尖的法律头脑之一，将继续布雷耶大法官卓越的遗产。
```

一旦文档加载完毕且索引创建完成，您现在可以直接实例化向量存储并对索引运行查询。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
vectorstore = DocumentDBVectorSearch.from_connection_string(
    connection_string=CONNECTION_STRING,
    namespace=NAMESPACE,
    embedding=openai_embeddings,
    index_name=INDEX_NAME,
)

# 在查询和已摄取的文档之间执行相似性搜索
query = "总统对凯坦吉·布朗·杰克逊说了什么"
docs = vectorstore.similarity_search(query)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print(docs[0].page_content)
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
今晚。我呼吁参议院：通过《自由投票法案》。通过《约翰·刘易斯投票权法案》。并且，在你们这样做的时候，通过《披露法案》，以便美国人能够知道谁在资助我们的选举。

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

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

而我四天前就这样做了，我提名了巡回上诉法院法官凯坦吉·布朗·杰克逊。她是我国顶尖的法律头脑之一，将继续布雷耶大法官卓越的遗产。
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 在查询和已摄取的文档之间执行相似性搜索
query = "总统分享了哪些关于美国经济的统计数据"
docs = vectorstore.similarity_search(query)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print(docs[0].page_content)
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
与上届政府通过的、惠及美国最顶层 1% 人群的 2 万亿美元减税不同，《美国救援计划》帮助了劳动人民——并且没有遗漏任何人。

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

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

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

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

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

## 问答

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
qa_retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 25},
)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_core.prompts import PromptTemplate

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

{context}

问题：{question}
"""
PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"]
)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
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"])
```

***

<div className="source-links">
  <Callout icon="terminal-2">
    [将这些文档连接](/use-these-docs) 到 Claude、VSCode 等，通过 MCP 获取实时答案。
  </Callout>

  <Callout icon="edit">
    [在 GitHub 上编辑此页面](https://github.com/langchain-ai/docs/edit/main/src/oss/python/integrations/vectorstores/documentdb.mdx) 或 [提交问题](https://github.com/langchain-ai/docs/issues/new/choose)。
  </Callout>
</div>
