游乐游手机版
首页/AI教程/文章详情

向量嵌入与本地向量数据库:RAG核心实战指南

时间:2026-06-11 17:09
向量嵌入将文本转化为数值向量,语义相近则向量距离小。Chroma等本地向量数据库支持语义相似度检索,通过余弦相似度等计算向量距离,实现模糊匹配。部署Chroma需Docker启动服务,结合LangChain进行文本向量化存储与检索,支持元数据过滤等高级功能。

为什么需要向量嵌入?

做一个RAG应用,首当其冲要搞明白的就是向量嵌入。很多人一上来就掉进技术细节里,反而忘了最基础的问题:为什么非得用它?

计算机的"语言困境"

作为人类,我们天然理解文字的含义:

RAG 核心:向量嵌入与本地向量数据库实战

  • "猫" → 毛茸茸的、会喵喵叫、养来抓老鼠...
  • "狗" → 忠诚的、会看家、是人类的好朋友...

但对计算机来说,"猫"和"狗"只是两个字符串,它不知道它们有什么关系。

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)/(AB)`关注方向,值越接近1越相似
欧氏距离d = √Σ(ai - bi)²关注绝对距离,值越小越相似
点积A·B = Σai×bi结合方向和长度

Embedding 的应用场景

应用场景说明前端示例
语义搜索搜"手机"也能找到"智能手机"站内搜索、文档检索
相似推荐找到和当前内容最相似的内容相关文章推荐
分类聚类把相似的内容自动归类新闻自动分类
去重判断判断两段文字是否重复内容查重

向量嵌入原理深入

从文本到向量的转换流程

flowchart LRsubgraph 文本向量化流程direction LRA[原始文本

我爱编程]B[分词

我,爱,编程]C[Token ID

101,234,567,...]D[Embedding模型

Transformer编码器]E[向量数组

0.12, -0.34, 0.56,...]A --> BB --> CC --> DD --> Eend

传统数据库 vs 向量数据库

传统数据库存储的是精确值:

SELECT * FROM products WHERE name = '手机';-- 只能精确匹配

但如果你搜"手机",就搜不到"智能手机"。

向量数据库的优势:即使搜索词不完全一样,也能找到语义上相关的内容!

对比维度传统数据库向量数据库
查询方式精确匹配相似度匹配
返回结果满足条件的记录语义最相似的 Top-K
对模糊输入的容忍度
典型场景用户登录、订单查询语义搜索、推荐系统

本地轻量向量数据库部署

Chroma 简介

Chroma 是一款以 AI 为原生、开源的向量数据库,专注于开发者生产力和幸福感。它采用 Apache 2.0 许可,非常适合前端开发者快速上手。

Chroma 的核心优势:

特性说明
零配置启动无需复杂部署,开箱即用
轻量级内存存储,适合开发测试
LangChain 原生支持官方提供完整集成
元数据过滤支持结构化条件查询

Docker 部署(推荐)

# 拉取 Chroma 镜像docker pull chromadb/chroma# 运行容器docker run -d -p 8000:8000 chromadb/chroma

启动成功后,服务运行在 https://localhost:8000

npm 安装与配置

# 安装 LangChain Chroma 集成包npm install @langchain/community chromadb @langchain/openai# 如果使用阿里云百炼 Embedding,还需安装npm install @langchain/openai

本地连接配置

// 本地 Chroma 连接配置import { Chroma } from "@langchain/community/vectorstores/chroma";import { OpenAIEmbeddings } from "@langchain/openai";const embeddings = new OpenAIEmbeddings({model: "text-embedding-v3",apiKey: process.env.BAILIAN_API_KEY,configuration: {baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",},});const vectorStore = new Chroma(embeddings, {collectionName: "my_knowledge_base",url: "https://localhost:8000",// Docker 服务地址});

文本向量化存储代码实战

完整 TS 实现

// src/vector-store-demo.tsimport { OpenAIEmbeddings } from "@langchain/openai";import { Chroma } from "@langchain/community/vectorstores/chroma";import { Document } from "@langchain/core/documents";import dotenv from "dotenv";dotenv.config();// 1. 初始化 Embedding 模型(阿里云百炼)const embeddings = new OpenAIEmbeddings({apiKey: process.env.BAILIAN_API_KEY,configuration: {baseURL: process.env.BAILIAN_BASE_URL,},model: "text-embedding-v3",// 阿里云百炼模型});// 2. 准备文档数据const documents: 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. 创建向量存储并添加文档async function createVectorStore() {console.log("? 正在创建向量数据库...");const vectorStore = await Chroma.fromDocuments(documents,embeddings,{collectionName: "rag_knowledge_base",url: "https://localhost:8000",// Chroma 服务地址});console.log("✅ 向量数据库创建成功!");console.log(`? 已存储 ${documents.length} 个文档块n`);return vectorStore;}// 4. 执行相似度检索async function searchSimilar(vectorStore: Chroma, query: string) {console.log(`? 查询: "${query}"n`);const results = await vectorStore.similaritySearch(query, 2);console.log("? 检索结果(按相似度排序):");results.forEach((doc, idx) => {console.log(`n${idx + 1}. [相似度排名${idx + 1}]`);console.log(` 内容: ${doc.pageContent.slice(0, 100)}...`);console.log(` 来源: ${doc.metadata.source}`);});return results;}// 5. 带分数返回的检索async function searchWithScore(vectorStore: Chroma, query: string) {const resultsWithScore = await vectorStore.similaritySearchWithScore(query, 2);console.log("n? 检索结果(含相似度分数):");resultsWithScore.forEach(([doc, score], idx) => {console.log(`n${idx + 1}. 相似度: ${score.toFixed(4)}`);console.log(` 内容: ${doc.pageContent.slice(0, 80)}...`);});return resultsWithScore;}// 主函数async function main() {try {// 创建向量存储const vectorStore = await createVectorStore();// 测试检索await searchSimilar(vectorStore, "什么是RAG技术?");await searchWithScore(vectorStore, "如何解决大模型幻觉");} catch (error) {console.error("❌ 错误:", error);}}main();

使用过滤器的高级检索

// 带元数据过滤的检索async function searchWithFilter(vectorStore: Chroma) {const filter = { topic: "向量数据库" };const results = await vectorStore.similaritySearch("向量存储",2,filter// 只检索 topic 为"向量数据库"的文档);console.log("? 带过滤条件的检索结果:");results.forEach((doc, idx) => {console.log(`${idx + 1}. ${doc.pageContent.slice(0, 80)}...`);});}

批量添加文档

// 批量添加文档(支持自定义 ID)async function batchAddDocuments(vectorStore: Chroma) {const newDocs: Document[] = [{ pageContent: "Chroma 是一款开源的向量数据库...", metadata: { type: "intro" } },{ pageContent: "LangChain 提供了丰富的向量存储集成...", metadata: { type: "tutorial" } },];const ids = await vectorStore.addDocuments(newDocs, { ids: ["doc_001", "doc_002"] });console.log(`✅ 已添加 ${ids.length} 个文档,ID: ${ids.join(", ")}`);}

删除文档

// 按 ID 删除文档async function deleteDocument(vectorStore: Chroma) {await vectorStore.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复用现有基础设施

常见问题与解决方案

问题 1:Embedding 模型调用失败

现象:401 UnauthorizedInvalidApiKey

解决方案:

  • 检查 API Key 是否正确
  • 确认 Base URL 是 https://dashscope.aliyuncs.com/compatible-mode/v1
  • 确认模型名称正确(text-embedding-v3

问题 2:Chroma 连接失败

现象:ECONNREFUSED 连接错误

解决方案:

# 检查 Chroma 服务是否运行curl https://localhost:8000/api/v1/heartbeat# 如果未运行,启动 Docker 容器docker run -d -p 8000:8000 chromadb/chroma

问题 3:向量检索结果不相关

现象:检索到的内容与查询语义不匹配

解决方案:

  • 检查 Embedding 模型是否与检索时一致
  • 增加文档块的重叠度
  • 调整检索的 k 值(返回数量)
  • 使用 similaritySearchWithScore 查看相似度分数,评估检索质量

问题 4:添加文档时向量维度不匹配

现象:dimension mismatch 错误

解决方案:

  • 确保所有文档使用相同的 Embedding 模型
  • 检查是否在创建 Collection 时指定了正确的维度

// 创建时明确指定维度const vectorStore = new Chroma(embeddings, {collectionName: "my_collection",numDimensions: 1024,// 与 text-embedding-v3 匹配});

结语

通过这篇教程,我们深入学习了向量嵌入的原理和向量数据库的实践用法。从计算机如何理解语义,到用Chrom搭建本地向量库,再到完整的TypeScript代码实战——每一步都踩在了实际开发的关键点上。选型建议和常见问题的梳理,希望能让你在后续项目中少走弯路。

对于文章中错误的地方或有任何疑问,欢迎在评论区留言讨论!

来源:https://juejin.cn/post/7648967155560054847
上一篇每天收藏文章却不看?ima助你真正用知识 下一篇ima copilot一句话生成报告播客PPT三种形态
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
AI人工智能课程复习重点与考点提纲
AI教程 · 2026-06-14

AI人工智能课程复习重点与考点提纲

这份人工智能(AI)课程复习提纲,已将核心知识点与重点概念梳理得清晰明了。若想更顺畅地查看数学公式,建议搭配Chrome浏览器中的Latex渲染插件使用,阅读体验将得到显著提升,复习效率也会更高。

如何系统学习人工智能AI技术入门指南
AI教程 · 2026-06-14

如何系统学习人工智能AI技术入门指南

人工智能学习指南:如何系统掌握AI技术 想系统学习人工智能AI技术?本文为你梳理了从基础到进阶的完整学习路径与实用资源。 重磅推荐:最完备的AI学习路线图与详尽资源整理,助你高效入门

人工智能就业方向与AI岗位详解
AI教程 · 2026-06-14

人工智能就业方向与AI岗位详解

人工智能已成为当今科技发展的核心主线,这一点早已毋庸置疑。随着AI技术不断渗透到各行各业,相关岗位的职业前景也随之水涨船高。那么,学习人工智能究竟能从事哪些工作?市面上有哪些具体的AI相关职位?以下为您详细解析。 1、数据科学家 数据科学家并非传统意义上的统计学家或数据分析师,其核心职责是运用科学方

揭秘人工智能走向大众的深层次驱动力
AI教程 · 2026-06-14

揭秘人工智能走向大众的深层次驱动力

人脸识别、语音识别、自动驾驶——这些关键词正在成为我们日常对话中的高频词汇。不知不觉间,人工智能(AI)与人类社会的融合,已经从实验室的概念渗透到了生活的毛细血管。 这个“术语”最早可以追溯到1956年。然而,在随后的几十年里,受限于昂贵的算力、尚不成熟的计算方法,以及极其匮乏的数据量,“模拟人类大

人工智能AI核心技术解析
AI教程 · 2026-06-14

人工智能AI核心技术解析

人工智能(AI)的发展史,说起来可不是一蹴而就的。它跨越了将近一个世纪,一路融合了数学、计算机科学、神经科学等多个学科的心血。下面咱们就按几个关键阶段,把这段波澜壮阔的历程捋一捋。 一、萌芽期(1940s-1950s):概念诞生与理论奠基 这个阶段主要是“播种”——从理论到概念的成型。 1943年: