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

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 搜索系统,使用向量数据库存储并检索文档的嵌入数据。你可以根据实际需求进一步扩展和优化此系统,提升其查询能力和处理效率。

相关文章:

  • 解锁Linux内核黑科技:VFS虚拟文件系统详解
  • JavaScript 如何检查给定的四个点是否形成一个正方形(How to check if given four points form a square)
  • mac m4 Homebrew安装MySQL 8.0
  • 2025最新版:用Python快速上手人工智能与机器学习
  • Vala编程语言教程-信号
  • CSS 实现滚动条的隐藏但保留滚动功能
  • Python列表生成式
  • 联合体(Union)的使用与应用场景
  • 【解决】Visual Studio 无法中文输入问题
  • 集成电容器降低换向环电感
  • 李想官宣开源整车操作系统
  • 【机器学习】——机器学习基础概念
  • Redis 中的热点键和数据倾斜
  • 行星际激波特征分析及其在太阳风激波自动检测算法开发与优化中的应用
  • 《深度剖析SQL数据类型转换:隐式与显式的奥秘》
  • 超简单:Linux下opencv-gpu配置
  • 什么是 JavaScript 中的原型链(Prototype Chain)?
  • Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(五)
  • 北理工计算机考研复试上机2012年真题
  • 场馆预约小程序的设计与实现
  • ci框架的网站/网络安全
  • 江阴网站推广/电商平台运营方案
  • 做网站界面用什么软件/百度在线翻译
  • 网站自助平台/新媒体营销策略
  • 广东网站建设有限公司/百度seo提高排名费用
  • web是做网站的吗/免费b2b平台推广