跳到主要内容
此示例演示如何使用 CassandraKVStore BaseStore 集成来设置聊天历史记录存储。请注意,有一个 CassandraChatMessageHistory 集成可能更容易用于聊天历史记录存储;如果您想要一个更通用的、带有可加前缀的键值存储,那么 CassandraKVStore 会很有用。

设置

npm
npm install @langchain/community @langchain/core cassandra-driver
根据您的数据库提供商,连接到数据库的具体方式会有所不同。我们将创建一个文档 configConnection,它将作为存储配置的一部分使用。

Apache Cassandra®

Apache Cassandra® 5.0 及更高版本支持存储附加索引(由 yieldKeys 使用)。您可以使用标准连接文档,例如
const configConnection = {
  contactPoints: ['h1', 'h2'],
  localDataCenter: 'datacenter1',
  credentials: {
    username: <...> as string,
    password: <...> as string,
  },
};

Astra DB

Astra DB 是一个云原生的 Cassandra 即服务平台。
  1. 创建一个 Astra DB 账户
  2. 创建一个 启用向量功能的数据库
  3. 为您的数据库创建令牌
const configConnection = {
  serviceProviderArgs: {
    astra: {
      token: <...> as string,
      endpoint: <...> as string,
    },
  },
};
您可以提供属性 datacenterID: 而不是 endpoint:,并可选地提供 regionName:

用法

import { CassandraKVStore } from "@langchain/community/storage/cassandra";
import { AIMessage, HumanMessage } from "@langchain/core/messages";

// This document is the Cassandra driver connection document; the example is to AstraDB but
// any valid Cassandra connection can be used.
const configConnection = {
  serviceProviderArgs: {
    astra: {
      token: "YOUR_TOKEN_OR_LOAD_FROM_ENV" as string,
      endpoint: "YOUR_ENDPOINT_OR_LOAD_FROM_ENV" as string,
    },
  },
};

const store = new CassandraKVStore({
  ...configConnection,
  keyspace: "test", // keyspace must exist
  table: "test_kv", // table will be created if it does not exist
  keyDelimiter: ":", // optional, default is "/"
});

// Define our encoder/decoder for converting between strings and Uint8Arrays
const encoder = new TextEncoder();
const decoder = new TextDecoder();

/**
 * Here you would define your LLM and chat chain, call
 * the LLM and eventually get a list of messages.
 * For this example, we'll assume we already have a list.
 */
const messages = Array.from({ length: 5 }).map((_, index) => {
  if (index % 2 === 0) {
    return new AIMessage("ai stuff...");
  }
  return new HumanMessage("human stuff...");
});

// Set your messages in the store
// The key will be prefixed with `message:id:` and end
// with the index.
await store.mset(
  messages.map((message, index) => [
    `message:id:${index}`,
    encoder.encode(JSON.stringify(message)),
  ])
);

// Now you can get your messages from the store
const retrievedMessages = await store.mget(["message:id:0", "message:id:1"]);
// Make sure to decode the values
console.log(retrievedMessages.map((v) => decoder.decode(v)));

/**
[
  '{"id":["langchain","AIMessage"],"kwargs":{"content":"ai stuff..."}}',
  '{"id":["langchain","HumanMessage"],"kwargs":{"content":"human stuff..."}}'
]
 */

// Or, if you want to get back all the keys you can call
// the `yieldKeys` method.
// Optionally, you can pass a key prefix to only get back
// keys which match that prefix.
const yieldedKeys = [];
for await (const key of store.yieldKeys("message:id:")) {
  yieldedKeys.push(key);
}

// The keys are not encoded, so no decoding is necessary
console.log(yieldedKeys);
/**
[
  'message:id:2',
  'message:id:1',
  'message:id:3',
  'message:id:0',
  'message:id:4'
]
 */

// Finally, let's delete the keys from the store
await store.mdelete(yieldedKeys);

以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.