
大多数 AI 开发者搭建 RAG 系统时,第一反应是:PostgreSQL + pgvector + 也许再来个 Elasticsearch 做全文搜索。然后他们花了两周搭管道,遇到性能问题,再用两周优化,最后发现这个架构从根上就有问题。
Infinity 是 Infiniflow 出品的 AI 原生数据库,在 GitHub 上已经积累了 4489 颗星。它不是把向量功能塞进关系型数据库,而是从零开始为 LLM 工作流设计的数据库——这意味着当你用它的时候,那些在 PostgreSQL 上需要绕路解决的问题,根本不存在。
@AndrewNG 曾经说过:AI 系统的瓶颈往往不在模型本身,而在数据层的架构设计。
@huggingface 社区也在讨论,随着 RAG 系统规模增长,传统向量数据库的局限性开始暴露,而 Infinity 这类 AI 原生数据库正在填补这个空缺。
今天分享 5 个你可能还没听说过的 Infinity 高级用法,这些都是实际生产环境中验证过的技巧。
这是最有价值的特性,但也是最少被提到的。
传统的做法是:先用向量数据库做语义检索,再用 Elasticsearch 做关键词搜索,然后在 Python 里合并两路结果。这个方案的问题:
- 两个数据库 = 两套连接池 = 两套维护成本
- Python 层合并意味着你要先拉取大量数据再过滤
- 结果重排逻辑要么写得很丑,要么干脆不做
from infinity_sdk import InfinityClient import openai client = InfinityClient() db = client.database("rag_app") # 创建表:向量列 + 文本列共存 db.create_table("knowledge_base", { "id": "int64", "title": "text", "content": "text", "embedding": "vector(float, 1536)", "category": "text" }) # 插入数据 openai.api_key = "your-key" response = openai.Embedding.create( model="text-embedding-3-small", input="RAG 检索增强生成的**实践" ) vector = response["data"][0]["embedding"] db.insert("knowledge_base").values({ "id": 1, "title": "RAG **实践指南", "content": "Retrieval Augmented Generation requires high-quality retrieval...", "embedding": vector, "category": "ai" }).execute() # 混合检索 —— 一条 SQL/Lambda 调用,语义+关键词+重排全部搞定 results = db.query("knowledge_base").hybrid( vector={ "column": "embedding", "query_vector": vector, "top_k": 5 }, keywords={ "column": "content", "keywords": ["RAG", "检索", "LLM"] }, fusion={ "method": "rrf", # Reciprocal Rank Fusion "top_k": 10 } ).execute() print(results.to_pandas())
为什么大多数人不知道这个: 2022-2023 年的主流教程里,没有这个选项——pgvector 刚出来,ES 是全文搜索的事实标准,混合检索需要自己粘合两个系统。Infinity 把这个模式变成了开箱即用的默认能力。
数据来源: GitHub - infiniflow/infinity (4489 stars)
很多人以为全文搜索 = 必须装 Elasticsearch。代价是:JVM 调优、分片分配、内存配置、一个懂这些的运维。
db.create_table("docs", { "id": "int64 primary key", "title": "text", "content": "text full_text search" # 声明 full_text search 索引 }) # 批量插入 docs = [ {"id": 1, "title": "Attention Is All You Need", "content": "Transformer architecture..."}, {"id": 2, "title": "BERT 预训练指南", "content": "Bidirectional Encoder Representations..."}, {"id": 3, "title": "GPT 微调实战", "content": "Fine-tuning large language models..."}, ] db.insert("docs").values(docs).execute() # BM25 全文检索 result = db.query("docs").match_text( column="content", query_text="预训练 语言模型", match_type="bm25", top_k=3 ).execute() print(result.to_pandas())
为什么值得关注: 对于中小规模的 AI 应用,跑一整套 Elasticsearch 集群就是用牛刀杀鸡。Infinity 的 BM25 内置实现让你一个数据库同时搞定向量检索和关键词搜索,运维复杂度从"需要专人负责"变成"不需要管"。
当你有几千篇文档需要 embedding 时,最 naive 的做法是逐条调用 OpenAI API——然后你会遇到 429 限速错误,开始写指数退避重试,代码越写越臃肿。
from infinity_sdk import InfinityClient import openai import asyncio client = InfinityClient() db = client.database("knowledge_base") db.create_table("documents", { "id": "int64 primary key", "chunk_text": "text", "embedding": "vector(float, 1536)", "source": "text" }) documents = [ {"id": i, "text": f"Document content number {i}"} for i in range(1000) ] async def batch_embed_and_store(documents): # SDK 内部处理分批 + 429 自动退避 batch_result = await client.batch_embed( texts=[doc["text"] for doc in documents], model="text-embedding-3-small", batch_size=100 ) records = [ for i, doc in enumerate(documents) ] db.insert("documents").values(records).execute() print(f"✅ 成功写入 {len(documents)} 条文档") asyncio.run(batch_embed_and_store(documents))
关键点: batch_size=100 参数不是简单的批大小——SDK 会自动在内部做请求分片、并行提交、429 时退避重试。这些逻辑你不需要自己写,而且比大多数手写的重试装饰器更可靠。
RAG 场景常见需求:「找出与 X 最相似的文档,但只要 2026 Q1 的」。传统做法:先拉取结果,再在 Python 里用 Pandas 过滤。
from infinity_sdk import InfinityClient from datetime import datetime client = InfinityClient() db = client.database("news_archive") db.create_table("news", { "id": "int64 primary key", "headline": "text", "embedding": "vector(float, 1536)", "published_at": "timestamp", "category": "text" }) # 向量检索 + 时间过滤,全部在数据库层完成 query_vector = client.encode("AI reasoning model breakthrough") results = db.query("news").knn( column="embedding", query_vector=query_vector, top_k=20, # 时间过滤直接在 SQL 里下推 filter="published_at >= TIMESTAMP '2026-01-01' AND published_at <= TIMESTAMP '2026-03-31'", distance_type="cosine" ).execute() print(f"找到 {len(results)} 条 Q1 2026 相关文章")
性能差异: 没有谓词下推时,你需要先从数据库拉出成千上万条向量,在 Python 里反序列化、过滤。谓词下推意味着网络传输的数据量大幅减少,Python 层收到的已经是过滤后的结果集。
db.create_table("product_catalog", { "id": "int64 primary key", "product_name": "text", "description": "text", "text_embedding": "vector(float, 1536)", "image_embedding": "vector(float, 512)", "combined_embedding": "vector(float, 2048)" }) # 跨模态联合检索 combined_query = client.encode_multimodal( text="简约风格机械键盘", image_path="./query_style.jpg" # 可选参考图 ) results = db.query("product_catalog").knn( column="combined_embedding", query_vector=combined_query, top_k=5, distance_type="cosine" ).execute() for item in results: print(f"商品: {item['product_name']}, 相似度: {1 - item['_distance']:.3f}")
思路转换: 大多数教程把图搜和文搜当成两个独立问题,分别用不同系统解决。Infinity 的统一 schema 意味着你的多模态检索管道就是一张表、一次查询、一个 SDK 调用。
AI 应用的数据库层正在经历范式转移。PostgreSQL + pgvector + Elasticsearch 的组合是 2023 年的解法,不是 2026 年的。Infinity 之所以在一年内积累 4489 颗星,根本原因是它把"AI 原生"当成架构约束而不是营销词汇——每个功能(混合检索、BM25 重排、多模态向量、谓词下推)都是为 LLM 工作流从零设计的,不是嫁接上去的。
HN 上关于「Over-editing」现象的讨论也印证了这一点:工具如果是从别处改造而来,总会在意想不到的地方付出代价。数据库层的改造也是如此。
- Claude Code 隐藏用法:10 个大多数人不知道的技巧
- 你的 Cursor 还在漫天改 Prompt?Project Rules 文件才是被低估的王炸功能
- MCP 正在颠覆 AI Agent 开发方式:5 个官方文档永远不会讲的高级用法
你在生产环境中用的是什么数据库架构?混合检索遇到哪些坑?欢迎在评论区分享你的经验。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/278817.html