semantic-search-openai-pinecone
基于 OpenAI Embeddings 和 Pinecone 向量数据库的语义搜索引擎,T3 Stack 技术栈实现端到端类型安全
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于 OpenAI Embeddings 和 Pinecone 向量数据库的语义搜索引擎,T3 Stack 技术栈实现端到端类型安全
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你是否有过这样的经历:在 Google 搜索框里敲了一句话,找到的结果却驴唇不对马嘴?传统关键词搜索只认「字面」,而语义搜索能理解你输入背后的真正意图。mharrvic/semantic-search-openai-pinecone 就是一个演示如何用 OpenAI Embeddings 和向量数据库 Pinecone 构建语义搜索引擎的完整 Web 应用。
痛点场景:
想象你在一个客服知识库里搜索「怎么取消订阅」,传统方式只会匹配包含「取消」和「订阅」这两个词的文章。但如果文章标题写的是「退订服务」,用户就搜不到了。更糟糕的是,当你的知识库有上万条记录时,人工整理标签的成本高得离谱。
语义搜索解决的就是这个问题。它把文字转换成「数字向量」——比如把「取消订阅」和「退订服务」都转换成数学上距离很近的两个点,让计算机真正「理解」它们的含义相近,而不是机械地比对字符。
这个项目基于 OpenAI 的 text-embedding-ada-002 模型,将输入文本编码为 1536 维浮点数向量,存储到 Pinecone 向量数据库中。搜索时,用户的查询同样被编码为向量,在 Pinecone 中进行余弦相似度检索,返回最相关的 Top-K 条记录。
流程说明:
用户录入数据时,系统通过 Prisma + NeonDB 持久化原始文本(用于展示),同时将 embedding 向量写入 Pinecone(用于检索)。搜索时,前端 Next.js 接收查询文本,调用后端 tRPC 接口,经 OpenAI Embeddings 生成向量,从 Pinecone 召回最近邻结果,最终拼接原始文本返回前端展示。
整个检索链路延迟在毫秒级,即使数据量达到百万级别也能保持稳定性能。

图1:语义搜索主界面,展示数据录入完成后的系统状态
项目采用了当下 Node.js 全栈领域最具影响力的 T3 Stack,具体包含:
| 组件 | 技术选型 | 作用 |
|---|---|---|
| 前端框架 | Next.js 13 | SSR/SSG、API Routes |
| 类型安全 API | tRPC | 端到端类型推断,无手动类型定义 |
| ORM | Prisma | 数据库建模、类型安全查询 |
| 认证 | NextAuth.js | Google OAuth 登录 |
| 样式 | Tailwind CSS | 原子化 CSS |
| 表单 | React Hook Form + Zod | 类型安全表单验证 |
| AI 能力 | OpenAI SDK (v3.1.0) | Embeddings API 调用 |
| 向量存储 | Pinecone Client | 高维向量最近邻检索 |
| 数据库 | NeonDB (Serverless Postgres) | 零运维云数据库 |
整个前端通过 tRPC 与后端通信,实现了前后端类型零缝对接——你在前端写 API 调用时,TypeScript 编译器已经知道后端返回的数据结构,不存在接口文档和实际实现对不上的问题。
数据录入(Input):
用户登录后,在输入框中填入一段文本(可以是文章段落、产品描述、客服话术),点击提交。系统后台会同时完成两件事:将原文写入 NeonDB PostgreSQL,同时调用 OpenAI Embeddings 将文本转为向量写入 Pinecone。整个过程用户无感知,后台 toast 提示成功即可。
语义查询(Query):

图2:输入自然语言查询,系统返回语义最接近的原始文本记录
用户在搜索框输入自然语言提问,例如「如何关闭我的账户」,系统会将其转换为向量,在 Pinecone 中进行向量相似度检索,返回与该语义最接近的记录。如果用户之前录入过包含「注销账号」的文章,即使查询词里没有「注销」两个字,系统也能找到它。
这个项目虽然提供了完整可用的 Web 界面,但并非开箱即用的「一键部署」类型。部署前你需要准备:
准备好上述 4 个凭证后,.env 文件配置好,npx prisma db push 初始化数据库表,npm run dev 启动开发服务器,整个流程约 30 分钟。
没有 Dockerfile 和 docker-compose 是这个项目最大的遗憾——如果能提供 Docker 一键部署方案,部署门槛会大幅降低。
1. Embeddings 模型版本较旧: 项目使用的是 OpenAI text-embedding-ada-002,这是较早期的版本。OpenAI 后续推出了更强大的 text-embedding-3-small 和 text-embedding-3-large,维度更高(3072/3072)、性能更强,但需要重新生成所有向量索引。
2. 没有重排序(Re-ranking): Pinecone 返回 Top-K 结果后,项目直接展示原文,没有引入 Cross-Encoder 这样的重排序模型来提升最终结果的相关性精度。对于高标准检索场景,建议在 Pinecone 召回后加一层 Cohere Rerank 或 Sentence Transformers 做二次排序。
3. 缺少增量更新机制: 如果原始数据发生变化(比如文章内容修改),需要先删除旧向量再插入新向量,项目代码中没有覆盖这个场景。
4. 隐私合规: 所有文本数据在录入时会发送到 OpenAI API 生成 embedding,要确认你的数据合规政策允许这么做。对于医疗、金融等敏感行业,建议考虑 HuggingFace Inference Endpoints 部署本地 embedding 模型。
2023 年被称为「RAG 元年」,Retrieval-Augmented Generation(检索增强生成)成为 LLM 应用的主流架构。而 RAG 的第一步,就是把文档切成块、向量化、存进向量数据库——这个项目干的正是这件事。
它没有花哨的 LangChain 封装、没有复杂的 Agent 编排,只用了最少的依赖实现了最核心的功能。这种「最小化实现」的思路,反而让它成为学习语义搜索原理的最佳起点。无论你是 AI 初学者想理解 Embeddings 是什么,还是后端工程师想了解如何把向量数据库集成进现有系统,这个项目都值得 clone 下来跑一遍。