跳到主要内容
Open In ColabOpen on GitHub

Couchbase

Couchbase 是一个屡获殊荣的分布式 NoSQL 云数据库,为您的所有云、移动、AI 和边缘计算应用程序提供无与伦比的多功能性、性能、可扩展性和经济价值。Couchbase 通过为开发人员提供编码协助和为其应用程序提供向量搜索来拥抱 AI。

本 Notebook 介绍了如何使用 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://" # or "couchbases://" 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 集群中设置要用于存储消息历史记录的 bucket、scope 和 collection 名称。

请注意,在使用 bucket、scope 和 collection 存储消息历史记录之前,它们需要已经存在。

BUCKET_NAME = "langchain-testing"
SCOPE_NAME = "_default"
COLLECTION_NAME = "conversational_cache"

使用

为了存储消息,您需要以下内容:

  • Couchbase Cluster 对象:与 Couchbase 集群的有效连接
  • bucket_name:集群中用于存储聊天消息历史记录的 bucket
  • scope_name:bucket 中用于存储消息历史记录的 scope
  • collection_name:scope 中用于存储消息历史记录的 collection
  • session_id:会话的唯一标识符

您可以选择配置以下内容:

  • session_id_key:聊天消息文档中用于存储 session_id 的字段
  • message_key:聊天消息文档中用于存储消息内容的字段
  • create_index:用于指定是否需要在 collection 上创建索引。默认情况下,会在文档的 message_keysession_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 Runnables 一起使用。

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})