
RAG 核心向量嵌入与本地向量数据库实战为什么需要向量嵌入计算机的语言困境Embedding 的核心思想向量距离的计算Embedding 的应用场景向量嵌入原理深入从文本到向量的转换流程传统数据库 vs 向量数据库本地轻量向量数据库部署Chroma 简介Docker 部署推荐npm 安装与配置本地连接配置文本向量化存储代码实战完整 TS 实现使用过滤器的高级检索批量添加文档删除文档向量数据库选型建议选型决策框架主流方案对比场景选型建议常见问题与解决方案问题 1Embedding 模型调用失败问题 2Chroma 连接失败问题 3向量检索结果不相关问题 4添加文档时向量维度不匹配结语为什么需要向量嵌入计算机的语言困境作为人类我们天然理解文字的含义“猫” → 毛茸茸的、会喵喵叫、养来抓老鼠…“狗” → 忠诚的、会看家、是人类的好朋友…但对计算机来说猫和狗只是两个字符串它不知道它们有什么关系。Embedding 的核心思想Embedding向量化的核心思想是把文字转换成一串数字向量。猫 → [0.12, -0.34, 0.56, 0.78, ...] (1024维向量) 狗 → [0.15, -0.31, 0.53, 0.80, ...] (1024维向量) 汽车→ [0.89, 0.12, -0.34, 0.21, ...] (1024维向量)关键规律如果两个向量的距离很近说明对应的文本在语义上也相似。向量距离的计算衡量两个向量远近的常用方法方法公式说明余弦相似度cos(θ) (A·B)/(A欧氏距离d √Σ(ai - bi)²关注绝对距离值越小越相似点积A·B Σai×bi结合方向和长度Embedding 的应用场景应用场景说明前端示例语义搜索搜手机也能找到智能手机站内搜索、文档检索相似推荐找到和当前内容最相似的内容相关文章推荐分类聚类把相似的内容自动归类新闻自动分类去重判断判断两段文字是否重复内容查重向量嵌入原理深入从文本到向量的转换流程文本向量化流程原始文本我爱编程分词我,爱,编程Token ID101,234,567,...Embedding模型Transformer编码器向量数组0.12, -0.34, 0.56,...传统数据库 vs 向量数据库传统数据库存储的是精确值SELECT*FROMproductsWHEREname手机;-- 只能精确匹配但如果你搜手机就搜不到智能手机。向量数据库的优势即使搜索词不完全一样也能找到语义上相关的内容对比维度传统数据库向量数据库查询方式精确匹配相似度匹配返回结果满足条件的记录语义最相似的 Top-K对模糊输入的容忍度低高典型场景用户登录、订单查询语义搜索、推荐系统本地轻量向量数据库部署Chroma 简介Chroma 是一款以 AI 为原生、开源的向量数据库专注于开发者生产力和幸福感。它采用 Apache 2.0 许可非常适合前端开发者快速上手。Chroma 的核心优势特性说明零配置启动无需复杂部署开箱即用轻量级内存存储适合开发测试LangChain 原生支持官方提供完整集成元数据过滤支持结构化条件查询Docker 部署推荐# 拉取 Chroma 镜像dockerpull chromadb/chroma# 运行容器dockerrun-d-p8000:8000 chromadb/chroma启动成功后服务运行在http://localhost:8000。npm 安装与配置# 安装 LangChain Chroma 集成包npminstalllangchain/community chromadb langchain/openai# 如果使用阿里云百炼 Embedding还需安装npminstalllangchain/openai本地连接配置// 本地 Chroma 连接配置import{Chroma}fromlangchain/community/vectorstores/chroma;import{OpenAIEmbeddings}fromlangchain/openai;constembeddingsnewOpenAIEmbeddings({model:text-embedding-v3,apiKey:process.env.BAILIAN_API_KEY,configuration:{baseURL:https://dashscope.aliyuncs.com/compatible-mode/v1,},});constvectorStorenewChroma(embeddings,{collectionName:my_knowledge_base,url:http://localhost:8000,// Docker 服务地址});文本向量化存储代码实战完整 TS 实现// src/vector-store-demo.tsimport{OpenAIEmbeddings}fromlangchain/openai;import{Chroma}fromlangchain/community/vectorstores/chroma;import{Document}fromlangchain/core/documents;importdotenvfromdotenv;dotenv.config();// 1. 初始化 Embedding 模型阿里云百炼constembeddingsnewOpenAIEmbeddings({apiKey:process.env.BAILIAN_API_KEY,configuration:{baseURL:process.env.BAILIAN_BASE_URL,},model:text-embedding-v3,// 阿里云百炼模型});// 2. 准备文档数据constdocuments:Document[][{pageContent:RAG检索增强生成是一种结合检索和生成的技术方案可以有效解决大模型幻觉问题。,metadata:{source:rag_intro.md,topic:RAG基础},},{pageContent:向量数据库专门用于存储和检索高维向量数据支持相似度搜索而非传统的关系型精确匹配。,metadata:{source:vector_db.md,topic:向量数据库},},{pageContent:Embedding 模型将文本转换为数值向量使得语义相似的文本在向量空间中距离更近。,metadata:{source:embedding.md,topic:嵌入模型},},];// 3. 创建向量存储并添加文档asyncfunctioncreateVectorStore(){console.log( 正在创建向量数据库...);constvectorStoreawaitChroma.fromDocuments(documents,embeddings,{collectionName:rag_knowledge_base,url:http://localhost:8000,// Chroma 服务地址});console.log(✅ 向量数据库创建成功);console.log( 已存储${documents.length}个文档块\n);returnvectorStore;}// 4. 执行相似度检索asyncfunctionsearchSimilar(vectorStore:Chroma,query:string){console.log( 查询: ${query}\n);constresultsawaitvectorStore.similaritySearch(query,2);console.log( 检索结果按相似度排序);results.forEach((doc,idx){console.log(\n${idx1}. [相似度排名${idx1}]);console.log(内容:${doc.pageContent.slice(0,100)}...);console.log(来源:${doc.metadata.source});});returnresults;}// 5. 带分数返回的检索asyncfunctionsearchWithScore(vectorStore:Chroma,query:string){constresultsWithScoreawaitvectorStore.similaritySearchWithScore(query,2);console.log(\n 检索结果含相似度分数);resultsWithScore.forEach(([doc,score],idx){console.log(\n${idx1}. 相似度:${score.toFixed(4)});console.log(内容:${doc.pageContent.slice(0,80)}...);});returnresultsWithScore;}// 主函数asyncfunctionmain(){try{// 创建向量存储constvectorStoreawaitcreateVectorStore();// 测试检索awaitsearchSimilar(vectorStore,什么是RAG技术);awaitsearchWithScore(vectorStore,如何解决大模型幻觉);}catch(error){console.error(❌ 错误:,error);}}main();使用过滤器的高级检索// 带元数据过滤的检索asyncfunctionsearchWithFilter(vectorStore:Chroma){constfilter{topic:向量数据库};constresultsawaitvectorStore.similaritySearch(向量存储,2,filter// 只检索 topic 为向量数据库的文档);console.log( 带过滤条件的检索结果);results.forEach((doc,idx){console.log(${idx1}.${doc.pageContent.slice(0,80)}...);});}批量添加文档// 批量添加文档支持自定义 IDasyncfunctionbatchAddDocuments(vectorStore:Chroma){constnewDocs:Document[][{pageContent:Chroma 是一款开源的向量数据库...,metadata:{type:intro}},{pageContent:LangChain 提供了丰富的向量存储集成...,metadata:{type:tutorial}},];constidsawaitvectorStore.addDocuments(newDocs,{ids:[doc_001,doc_002]});console.log(✅ 已添加${ids.length}个文档ID:${ids.join(, )});}删除文档// 按 ID 删除文档asyncfunctiondeleteDocument(vectorStore:Chroma){awaitvectorStore.delete({ids:[doc_001]});console.log(✅ 已删除指定文档);}向量数据库选型建议选型决策框架根据数据规模和场景需求选择合适的向量数据库开始 │ ├─ 数据规模 10万条 │ ├─ 是 → Chroma轻量级嵌入式 │ └─ 否 ↓ │ ├─ 数据规模 10万-500万条 │ ├─ 是 → Qdrant高性能独立部署 │ └─ 否 ↓ │ ├─ 数据规模 500万条 │ ├─ 是 → Milvus分布式集群 │ └─ 否 ↓ │ └─ 已有 PostgreSQL 基础设施 └─ 是 → pgvector数据库插件主流方案对比数据库架构模式性能混合搜索分布式适用场景Chroma轻量级嵌入式★★☆✗✗本地开发测试、POC验证Qdrant高性能独立★★★★✓✓实时推荐、复杂查询Milvus分布式集群★★★★★✓✓千万级生产环境pgvectorPostgreSQL扩展★★★有限✗已有PG基础设施场景选型建议使用场景推荐方案理由本地开发/学习Chroma零配置、开箱即用前端 Demo 项目Chroma轻量、集成简单中小企业生产Qdrant性能好、运维成本适中大规模生产环境Milvus分布式、高可用已有 PostgreSQLpgvector复用现有基础设施常见问题与解决方案问题 1Embedding 模型调用失败现象401 Unauthorized或InvalidApiKey解决方案检查 API Key 是否正确确认 Base URL 是https://dashscope.aliyuncs.com/compatible-mode/v1确认模型名称正确text-embedding-v3问题 2Chroma 连接失败现象ECONNREFUSED连接错误解决方案# 检查 Chroma 服务是否运行curlhttp://localhost:8000/api/v1/heartbeat# 如果未运行启动 Docker 容器dockerrun-d-p8000:8000 chromadb/chroma问题 3向量检索结果不相关现象检索到的内容与查询语义不匹配解决方案检查 Embedding 模型是否与检索时一致增加文档块的重叠度调整检索的k值返回数量使用similaritySearchWithScore查看相似度分数评估检索质量问题 4添加文档时向量维度不匹配现象dimension mismatch错误解决方案确保所有文档使用相同的 Embedding 模型检查是否在创建 Collection 时指定了正确的维度// 创建时明确指定维度constvectorStorenewChroma(embeddings,{collectionName:my_collection,numDimensions:1024,// 与 text-embedding-v3 匹配});结语通过这篇教程我们深入学习了向量嵌入的原理和向量数据库的实践用法。对于文章中错误的地方或有任何疑问欢迎在评论区留言讨论