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)
文件載入器
使用文件載入器 CrateDBLoader
從 CrateDB 資料庫表格載入文件,該載入器基於 SQLAlchemy。另請參閱 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()
聊天訊息歷史記錄
使用 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)
語義快取
語義快取允許使用者根據使用者輸入與先前快取的輸入之間的語義相似性來檢索快取的提示。它還可以避免在不需要時調用 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)