LangChain + PostgreSQL 实现向量数据库与 RAG 搜索

1. 环境准备

安装必要的库

pip install langchain psycopg2-binary pgvector langchain-openai

安装并配置 PostgreSQL

  1. 安装 PostgreSQL
    确保 PostgreSQL 已正确安装并运行。你可以根据操作系统的不同参考官方文档进行安装。

  2. 创建数据库
    创建一个新的数据库(例如 rag_db),用于存储向量数据:

    CREATE DATABASE rag_db;
    
  3. 启用 pgvector 扩展
    编译安装扩展:

    • Linux & Mac
      cd /tmp
      git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git
      cd pgvector
      make
      make install # may need sudo
      
    • Windows
      需要先安装好 Microsoft Visual Studio 2022 以及 C++ 桌面开发的相关组件。在Visual Studio 2022的开发终端中执行以下命令:
      set "PGROOT=C:\Program Files\PostgreSQL\16"
      cd %TEMP%
      git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git
      cd pgvector
      nmake /F Makefile.win
      nmake /F Makefile.win install
      

    在数据库中启用 pgvector 扩展,它提供了高效的向量操作功能:

    CREATE EXTENSION vector;
    
  4. 配置数据库连接
    确保你已获取 PostgreSQL 数据库的连接信息,包括用户名、密码、主机地址和端口。

获取 OpenAI API 密钥

  1. 在 OpenAI 官网 注册并获取 API 密钥,或者使用类似openai输入输出格式的第三方服务。

  2. 将密钥设置为环境变量 OPENAI_API_KEY,例如:

    import os
    os.environ["OPENAI_API_KEY"] = 'your_api_key'
    

2. 创建向量数据库

连接 PostgreSQL 数据库

首先,连接到 PostgreSQL 数据库,初始化数据库连接:

import psycopg2
from langchain_community.vectorstores import PGVector
from langchain_openai import OpenAIEmbeddings# 数据库连接字符串
CONNECTION_STRING = "postgresql://user:password@host:port/rag_db"# 创建数据库连接
conn = psycopg2.connect(CONNECTION_STRING)

创建向量存储

接下来,使用 OpenAIEmbeddings 来初始化嵌入模型,并使用 PGVector 来创建向量存储:

# 初始化 OpenAI 嵌入模型
embeddings = OpenAIEmbeddings()# 创建 PGVector 向量存储
vector_store = PGVector(embedding_function=embeddings,connection_string=CONNECTION_STRING,collection_name="my_documents",  # 向量存储名称use_jsonb=True  # 启用 JSONB 格式来存储向量数据
)

添加文档到向量存储

我们将文档加载、分割并添加到向量存储中:

from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加载文档
loader = TextLoader("your_document.txt")
documents = loader.load()# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)# 将文档添加到向量存储
vector_store.add_documents(texts)

注意: 替换 "your_document.txt" 为你实际的文档路径。


3. 实现 RAG 搜索

创建检索器

首先,创建一个从向量存储中检索文档的检索器:

# 创建检索器
retriever = vector_store.as_retriever()

创建 RAG 链

使用 ChatOpenAI 初始化 OpenAI LLM,然后创建一个 RAG 链来执行查询:

from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI# 创建 OpenAI LLM
llm = ChatOpenAI()# 创建 RAG 链
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

执行搜索

执行检索并生成答案:

# 执行搜索
query = "What is the main topic of the document?"
result = qa_chain.run(query)print(result)

4. 进一步优化

4.1 调整嵌入参数

你可以根据文档的具体内容和查询的复杂度,调整 chunk_sizechunk_overlap 参数。例如,如果文档较长,可以增大 chunk_size,或者减少 chunk_overlap 以避免重复信息。

4.2 使用不同的 LLM

除了 ChatOpenAI,你还可以尝试使用其他 LLM(如 gpt-3.5-turbogpt-4),或者选择其他的开源模型来替代 OpenAI。

4.3 分布式处理

当文档量较大时,建议将数据库配置为支持分布式处理,或者通过将多个小型数据库分散处理来提升性能。


5. 常见问题及解决方法

5.1 如何优化向量检索的速度?

  • 使用 PGVector 索引来加速向量检索。
  • 尽量减少数据库中的无关文档,并定期清理旧数据。
  • 调整 chunk_sizechunk_overlap 使得每个文本块足够包含关键信息,但不要过大以避免降低检索效率。

5.2 如何处理超出 OpenAI API 限制的情况?

如果请求的查询超出了 OpenAI 的 API 限制,你可以尝试将问题拆分成更小的子问题,或者将文档分割得更细,避免一次性请求过多数据。


总结

通过本教程,你可以快速实现一个基于 LangChain 和 PostgreSQL 的 RAG 搜索系统,使用向量数据库存储并检索文档的嵌入数据。你可以根据实际需求进一步扩展和优化此系统,提升其查询能力和处理效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32硬件IIC与OLED使用

OLED屏幕介绍 OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术 OLED显示…

idea自动生成注释

idea 自动生成注释 1 创建类时,自动生成注释 模板代码如下 /** * program: ${PROJECT_NAME} * * description: ${description} * * author: yun * * create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} **/ 2 在方法上使用快捷键生成注释 先新建一个…

doris:恢复

前提条件​ 确保您拥有管理员权限以执行恢复操作。确保您有一个有效的备份快照可供恢复,请参考备份。 1. 获取快照的备份时间戳​ 以下 SQL 语句可用于查看名为example_repo的 Repository 中的现有备份。 mysql> SHOW SNAPSHOT ON example_repo; -----------…

