Apache Cassandra
本页提供了将 Apache Cassandra® 用作 Vector Store 的快速入门。
Cassandra 是一个 NoSQL、面向行、高度可扩展且高度可用的数据库。从版本 5.0 开始,数据库附带矢量搜索功能。
注意:除了访问数据库之外,还需要 OpenAI API 密钥才能运行完整示例。
设置和一般依赖项
使用集成需要以下 Python 包。
%pip install --upgrade --quiet langchain-community "cassio>=0.1.4"
注意:根据你的 LangChain 设置,你可能需要安装/升级此演示所需的其他依赖项
(具体来说,最新版本的datasets,openai,pypdf和tiktoken是必需的,以及langchain-community).
import os
from getpass import getpass
from datasets import (
load_dataset,
)
from langchain_community.document_loaders import PyPDFLoader
from langchain_core.documents import Document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass("OPENAI_API_KEY = ")
embe = OpenAIEmbeddings()
导入 Vector Store
from langchain_community.vectorstores import Cassandra
连接参数
本页中显示的 Vector Store 集成可与 Cassandra 以及其他使用 CQL (Cassandra 查询语言)协议的派生数据库(如 Astra DB)一起使用。
DataStax Astra DB 是基于 Cassandra 构建的托管无服务器数据库,提供相同的界面和优势。
根据您是通过 CQL 连接到 Cassandra 集群还是 Astra DB ,在创建矢量存储对象时,您将提供不同的参数。
连接到 Cassandra 集群
您首先需要创建一个cassandra.cluster.Session对象,如 Cassandra 驱动程序文档中所述。详细信息各不相同(例如,网络设置和身份验证),但这可能是这样的:
from cassandra.cluster import Cluster
cluster = Cluster(["127.0.0.1"])
session = cluster.connect()
您现在可以将会话以及所需的密钥空间名称设置为全局 CassIO 参数:
import cassio
CASSANDRA_KEYSPACE = input("CASSANDRA_KEYSPACE = ")
cassio.init(session=session, keyspace=CASSANDRA_KEYSPACE)
现在,您可以创建 vector store:
vstore = Cassandra(
embedding=embe,
table_name="cassandra_vector_demo",
# session=None, keyspace=None # Uncomment on older versions of LangChain
)
注意:在创建 vector store 时,你也可以直接将 session 和 keyspace 作为参数传递。使用全局cassio.init但是,如果您的应用程序以多种方式(例如,用于矢量存储、聊天内存和 LLM 响应缓存)使用 Cassandra,则设置会很方便,因为它允许将凭证和数据库连接管理集中在一个地方。
通过 CQL 连接到 Astra DB
在这种情况下,您可以使用以下连接参数初始化 CassIO:
- 数据库 ID,例如
01234567-89ab-cdef-0123-456789abcdef - 令牌,例如
AstraCS:6gBhNmsk135....(必须是 “Database Administrator” 令牌) - (可选)密钥空间名称(如果省略,将使用数据库的默认名称)
ASTRA_DB_ID = input("ASTRA_DB_ID = ")
ASTRA_DB_APPLICATION_TOKEN = getpass("ASTRA_DB_APPLICATION_TOKEN = ")
desired_keyspace = input("ASTRA_DB_KEYSPACE (optional, can be left empty) = ")
if desired_keyspace:
ASTRA_DB_KEYSPACE = desired_keyspace
else:
ASTRA_DB_KEYSPACE = None
import cassio
cassio.init(
database_id=ASTRA_DB_ID,
token=ASTRA_DB_APPLICATION_TOKEN,
keyspace=ASTRA_DB_KEYSPACE,
)
现在,您可以创建 vector store:
vstore = Cassandra(
embedding=embe,
table_name="cassandra_vector_demo",
# session=None, keyspace=None # Uncomment on older versions of LangChain
)
加载数据集
将源数据集中的每个条目转换为Document,然后将它们写入 vector store 中:
philo_dataset = load_dataset("datastax/philosopher-quotes")["train"]
docs = []
for entry in philo_dataset:
metadata = {"author": entry["author"]}
doc = Document(page_content=entry["quote"], metadata=metadata)
docs.append(doc)
inserted_ids = vstore.add_documents(docs)
print(f"\nInserted {len(inserted_ids)} documents.")
在上面,metadata词典是从源数据创建的,是Document.
添加更多条目,这次使用add_texts:
texts = ["I think, therefore I am.", "To the things themselves!"]
metadatas = [{"author": "descartes"}, {"author": "husserl"}]
ids = ["desc_01", "huss_xy"]
inserted_ids_2 = vstore.add_texts(texts=texts, metadatas=metadatas, ids=ids)
print(f"\nInserted {len(inserted_ids_2)} documents.")
注意:您可能希望加快add_texts和add_documents通过提高
这些批量作 - 查看方法'batch_size参数
了解更多详情。根据网络和客户端计算机规格,您选择的最佳性能参数可能会有所不同。
运行搜索
本节演示了元数据筛选和获取相似性分数:
results = vstore.similarity_search("Our life is what we make of it", k=3)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
results_filtered = vstore.similarity_search(
"Our life is what we make of it",
k=3,
filter={"author": "plato"},
)
for res in results_filtered:
print(f"* {res.page_content} [{res.metadata}]")
results = vstore.similarity_search_with_score("Our life is what we make of it", k=3)
for res, score in results:
print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
MMR (Maximal-marginal-relevance) 搜索
results = vstore.max_marginal_relevance_search(
"Our life is what we make of it",
k=3,
filter={"author": "aristotle"},
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
删除已存储的文档
delete_1 = vstore.delete(inserted_ids[:3])
print(f"all_succeed={delete_1}") # True, all documents deleted
delete_2 = vstore.delete(inserted_ids[2:5])
print(f"some_succeeds={delete_2}") # True, though some IDs were gone already
最小的 RAG 链
接下来的 cells 将实现一个简单的 RAG 管道:
- 下载样本 PDF 文件并将其加载到商店中;
- 使用 LCEL(LangChain 表达式语言)创建一个 RAG 链,以向量存储为核心;
- 运行问答链。
!curl -L \
"https://github.com/awesome-astra/datasets/blob/main/demo-resources/what-is-philosophy/what-is-philosophy.pdf?raw=true" \
-o "what-is-philosophy.pdf"
pdf_loader = PyPDFLoader("what-is-philosophy.pdf")
splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=64)
docs_from_pdf = pdf_loader.load_and_split(text_splitter=splitter)
print(f"Documents from PDF: {len(docs_from_pdf)}.")
inserted_ids_from_pdf = vstore.add_documents(docs_from_pdf)
print(f"Inserted {len(inserted_ids_from_pdf)} documents.")
retriever = vstore.as_retriever(search_kwargs={"k": 3})
philo_template = """
You are a philosopher that draws inspiration from great thinkers of the past
to craft well-thought answers to user questions. Use the provided context as the basis
for your answers and do not make up new reasoning paths - just mix-and-match what you are given.
Your answers must be concise and to the point, and refrain from answering about other topics than philosophy.
CONTEXT:
{context}
QUESTION: {question}
YOUR ANSWER:"""
philo_prompt = ChatPromptTemplate.from_template(philo_template)
llm = ChatOpenAI()
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| philo_prompt
| llm
| StrOutputParser()
)
chain.invoke("How does Russel elaborate on Peirce's idea of the security blanket?")
有关更多信息,请在此处查看通过 CQL 使用 Astra DB 的完整 RAG 模板。
清理
下面基本上检索了Session对象并运行 CQLDROP TABLE语句中:
(您将丢失存储在其中的数据。
cassio.config.resolve_session().execute(
f"DROP TABLE {cassio.config.resolve_keyspace()}.cassandra_vector_demo;"
)
了解更多信息
有关更多信息、扩展快速入门和其他使用示例,请访问 CassIO 文档以了解有关使用 LangChain 的更多信息Cassandra向量存储。
归属声明
Apache Cassandra、Cassandra 和 Apache 是 Apache Software Foundation 在美国和/或其他国家/地区的注册商标或商标。