بنقرة واحدة
langchain-vector-stores
LangChain 向量存储集成使用指南,包括 Chroma、Pinecone、FAISS 和内存向量存储
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
LangChain 向量存储集成使用指南,包括 Chroma、Pinecone、FAISS 和内存向量存储
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Mac 系统深度清理和优化工具。使用 Mole (mo 命令) 执行系统清理、磁盘分析、应用卸载、系统优化等任务。 触发场景(当用户提到以下任一内容时使用此 skill): - 清理 Mac、清理磁盘、释放空间、清理缓存、清理系统 - 卸载应用、删除应用、移除应用及其残留 - 磁盘分析、查看磁盘占用、大文件查找、空间分析 - 系统优化、系统维护、刷新系统、重建缓存 - 系统状态、系统监控、CPU/内存/磁盘监控 - 清理 node_modules、清理构建产物、清理项目依赖 - 清理安装包、删除 dmg/pkg 文件 - Mac 清理工具、类似 CleanMyMac 的功能 - "我的 Mac 太慢了"、"磁盘空间不足"、"电脑卡顿" - 即使没有明确说 "Mole",只要涉及上述场景就应使用
快速搭建和配置 pnpm monorepo 项目结构,包含 TypeScript、tsup 构建、私有 npm registry 配置。当用户需要"创建 monorepo"、"初始化 monorepo 项目"、"配置 pnpm workspace"、"设置 monorepo 构建"、"monorepo setup"时使用。特别适合需要统一管理多个包、配置构建工具、处理 TypeScript 路径问题的场景。即使用户只是说"帮我搭建项目结构"或"配置构建",如果涉及多包管理也应该使用此 skill。
智能拆分暂存区的代码变更为多个符合 Conventional Commits 规范的逻辑提交。当用户需要将大量变更按逻辑关系分组提交时使用,比如"拆分这些提交"、"把暂存区的变更分成多个 commit"、"按功能分别提交"、"split commits"等场景。特别适合处理包含多个模块、多种类型文件(配置、代码、测试、文档)的复杂变更集。
OKR 优化与质量评估专家。当用户需要:(1) 评估现有 OKR 的质量,(2) 优化模糊或不可量化的关键结果,(3) 检查 OKR 是否符合核心原则(聚焦、可量化、有挑战),(4) 将任务型 KR 转化为结果型 KR,(5) 提供具体的改进建议时使用。触发词包括"帮我优化 OKR"、"检查这个 OKR"、"这个 KR 写得好吗"、"如何量化这个目标"。
基于 git commits 自动生成 CHANGELOG.md 变更日志。支持语义化版本、分类整理、多格式输出。触发场景包括"生成变更日志"、"更新 CHANGELOG"、"版本记录"。
GitHub PR 代码审查技能。检查代码质量、安全性、性能和最佳实践,生成结构化审查报告。触发场景包括"审查 PR"、"代码检查"、"review pull request"。
| name | langchain-vector-stores |
| description | LangChain 向量存储集成使用指南,包括 Chroma、Pinecone、FAISS 和内存向量存储 |
| language | js |
向量存储是经过优化的数据库,用于存储和搜索高维向量(嵌入)。它们通过基于向量相似度而非关键字匹配来查找相似文档,从而实现语义搜索。对于 RAG(检索增强生成)系统至关重要。
| 向量存储 | 最适用于 | 包 | 持久化 | 可扩展性 | 主要特性 |
|---|---|---|---|---|---|
| FAISS | 本地、高性能 | @langchain/community | 磁盘 | 中等 | 快速、支持 CPU/GPU、本地 |
| Chroma | 开发、简单 | @langchain/community | 磁盘 | 中等 | 易于设置、本地优先、Python API |
| Pinecone | 生产环境、托管 | @langchain/pinecone | 云 | 高 | 完全托管、自动扩展、免运维 |
| Memory | 测试、原型 | langchain/vectorstores/memory | 仅内存 | 低 | 简单、无设置、临时 |
| Weaviate | GraphQL、混合搜索 | @langchain/weaviate | 云/自托管 | 高 | GraphQL、混合搜索、模块化 |
| Qdrant | 高性能、过滤 | @langchain/qdrant | 云/自托管 | 高 | 快速、高级过滤、基于 Rust |
| Supabase | PostgreSQL 用户 | @langchain/community | 云/自托管 | 高 | PostgreSQL 扩展、熟悉的工具 |
选择 FAISS 如果:
选择 Chroma 如果:
选择 Pinecone 如果:
选择内存向量存储如果:
选择 Weaviate/Qdrant 如果:
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
// 内存向量存储 - 适合测试
const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings());
// 添加文档
await vectorStore.addDocuments([
{ pageContent: "LangChain is a framework for LLM apps", metadata: { source: "docs" } },
{ pageContent: "Vector stores enable semantic search", metadata: { source: "docs" } },
{ pageContent: "Paris is the capital of France", metadata: { source: "wiki" } },
]);
// 相似度搜索
const results = await vectorStore.similaritySearch("What is LangChain?", 2);
console.log(results);
// 带分数的搜索
const resultsWithScore = await vectorStore.similaritySearchWithScore("LangChain", 2);
resultsWithScore.forEach(([doc, score]) => {
console.log(`Score: ${score}, Content: ${doc.pageContent}`);
});
import { FaissStore } from "@langchain/community/vectorstores/faiss";
import { OpenAIEmbeddings } from "@langchain/openai";
const embeddings = new OpenAIEmbeddings();
// 从文档创建
const vectorStore = await FaissStore.fromDocuments(
[
{ pageContent: "Document 1 content", metadata: { id: 1 } },
{ pageContent: "Document 2 content", metadata: { id: 2 } },
],
embeddings
);
// 搜索
const results = await vectorStore.similaritySearch("query", 3);
// 保存到磁盘
await vectorStore.save("./faiss_index");
// 从磁盘加载
const loadedStore = await FaissStore.load("./faiss_index", embeddings);
import { Chroma } from "@langchain/community/vectorstores/chroma";
import { OpenAIEmbeddings } from "@langchain/openai";
// 需要运行 Chroma 服务器:docker run -p 8000:8000 chromadb/chroma
const vectorStore = await Chroma.fromDocuments(
[
{ pageContent: "Text 1", metadata: { category: "A" } },
{ pageContent: "Text 2", metadata: { category: "B" } },
],
new OpenAIEmbeddings(),
{
collectionName: "my-collection",
url: "http://localhost:8000", // Chroma 服务器 URL
}
);
// 带元数据过滤器的搜索
const results = await vectorStore.similaritySearch("query", 3, {
category: "A"
});
// 删除集合
await vectorStore.delete({ collectionName: "my-collection" });
import { PineconeStore } from "@langchain/pinecone";
import { Pinecone } from "@pinecone-database/pinecone";
import { OpenAIEmbeddings } from "@langchain/openai";
// 初始化 Pinecone 客户端
const pinecone = new Pinecone({
apiKey: process.env.PINECONE_API_KEY,
});
const pineconeIndex = pinecone.Index("my-index");
// 创建向量存储
const vectorStore = await PineconeStore.fromDocuments(
[
{ pageContent: "Content 1", metadata: { topic: "tech" } },
{ pageContent: "Content 2", metadata: { topic: "science" } },
],
new OpenAIEmbeddings(),
{
pineconeIndex,
maxConcurrency: 5,
}
);
// 带元数据过滤器的搜索
const results = await vectorStore.similaritySearch("query", 3, {
topic: "tech"
});
// 作为检索器使用
const retriever = vectorStore.asRetriever({
k: 5,
searchType: "similarity",
});
const docs = await retriever.getRelevantDocuments("query");
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings());
// 一次或批量添加文档
await vectorStore.addDocuments([
{ pageContent: "Document 1", metadata: {} },
]);
// 稍后添加更多
await vectorStore.addDocuments([
{ pageContent: "Document 2", metadata: {} },
{ pageContent: "Document 3", metadata: {} },
]);
// 或从文本添加
await vectorStore.addTexts(
["Text 1", "Text 2"],
[{ source: "A" }, { source: "B" }]
);
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
const vectorStore = await MemoryVectorStore.fromDocuments(
documents,
new OpenAIEmbeddings()
);
// 转换为检索器
const retriever = vectorStore.asRetriever({
k: 4, // 返回前 4 个结果
searchType: "similarity", // 或 "mmr" 用于最大边际相关性
});
// 在链中使用
import { ChatOpenAI } from "@langchain/openai";
import { createRetrievalChain } from "langchain/chains/retrieval";
import { createStuffDocumentsChain } from "langchain/chains/combine_documents";
import { ChatPromptTemplate } from "@langchain/core/prompts";
const llm = new ChatOpenAI();
const prompt = ChatPromptTemplate.fromTemplate(`
Answer based on context:
{context}
Question: {input}
`);
const combineDocsChain = await createStuffDocumentsChain({ llm, prompt });
const chain = await createRetrievalChain({
retriever,
combineDocsChain,
});
const result = await chain.invoke({ input: "What is LangChain?" });
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
const vectorStore = await MemoryVectorStore.fromTexts(
["text1", "text2", "text3"],
[{}, {}, {}],
new OpenAIEmbeddings()
);
// MMR 平衡相关性和多样性
const results = await vectorStore.maxMarginalRelevanceSearch("query", {
k: 3,
fetchK: 10, // 获取 10 个候选,返回 3 个多样化结果
lambda: 0.5, // 0 = 最大多样性,1 = 最大相关性
});
✅ 初始化向量存储
✅ 添加和查询文档
✅ 持久化和加载
✅ 作为检索器使用
✅ 选择适当的存储
❌ 混合来自不同模型的嵌入
❌ 绕过提供程序限制
❌ 在创建后修改向量维度
❌ 在没有正确设置的情况下查询
// ❌ 错误:为索引和查询使用不同的嵌入
const store1 = await MemoryVectorStore.fromDocuments(
docs,
new OpenAIEmbeddings({ model: "text-embedding-3-small" })
);
const results = await store1.similaritySearch("query"); // 使用相同的嵌入 ✓
// 但如果重新创建:
const store2 = new MemoryVectorStore(
new OpenAIEmbeddings({ model: "text-embedding-ada-002" }) // 不同!
);
// 查询将无法正常工作!
// ✅ 正确:保持嵌入实例
const embeddings = new OpenAIEmbeddings({ model: "text-embedding-3-small" });
const store = await MemoryVectorStore.fromDocuments(docs, embeddings);
// 始终使用相同的嵌入实例
修复方法:为创建和查询使用相同的嵌入模型实例。
// ❌ Chroma 未运行
import { Chroma } from "@langchain/community/vectorstores/chroma";
const store = await Chroma.fromDocuments(docs, embeddings, {
url: "http://localhost:8000"
});
// 错误:连接被拒绝!
// ✅ 先启动 Chroma
// 终端:docker run -p 8000:8000 chromadb/chroma
// 或:chroma run --path ./chroma_data
const store = await Chroma.fromDocuments(docs, embeddings, {
url: "http://localhost:8000"
}); // 可以工作!
修复方法:在创建向量存储之前确保 Chroma 服务器正在运行。
// ❌ 索引不存在
import { Pinecone } from "@pinecone-database/pinecone";
const pinecone = new Pinecone({ apiKey: process.env.PINECONE_API_KEY });
const index = pinecone.Index("nonexistent-index"); // 不会创建索引!
// ✅ 先创建索引
// 在 Pinecone 控制台或通过 API 执行此操作
const pinecone = new Pinecone({ apiKey: process.env.PINECONE_API_KEY });
// 检查索引是否存在,如需要则创建
const indexList = await pinecone.listIndexes();
if (!indexList.indexes?.some(idx => idx.name === "my-index")) {
await pinecone.createIndex({
name: "my-index",
dimension: 1536, // 必须匹配嵌入维度
metric: "cosine",
spec: { serverless: { cloud: "aws", region: "us-east-1" } }
});
}
const index = pinecone.Index("my-index");
修复方法:在使用前创建 Pinecone 索引。
// ❌ 相对路径问题
await vectorStore.save("./index"); // 可能根据当前工作目录失败
// ✅ 使用绝对路径或明确指定
import path from "path";
const indexPath = path.join(process.cwd(), "data", "faiss_index");
await vectorStore.save(indexPath);
// 使用相同路径加载
const loadedStore = await FaissStore.load(indexPath, embeddings);
修复方法:使用绝对路径或注意当前工作目录。
// ❌ 期望持久化
const vectorStore = new MemoryVectorStore(embeddings);
await vectorStore.addDocuments(docs);
// 应用重启...
// 所有数据丢失!
// ✅ 在生产中使用持久化存储
import { FaissStore } from "@langchain/community/vectorstores/faiss";
const vectorStore = await FaissStore.fromDocuments(docs, embeddings);
await vectorStore.save("./faiss_index"); // 持久化到磁盘
修复方法:对于持久化数据,使用 FAISS、Chroma 或云存储(Pinecone)。
// 不同的存储有不同的过滤语法
// Pinecone
const pineconeResults = await pineconeStore.similaritySearch("query", 3, {
category: "tech" // 简单的键值
});
// Chroma
const chromaResults = await chromaStore.similaritySearch("query", 3, {
where: { category: "tech" } // 嵌套结构
});
// 查看每个存储的文档以了解过滤语法!
修复方法:阅读特定向量存储的文档以了解过滤语法。
// ❌ 使用错误的维度创建 Pinecone 索引
await pinecone.createIndex({
name: "my-index",
dimension: 1536, // OpenAI ada-002 维度
});
// 但使用不同的嵌入!
const store = await PineconeStore.fromDocuments(
docs,
new OpenAIEmbeddings({ model: "text-embedding-3-small", dimensions: 512 }),
{ pineconeIndex }
); // 错误:维度不匹配!
// ✅ 匹配维度
const embeddings = new OpenAIEmbeddings({ model: "text-embedding-3-small" });
// 默认为 1536,匹配 Pinecone 索引
修复方法:确保向量存储维度配置与嵌入维度匹配。
# 社区包(包括 FAISS、Chroma 等)
npm install @langchain/community
# Pinecone
npm install @langchain/pinecone @pinecone-database/pinecone
# Weaviate
npm install @langchain/weaviate weaviate-ts-client
# Qdrant
npm install @langchain/qdrant @qdrant/js-client-rest