

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 搭配 LangChain 使用 DynamoDB
<a name="ddb-langchain"></a>

[LangChain](https://www.langchain.com/) 是使用大型語言模型 (LLMs建置應用程式的架構。兩個 LangChain 整合使用 DynamoDB： `DynamoDBChatMessageHistory`類別存放對話歷史記錄，以便模型可以跨工作階段與使用者來回交談，而 `DynamoDBVectorStore`類別在 DynamoDB 向量索引上實作 LangChain 向量存放介面以進行相似性搜尋。

## 聊天訊息歷史記錄
<a name="langchain-chat-history"></a>

在適用於 Python 的 `langchain-community` 套件和適用於 JavaScript 的 `@langchain/community`套件中， `DynamoDBChatMessageHistory`類別會在 DynamoDB 資料表中保留聊天訊息。類別預期現有資料表的分割區索引鍵是名為 的字串屬性 `SessionId`（可透過 設定`primary_key_name`)。使用 CLI AWS 建立資料表：

```
aws dynamodb create-table \
  --table-name SessionTable \
  --attribute-definitions AttributeName=SessionId,AttributeType=S \
  --key-schema AttributeName=SessionId,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST
```

安裝套件，然後讀取和寫入由工作階段 ID 輸入的歷史記錄：

```
pip install langchain-community boto3
```

```
from langchain_community.chat_message_histories import DynamoDBChatMessageHistory

history = DynamoDBChatMessageHistory(
    table_name="SessionTable",
    session_id="user-42",
)

history.add_user_message("Hello!")
history.add_ai_message("How can I help you today?")

print(history.messages)
```

每個聊天工作階段的訊息都存放在其 下`session_id`，因此傳回的使用者會在他們離開的地方接聽對話。建構函數也支援複合索引鍵，以依應用程式詳細資訊隔離歷史記錄，例如使用者 ID (`key`)、舊工作階段的存留期到期時間 (`ttl`)，以及已儲存訊息的上限 ()`history_size`。如需完整的 API，請參閱 [Python 參考](https://reference.langchain.com/python/langchain-community/chat_message_histories/dynamodb/DynamoDBChatMessageHistory)和 [JavaScript 參考](https://reference.langchain.com/javascript/langchain-community/stores/message/dynamodb)。

## 向量索引支援的向量存放區
<a name="langchain-vector-store"></a>

`langchain-aws` 套件中的 `DynamoDBVectorStore`類別會使用 DynamoDB 向量索引實作 LangChain 向量存放區界面 （請參閱 [在 DynamoDB 中使用向量索引](VectorSearch.md))。文件會儲存為一般 DynamoDB 項目，並使用 `SearchVectors` API 搜尋資料表的向量索引，因此 LangChain 擷取器和 RAG 鏈會直接針對存放您資料的資料表執行相似性搜尋。

安裝 套件：

```
pip install langchain-aws boto3
```

提供資料表名稱和內嵌函數。如果資料表和向量索引不存在，則會在第一次寫入時建立：

```
from langchain_aws.embeddings import BedrockEmbeddings
from langchain_aws.vectorstores.dynamodb import DynamoDBVectorStore

vector_store = DynamoDBVectorStore.from_texts(
    ["hello", "developer", "wife"],
    embedding=BedrockEmbeddings(model_id="amazon.titan-embed-text-v2:0"),
    table_name="my-documents",
)

docs = vector_store.similarity_search("greeting", k=2)
```

若要限定搜尋範圍，請在建構存放區`partition_attribute`時傳遞 。接著會使用該文件中繼資料欄位上的搜尋結構描述分割區索引鍵建立向量索引，每個搜尋只會檢查其中的一個值，例如集合、類別或租用戶，而不是整個 corpus。然後，每次搜尋都會透過 `filter={partition_attribute: value}`或儲存層級 提供值`default_partition_value`。分割區索引鍵是索引結構描述的一部分，建立索引後就無法變更。

請謹記以下幾點：
+ 與全域次要索引一樣，向量索引最終一致：在索引追上之前， 之後立即發出的搜尋`add_texts`可能不會包含剛撰寫的文件。
+ `SearchVectors` 會傳回每個查詢最多前 100 個相符項目，因此存放區的`k`參數上限為 100。
+ 索引的維度、距離函數和搜尋結構描述會在建立時修正。存放區會根據現有的索引進行驗證，而不是繼續進行不相符。

如需完整 API，請參閱 [langchain-aws 儲存庫中的 DynamoDBVectorStore](https://github.com/langchain-ai/langchain-aws/tree/main/libs/aws/langchain_aws/vectorstores/dynamodb)。

## 其他資源
<a name="langchain-additional-resources"></a>
+ [DynamoDBChatMessageHistory Python 參考](https://reference.langchain.com/python/langchain-community/chat_message_histories/dynamodb/DynamoDBChatMessageHistory)
+ [DynamoDBChatMessageHistory JavaScript 參考](https://reference.langchain.com/javascript/langchain-community/stores/message/dynamodb)
+ [GitHub 上的 langchain-aws](https://github.com/langchain-ai/langchain-aws)
+ [使用 Amazon DynamoDB、Amazon Bedrock 和 LangChain 建置可擴展的內容感知聊天機器人](https://aws.amazon.com/blogs/database/build-a-scalable-context-aware-chatbot-with-amazon-dynamodb-amazon-bedrock-and-langchain/)