Omni:用 Postgres pgvector 构建职场 RAG 搜索与聊天,无需向量数据库
在现代职场,员工每天需要在 Google Drive、Slack、Confluence、Jira 等多个分散工具中搜索信息、文档和对话记录。这种碎片化导致效率低下。传统 RAG(Retrieval-Augmented Generation)解决方案往往依赖 Elasticsearch 处理全文搜索、专用向量数据库如 Pinecone 或 Weaviate 存储嵌入向量,再叠加 LLM 服务。这种架构虽强大,但带来高运维成本、多组件协调复杂、数据隐私隐患等问题。
开源项目 Omni 提供了一个极简、高效的替代方案:一切数据与搜索逻辑全托管在 Postgres 中,利用 pgvector 扩展实现嵌入存储与检索,ParadeDB 处理 BM25 全文搜索,无需任何外部向量数据库或搜索引擎。这不仅简化了部署,还确保数据主权完全自控。Omni 支持统一搜索、多模态 RAG 聊天、权限继承,适用于中小团队自托管。
核心架构:Postgres 为王
Omni 的设计哲学是 “一个数据库搞定一切”。Postgres 作为核心存储:
- 全文搜索:ParadeDB(Postgres + Tantivy 引擎)构建 BM25 索引,支持高效关键词匹配。
- 语义搜索:pgvector 存储文档 chunk 的嵌入向量,使用 HNSW(Hierarchical Navigable Small World)算法进行 ANN(Approximate Nearest Neighbors)检索。
- 混合搜索(Hybrid Search):融合 BM25 分数与余弦相似度,公式大致为
score = α * norm_bm25 + (1 - α) * cosine_sim,其中 α 通常设为 0.3~0.7,根据领域调优。 - 应用数据:用户、连接器配置、对话历史、权限元数据全存 Postgres,避免多库同步。
如官方文档所述,AI Agent 通过工具调用(如 search(query)、retrieve_doc(id))查询索引,实现高级 RAG:不止 top-k 检索,还支持过滤、排序和多轮对话上下文注入。对话历史持久化在 conversations 表中,支持无限长上下文管理。
在 HN 讨论中,作者提到:“I've done small scale experiments with up to 100-500k rows, and did not notice any significant degradation in search query latency - p95 still well under 1s。”
这种 Postgres-only 方案的落地参数:
- 嵌入模型:推荐 OpenAI
text-embedding-3-small(维度 1536,低成本,高性能)或自托管BAAI/bge-large-en-v1.5。 - Chunking:文档切块大小 512 tokens,重叠 20%,确保检索粒度合适。
- pgvector HNSW 参数:
参数 推荐值 说明 m 16~32 每个节点的 max 连接数,越大 recall 越高但内存 / 构建慢 ef_construction 128~256 索引构建时搜索范围,影响构建时间与质量 ef_search 40~100 查询时搜索范围,平衡速度与召回
创建索引 SQL 示例:
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 128);
快速部署与配置清单
Omni 部署门槛极低,单机 Docker Compose 即可运行生产级服务。
-
环境准备:
- Docker 24+,Postgres 16+(启用 pgvector 和 ParadeDB 扩展)。
- 硬件:8GB RAM,SSD 存储(索引规模 1M docs 需~50GB)。
-
克隆与配置:
git clone https://github.com/getomnico/omni.git cd omni cp .env.example .env编辑
.env:POSTGRES_URL=postgresql://omni:omni@localhost:5432/omni EMBEDDING_PROVIDER=openai OPENAI_API_KEY=sk-... LLM_PROVIDER=anthropic # 或 openai/gemini/vllm ANTHROPIC_API_KEY=... -
启动:
docker compose up -d访问 http://localhost:3000,创建 admin 用户。
-
添加连接器:
- Google Workspace:上传 Service Account JSON,授权 Drive/Gmail scopes。
- Slack:Bot Token + App ID,索引 public channels(private 需额外权限映射)。
- Confluence/Jira:API Token + Base URL。 每个连接器独立容器运行,支持自定义 SDK(Python/TS)。
-
初始索引:UI 中触发全量同步,监控
connector_runs表进度。
生产部署用 Terraform(AWS/GCP),自动 provision RDS + EKS。
RAG 聊天与高级功能
- 搜索 UI:输入 query,返回 hybrid top-10 结果 + 高亮片段。
- 聊天 UI:LLM 自动调用工具检索,生成带 citation 的回答。支持 Python/Bash sandbox 执行(隔离 Docker 网络,无网访问)。
- 权限控制:应用层 WHERE 子句过滤(如
user_id IN (source_perms)),未来升级 Postgres RLS。Slack private channels 通过成员列表动态更新权限。
可落地提示模板:
Context: {retrieved_docs}
User: {query}
Assistant: Answer based on context, cite sources.
优化、监控与风险缓解
性能调优:
- Hybrid α:关键词重域设 0.7,语义重设 0.3。用 A/B 测试评估 NDCG@10。
- 索引维护:每周增量 upsert,避免全 rebuild。使用
pg_repack重组大表。 - Scale:500k docs 单实例足用;超 10M 分库(Citus)或读副本。
监控清单:
- Prometheus 指标:
search_query_latency_p95 < 500ms,index_build_duration。 - Alert:embedding queue >1000,permission_drift。
- Logs:Rust searcher 日志追踪 HNSW recall。
潜在风险:
- 权限同步延迟:Slack members 变更需实时 webhook,fallback 用 cron 每小时 sync。
- LLM 幻觉:强制 tool use + citation,必选 verified sources。
- 成本:BYO LLM,监控 token 用量;vLLM 自托管开源模型降本 90%。
回滚策略:索引快照(pg_dump),Docker rollback。
Omni 证明了 Postgres pgvector 已成熟到取代专用 vector DB,用于生产 RAG workplace search。相比 SaaS 如 Glean,节省 80% 成本,自控数据。
资料来源: