Skip to main content
在 GitHub 上打开

CrateDB

CrateDB 是一个分布式且可扩展的 SQL 数据库,用于存储和 近乎实时地分析大量数据,即使是复杂的 查询。它与 PostgreSQL 兼容,基于 Lucene,并继承 来自 Elasticsearch。

安装和设置

设置 CrateDB

有两种方法可以快速开始使用 CrateDB。或者 选择其他 CrateDB 安装选项

在本地计算机上启动 CrateDB

示例:在禁用安全性的情况下运行单节点 CrateDB 实例, 使用 Docker 或 Podman。不建议将其用于生产用途。

docker run --name=cratedb --rm \
--publish=4200:4200 --publish=5432:5432 --env=CRATE_HEAP_SIZE=2g \
crate:latest -Cdiscovery.type=single-node

在 CrateDB Cloud 上部署集群

CrateDB Cloud 是一种托管的 CrateDB 服务。注册免费试用版

安装客户端

安装最新版本的 langchain-cratedb 软件包 以及本教程所需的其他一些 API。

pip install --upgrade langchain-cratedb langchain-openai unstructured

文档

有关 CrateDB 包装器的更详细演练,请参阅将 LangChain 与 CrateDB 结合使用。另请参阅 CrateDB 的所有功能以了解 CrateDB 提供的其他功能。

特征

LangChain 的 CrateDB 适集成提供了使用 CrateDB 作为向量存储的 API, 文档加载器,以及聊天消息的存储。

矢量存储

使用 CrateDB 向量存储功能FLOAT_VECTORKNN_MATCH用于相似性搜索和其他目的。另请参见 CrateDBVectorStore 教程

确保您已配置有效的 OpenAI API 密钥。

export OPENAI_API_KEY=sk-XJZ...
from langchain_community.document_loaders import UnstructuredURLLoader
from langchain_cratedb import CrateDBVectorStore
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter

loader = UnstructuredURLLoader(urls=["https://github.com/langchain-ai/langchain/raw/refs/tags/langchain-core==0.3.28/docs/docs/how_to/state_of_the_union.txt"])
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

# Connect to a self-managed CrateDB instance on localhost.
CONNECTION_STRING = "crate://?schema=testdrive"

store = CrateDBVectorStore.from_documents(
documents=docs,
embedding=embeddings,
collection_name="state_of_the_union",
connection=CONNECTION_STRING,
)

query = "What did the president say about Ketanji Brown Jackson"
docs_with_score = store.similarity_search_with_score(query)

文档加载器

使用文档加载器从 CrateDB 数据库表中加载加载文档CrateDBLoader,它基于 SQLAlchemy。另请参见 CrateDBLoader 教程

要在应用程序中使用 Document Loader:

import sqlalchemy as sa
from langchain_community.utilities import SQLDatabase
from langchain_cratedb import CrateDBLoader

# Connect to a self-managed CrateDB instance on localhost.
CONNECTION_STRING = "crate://?schema=testdrive"

db = SQLDatabase(engine=sa.create_engine(CONNECTION_STRING))

loader = CrateDBLoader(
'SELECT * FROM sys.summits LIMIT 42',
db=db,
)
documents = loader.load()
API 参考:SQLDatabase

聊天消息历史记录

使用 CrateDB 作为聊天消息的存储。 另请参见 CrateDBChatMessageHistory 教程

要在应用程序中使用聊天消息历史记录:

from langchain_cratedb import CrateDBChatMessageHistory

# Connect to a self-managed CrateDB instance on localhost.
CONNECTION_STRING = "crate://?schema=testdrive"

message_history = CrateDBChatMessageHistory(
session_id="test-session",
connection=CONNECTION_STRING,
)

message_history.add_user_message("hi!")

完全缓存

标准/完整缓存避免在提供的 prompt 与已经遇到的完全相同。 另请参阅 CrateDBCache 示例

要在应用程序中使用完整缓存:

import sqlalchemy as sa
from langchain.globals import set_llm_cache
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_cratedb import CrateDBCache

# Configure cache.
engine = sa.create_engine("crate://crate@localhost:4200/?schema=testdrive")
set_llm_cache(CrateDBCache(engine))

# Invoke LLM conversation.
llm = ChatOpenAI(
model_name="chatgpt-4o-latest",
temperature=0.7,
)
print()
print("Asking with full cache:")
answer = llm.invoke("What is the answer to everything?")
print(answer.content)

语义缓存

语义缓存允许用户根据语义检索缓存的提示 用户输入与以前缓存的输入之间的相似性。它还避免了 在不需要时调用 LLM。 另请参见 CrateDBSemanticCache 示例

要在应用程序中使用语义缓存,请执行以下作:

import sqlalchemy as sa
from langchain.globals import set_llm_cache
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_cratedb import CrateDBSemanticCache

# Configure embeddings.
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# Configure cache.
engine = sa.create_engine("crate://crate@localhost:4200/?schema=testdrive")
set_llm_cache(
CrateDBSemanticCache(
embedding=embeddings,
connection=engine,
search_threshold=1.0,
)
)

# Invoke LLM conversation.
llm = ChatOpenAI(model_name="chatgpt-4o-latest")
print()
print("Asking with semantic cache:")
answer = llm.invoke("What is the answer to everything?")
print(answer.content)