Couchbase
Couchbase 是一個獲獎的 NoSQL 分散式雲端資料庫,為您的所有雲端、行動、AI 和邊緣運算應用程式提供無與倫比的多功能性、效能、可擴展性和財務價值。Couchbase 透過開發人員的程式碼輔助及其應用程式的向量搜尋來擁抱 AI。
本筆記本說明如何使用 CouchbaseChatMessageHistory
類別將聊天訊息歷史記錄儲存在 Couchbase 叢集中
設定 Couchbase 叢集
若要執行此示範,您需要 Couchbase 叢集。
您可以同時使用 Couchbase Capella 和您自行管理的 Couchbase Server。
安裝相依性
CouchbaseChatMessageHistory
位於 langchain-couchbase
套件中。
%pip install --upgrade --quiet langchain-couchbase
Note: you may need to restart the kernel to use updated packages.
建立 Couchbase 連線物件
我們先建立與 Couchbase 叢集的連線,然後將叢集物件傳遞至向量儲存庫。
在這裡,我們使用使用者名稱和密碼進行連線。您也可以使用任何其他支援的方式連線到您的叢集。
如需連線至 Couchbase 叢集的詳細資訊,請查看 Python SDK 文件。
COUCHBASE_CONNECTION_STRING = (
"couchbase://127.0.0.1" # or "couchbases://127.0.0.1" if using TLS
)
DB_USERNAME = "Administrator"
DB_PASSWORD = "Password"
from datetime import timedelta
from couchbase.auth import PasswordAuthenticator
from couchbase.cluster import Cluster
from couchbase.options import ClusterOptions
auth = PasswordAuthenticator(DB_USERNAME, DB_PASSWORD)
options = ClusterOptions(auth)
cluster = Cluster(COUCHBASE_CONNECTION_STRING, options)
# Wait until the cluster is ready for use.
cluster.wait_until_ready(timedelta(seconds=5))
我們現在將在 Couchbase 叢集中設定儲存訊息歷史記錄時要使用的儲存桶、Scope 和 Collection 名稱。
請注意,儲存桶、Scope 和 Collection 需要先存在,才能用來儲存訊息歷史記錄。
BUCKET_NAME = "langchain-testing"
SCOPE_NAME = "_default"
COLLECTION_NAME = "conversational_cache"
用法
為了儲存訊息,您需要以下項目
- Couchbase 叢集物件:與 Couchbase 叢集的有效連線
- bucket_name:叢集中用於儲存聊天訊息歷史記錄的儲存桶
- scope_name:儲存桶中用於儲存訊息歷史記錄的 Scope
- collection_name:Scope 中用於儲存訊息歷史記錄的 Collection
- session_id:工作階段的唯一識別碼
您可以選擇性地設定以下項目
- session_id_key:聊天訊息文件中用於儲存
session_id
的欄位 - message_key:聊天訊息文件中用於儲存訊息內容的欄位
- create_index:用於指定是否需要在 Collection 上建立索引。依預設,會在文件的
message_key
和session_id_key
上建立索引 - ttl:用於指定文件的存活時間 (
timedelta
),超過此時間後,文件將自動從儲存體中刪除。
from langchain_couchbase.chat_message_histories import CouchbaseChatMessageHistory
message_history = CouchbaseChatMessageHistory(
cluster=cluster,
bucket_name=BUCKET_NAME,
scope_name=SCOPE_NAME,
collection_name=COLLECTION_NAME,
session_id="test-session",
)
message_history.add_user_message("hi!")
message_history.add_ai_message("how are you doing?")
message_history.messages
[HumanMessage(content='hi!'), AIMessage(content='how are you doing?')]
為聊天訊息指定存活時間 (TTL)
透過指定 ttl
參數以及聊天訊息歷史記錄儲存區的初始化,可以在指定的時限過後自動刪除儲存的訊息。
from langchain_couchbase.chat_message_histories import CouchbaseChatMessageHistory
message_history = CouchbaseChatMessageHistory(
cluster=cluster,
bucket_name=BUCKET_NAME,
scope_name=SCOPE_NAME,
collection_name=COLLECTION_NAME,
session_id="test-session",
ttl=timedelta(hours=24),
)
鏈結
聊天訊息歷史記錄類別可以與 LCEL Runnable 一起使用
import getpass
import os
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = getpass.getpass()
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant."),
MessagesPlaceholder(variable_name="history"),
("human", "{question}"),
]
)
# Create the LCEL runnable
chain = prompt | ChatOpenAI()
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: CouchbaseChatMessageHistory(
cluster=cluster,
bucket_name=BUCKET_NAME,
scope_name=SCOPE_NAME,
collection_name=COLLECTION_NAME,
session_id=session_id,
),
input_messages_key="question",
history_messages_key="history",
)
# This is where we configure the session id
config = {"configurable": {"session_id": "testing"}}
chain_with_history.invoke({"question": "Hi! I'm bob"}, config=config)
AIMessage(content='Hello, Bob! How can I assist you today?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 11, 'prompt_tokens': 22, 'total_tokens': 33}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-62e54e3d-db70-429d-9ee0-e5e8eb2489a1-0', usage_metadata={'input_tokens': 22, 'output_tokens': 11, 'total_tokens': 33})
chain_with_history.invoke({"question": "Whats my name"}, config=config)
AIMessage(content='Your name is Bob.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 5, 'prompt_tokens': 44, 'total_tokens': 49}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-d84a570a-45f3-4931-814a-078761170bca-0', usage_metadata={'input_tokens': 44, 'output_tokens': 5, 'total_tokens': 49})