CrateDB
CrateDB 是一个分布式且可扩展的 SQL 数据库,用于在近乎实时的情况下存储和分析海量数据,即使面对复杂的查询也能胜任。它兼容 PostgreSQL,基于 Lucene 构建,并继承了 Elasticsearch 的特性。
安装与设置¶
设置 CrateDB
有两种方法可以快速开始使用 CrateDB。或者, 选择其他 CrateDB 安装选项。
在本地机器上启动 CrateDB
示例:使用 Docker 或 Podman 运行一个禁用安全功能的单节点 CrateDB 实例。 不推荐将此配置用于生产环境。
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 包 以及本教程所需的其他几个包。
pip install --upgrade langchain-cratedb langchain-openai unstructured
文档
有关 CrateDB 包装器的更详细逐步指南,请参阅 使用 LangChain 与 CrateDB。另请查看 CrateDB 的所有功能 以了解 CrateDB 提供的其他功能。
特性
LangChain 的 CrateDB 适集成提供了 API,用于将 CrateDB 用作向量存储、文档加载器和聊天消息存储。
向量存储
使用 CrateDB 向量存储功能,围绕 FLOAT_VECTOR 和 KNN_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 数据库表中加载文档,使用基于 SQLAlchemy 的文档加载器
CrateDBLoader。另请参阅 CrateDBLoader 教程。
要在您的应用程序中使用文档加载器:
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()
ChatMessageHistory
使用 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!")
完整缓存
标准/完整缓存机制会在提供的提示词与之前遇到的完全相同时避免调用 LLM。 另请参阅 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)
语义缓存
语义缓存允许用户根据用户输入与之前缓存的输入之间的语义相似度来检索缓存的提示。它还能在不需要时避免调用大语言模型。 另请参阅 CrateDB 语义缓存示例。
要在您的应用程序中使用语义缓存:
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)