可视化图解算法:删除有序(排序)链表中重复的元素-II

1. 题目 描述 给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。 例如: 给出的链表为1→2→3→3→4→4→5, 返回1→2→5. 给出的链表为1→1→1→2→3 返回2→3. 数据范围:链表长度 0≤…

【leetcode刷题日记】lc.53-最大子数组和

目录 1.题目 2.代码 1.题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-…

树莓派超全系列文档--(7)RaspberryOS播放音频和视频

播放音频和视频 播放音频和视频VLC 媒体播放器vlc GUIvlc CLI使用 cvlc 在没有图形用户界面的情况下播放媒体 在 Raspberry Pi OS Lite 上播放音频和视频指定音频输出设备指定视频输出设备同时指定音频和视频输出设备提高数据流播放性能 文章来源: http://raspberr…

算法250327题目

1114: 4006 AB问题 题目描述 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号,隔开。 现在请计算AB的结果,并以正常形式输出。 输入 输入包含多组数据,每组数据占一行,由两个整数A和B组成&am…

Wireshark学习

Wireshark简介 抓包前 1.打开wireshark得到下面的界面 2.选择菜单栏上捕获-> 选项,勾选WLAN网卡(这里需要根据各自电脑网卡使用情况选择,简单的办法可以看使用的IP对应的网卡)。点击开始。启动抓包。 3.wireshark启动后&am…

[OS_4] 数学视角 | 多状态 | 模型检查器 | 程序验证(math)

程序 状态机 gdb 单步执行 状态迁移 状态里有什么?gdb 可以打印有一些特殊的状态迁移 硬件 状态机 指令执行 状态迁移 从 CPU Reset 开始执行 FirmwareFirmware 加载操作系统 (程序) 操作系统 状态机 (毫无疑问) 程序是一种真正意义上的 “数学严格” 的…

互联网的“神经中枢”域名根服务器是如何演变的?

互联网如同一条隐形的纽带,将全球数十亿人的生活和工作紧密相连。而在这庞大的网络体系中,域名根服务器则是支撑其平稳运行的“神经中枢”。那么域名根服务器是如何演变的呢? 一、域名根服务器互联网的“地址簿” 想象一下,当你…

【sylar-webserver】6 IO协程调度模块

文章目录 设计知识点 设计 IO协程调度模块,整个项目里最重要的模块~ 和 协程调度模块 相比,增加了 IO 事件的 触发条件。 所以需要重新封装 Event 事件, 通过 epoll_wait 监测触发事件(重新实现了idle),…

6.2、认证主要产品与应用

目录 认证主要产品认证产品主要技术指标认证技术应用认证技术应用 - 校园网应用认证技术应用 - 网络路由认证认证技术应用 - 用户登录设备认证技术应用 - 人脸识别门禁与eID 认证主要产品 应用认证产品主要形态有三种,硬件模式、软件模式和软硬相结合。硬件比如说认…

一套SaaS多租户医疗云his源码,基于云计算的医院信息管理系统(云HIS)

基于云计算的医院信息管理系统(云HIS),通过SaaS服务模式提供。这种云HIS系统设计考虑了模板化、配置化、智能化和可扩展性,覆盖了基层医疗机构的核心工作流程,并且能够与监管系统无缝对接,满足未来的扩展需…

人工智能技术全景图谱:从基础理论到前沿应用

人工智能技术全景图谱:从基础理论到前沿应用 一、AI发展历程与学科体系 1.1 人工智能三大学派 符号主义(Symbolicism) 逻辑推理:一阶谓词逻辑知识表示:语义网络、框架系统 连接主义(Connectionism&#…

基于杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、杜鹃鸟鲶鱼优化算法 杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法模拟了杜鹃鸟鲶鱼的搜索、捕食和寄生慈鲷行为。该算法的早期迭代侧重于执行多维包络搜索策略和压缩空间策略,并结合辅助搜索策略来有效限制慈鳔的逃逸空…

FPGA_DDS_IP核

接下来对FPGA的DDS的ip核进行学习。 首先对DDS需要有些了解 DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,简单来说就是 需要一个系统频率和一个输入的数字数据 ,用这个系统频率计算出…

dbeaver连接mongodb 插入日期变成了字符串

dbeaver插入mongodb数据 日期默认使用ISODate处理,但是插入数据以后实际上是ISODate(2025-03-03T03:25:19.640Z)字符串 INSERT INTO xxx.aaa (_id, chatId, buddyId, pId, lastChatId, inspiration, createTime, modelType, version, selectedInspiration, _class)…

微服务管理 - NACOS学习

为什么了解,工作中会使用这个工具进行微服务管理。 入门介绍: Nacos 是阿里巴巴开源的一款专注于动态服务发现、配置管理和服务管理的平台,主要用于简化云原生应用架构中的微服务开发与运维。它帮助开发者实现服务的自动注册与发现、实时配置…

外贸独立站相关知识扫盲

常见的外贸独立站类型 B2B外贸独立站:主要面向企业客户,展示公司产品、服务和解决方案,促进企业间贸易。例如,使用WordPress搭建的B2B外贸独立站,可以灵活展示产品信息、发布行业资讯、提供在线询盘功能等。 B2C外贸…

libpng-1.6.47-windows编译

本文操作按照《c&c开源库编译指南》中内容规范编写,编译环境配置、工具下载、目录规划,及更多其他开源库编译方法请参考该文章。 c&c开源库编译指南:https://blog.csdn.net/binary0006/article/details/144086155 本文章中的源代码已…