优化Django ORM实现PostgreSQL+向量相似度混合查询方案咨询
Django ORM与向量相似度搜索结合实现RAG系统
需求背景
我正在实现一个RAG(检索增强生成)系统,需要将传统Django ORM过滤与向量相似度搜索结合,具体流程为:
- 先通过标准关系字段(如
category="books")过滤产品 - 仅对过滤后的产品描述子集执行向量相似度搜索
当前实现与挑战
低效方案(两次独立操作)
# 当前低效方案(两次独立操作) books = Product.objects.filter(category="books") # 初始数据库查询 vectors = get_embeddings([b.description for b in books]) # 高成本嵌入生成 results = faiss_search(vectors, query_embedding) # 向量搜索
该方案核心问题:
- 需将所有过滤记录加载到内存
- 对数据进行两次独立遍历
- 使用pgvector时未利用PostgreSQL原生能力
已尝试的方案及问题
- 原生SQL结合pgvector
query = """ SELECT id FROM products WHERE category = 'books' ORDER BY description_embedding <=> %s LIMIT 10 """ results = Product.objects.raw(query, [query_embedding])
问题:丢失Django ORM链式调用、模型方法等核心优势
- 使用django-pgvector扩展
from pgvector.django import L2Distance books = Product.objects.annotate( distance=L2Distance('description_embedding', query_embedding) ).filter(category="books").order_by('distance')[:10]
问题:面对复杂过滤条件时扩展性不足
期望解决方案
需要实现一种方法,满足以下要求:
- 保留Django ORM初始过滤的灵活性
- 高效结合过滤子集的向量搜索
- 避免将所有记录加载到内存
- 优先在Django生态内实现
运行环境
- Django 5.0
- PostgreSQL 15 + pgvector
- Python 3.11
内容的提问来源于stack exchange,提问作者MD Abdur Rahim
相关产品推荐
相关产品推荐

