一键导入
langchain-embeddings
使用 LangChain 中的嵌入模型集成指南,包括 OpenAI、Azure 和本地嵌入
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
使用 LangChain 中的嵌入模型集成指南,包括 OpenAI、Azure 和本地嵌入
用 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-embeddings |
| description | 使用 LangChain 中的嵌入模型集成指南,包括 OpenAI、Azure 和本地嵌入 |
| language | js |
嵌入模型将文本转换为捕获语义含义的数值向量表示。这些向量支持语义搜索、相似性比较,并且是使用向量数据库构建 RAG(检索增强生成)系统的关键。
| 提供商 | 最适合 | 模型示例 | 维度 | 包 | 主要特性 |
|---|---|---|---|---|---|
| OpenAI | 通用、高质量 | text-embedding-3-small、text-embedding-3-large、text-embedding-ada-002 | 1536、3072 | @langchain/openai | 高质量、可靠、灵活的维度 |
| Azure OpenAI | 企业、合规性 | text-embedding-ada-002 (Azure) | 1536 | @langchain/openai | 企业 SLA、数据驻留 |
| Cohere | 多语言、搜索优化 | embed-english-v3.0、embed-multilingual-v3.0 | 1024 | @langchain/cohere | 搜索/聚类模式、多语言 |
| HuggingFace | 开源、可定制 | all-MiniLM-L6-v2、BGE 模型 | 可变 | @langchain/community | 免费、本地推理、许多模型 |
| GCP 集成 | textembedding-gecko | 768 | @langchain/google-genai | GCP 生态系统、多模态 | |
| Ollama | 本地、隐私 | llama2、mistral、nomic-embed-text | 可变 | @langchain/ollama | 完全本地、无 API 成本、隐私 |
选择 OpenAI 如果:
选择 Azure OpenAI 如果:
选择 Cohere 如果:
选择 HuggingFace 如果:
选择 Ollama 如果:
import { OpenAIEmbeddings } from "@langchain/openai";
// 基本初始化
const embeddings = new OpenAIEmbeddings({
modelName: "text-embedding-3-small",
openAIApiKey: process.env.OPENAI_API_KEY, // 如果在 env 中设置则可选
});
// 嵌入单个查询
const queryEmbedding = await embeddings.embedQuery(
"法国的首都是什么?"
);
console.log(`向量维度:${queryEmbedding.length}`);
console.log(`前几个值:${queryEmbedding.slice(0, 5)}`);
// 嵌入多个文档
const documents = [
"巴黎是法国的首都。",
"伦敦是英国的首都。",
"柏林是德国的首都。",
];
const docEmbeddings = await embeddings.embedDocuments(documents);
console.log(`嵌入了 ${docEmbeddings.length} 个文档`);
// 使用具有自定义维度的较新模型
const smallEmbeddings = new OpenAIEmbeddings({
modelName: "text-embedding-3-small",
dimensions: 512, // 从默认的 1536 减少以提高效率
});
import { AzureOpenAIEmbeddings } from "@langchain/openai";
const embeddings = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,
azureOpenAIApiInstanceName: process.env.AZURE_OPENAI_API_INSTANCE_NAME,
azureOpenAIApiEmbeddingsDeploymentName: "text-embedding-ada-002",
azureOpenAIApiVersion: "2024-02-01",
});
const embedding = await embeddings.embedQuery("你好世界");
import { HuggingFaceTransformersEmbeddings } from "@langchain/community/embeddings/hf_transformers";
// 使用 Transformers.js 在本地运行嵌入
const embeddings = new HuggingFaceTransformersEmbeddings({
modelName: "Xenova/all-MiniLM-L6-v2",
});
const embedding = await embeddings.embedQuery("这在本地运行!");
import { OllamaEmbeddings } from "@langchain/ollama";
// 需要在本地运行 Ollama:ollama pull nomic-embed-text
const embeddings = new OllamaEmbeddings({
model: "nomic-embed-text",
baseUrl: "http://localhost:11434", // 默认 Ollama URL
});
const embedding = await embeddings.embedQuery("完全本地嵌入");
import { CohereEmbeddings } from "@langchain/cohere";
const embeddings = new CohereEmbeddings({
apiKey: process.env.COHERE_API_KEY,
model: "embed-english-v3.0",
inputType: "search_query", // 或 "search_document"、"classification"、"clustering"
});
const queryEmbedding = await embeddings.embedQuery("搜索查询");
const docEmbeddings = await embeddings.embedDocuments(["doc1", "doc2"]);
import { OpenAIEmbeddings } from "@langchain/openai";
const embeddings = new OpenAIEmbeddings();
// 嵌入查询和文档
const query = "什么是机器学习?";
const docs = [
"机器学习是 AI 的一个分支",
"巴黎是法国的首都",
"神经网络在深度学习中使用",
];
const queryVec = await embeddings.embedQuery(query);
const docVecs = await embeddings.embedDocuments(docs);
// 计算余弦相似性
function cosineSimilarity(vecA: number[], vecB: number[]): number {
const dotProduct = vecA.reduce((sum, a, i) => sum + a * vecB[i], 0);
const magnitudeA = Math.sqrt(vecA.reduce((sum, a) => sum + a * a, 0));
const magnitudeB = Math.sqrt(vecB.reduce((sum, b) => sum + b * b, 0));
return dotProduct / (magnitudeA * magnitudeB);
}
// 查找最相似的文档
const similarities = docVecs.map((docVec) =>
cosineSimilarity(queryVec, docVec)
);
console.log("相似性:", similarities);
const mostSimilarIdx = similarities.indexOf(Math.max(...similarities));
console.log("最相似的文档:", docs[mostSimilarIdx]);
import { OpenAIEmbeddings } from "@langchain/openai";
const embeddings = new OpenAIEmbeddings({
batchSize: 512, // OpenAI 允许在一个请求中最多 2048 个
});
// 高效地嵌入大文档集
const largeDocSet = Array.from({ length: 1000 }, (_, i) =>
`文档 ${i}:一些内容在这里`
);
const docEmbeddings = await embeddings.embedDocuments(largeDocSet);
console.log(`批量嵌入了 ${docEmbeddings.length} 个文档`);
✅ 初始化嵌入模型
✅ 嵌入文本内容
embedQuery() 嵌入单个查询embedDocuments() 嵌入多个文档✅ 将嵌入与向量存储一起使用
✅ 选择适当的模型
✅ 针对用例优化
❌ 任意修改嵌入维度
❌ 混合来自不同模型的嵌入
❌ 超过 API 速率限制
❌ 在没有适当身份验证的情况下生成嵌入
// ❌ 错误:使用不同的模型
const embeddings1 = new OpenAIEmbeddings({
modelName: "text-embedding-3-small"
});
const embeddings2 = new OpenAIEmbeddings({
modelName: "text-embedding-ada-002"
});
const queryVec = await embeddings1.embedQuery("query");
const docVec = await embeddings2.embedQuery("document");
// 相似性比较将毫无意义!
// ✅ 正确:对所有内容使用相同模型
const embeddings = new OpenAIEmbeddings({
modelName: "text-embedding-3-small"
});
const queryVec = await embeddings.embedQuery("query");
const docVec = await embeddings.embedQuery("document");
// 现在相似性有意义
修复:始终对要比较的所有文本使用相同的嵌入模型。
// ❌ 文档太多可能导致 API 错误
const embeddings = new OpenAIEmbeddings();
const hugeDocs = Array(5000).fill("text");
await embeddings.embedDocuments(hugeDocs); // 可能失败!
// ✅ 配置适当的批量大小
const embeddings = new OpenAIEmbeddings({
batchSize: 512, // OpenAI 限制是 2048,使用较小的以确保安全
});
await embeddings.embedDocuments(hugeDocs); // 自动处理批量处理
修复:为提供商设置适当的 batchSize 参数。
// ❌ 硬编码 API 密钥
const embeddings = new OpenAIEmbeddings({
openAIApiKey: "sk-...", // 永远不要提交这个!
});
// ✅ 使用环境变量
const embeddings = new OpenAIEmbeddings({
openAIApiKey: process.env.OPENAI_API_KEY,
});
// ✅ 更好:自动检测
const embeddings = new OpenAIEmbeddings();
// 自动从环境读取 OPENAI_API_KEY
修复:使用环境变量存储 API 密钥。
// ❌ 文本太长
const embeddings = new OpenAIEmbeddings();
const veryLongText = "...".repeat(100000);
await embeddings.embedQuery(veryLongText); // 会失败!
// ✅ 首先分块长文本
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 8000, // OpenAI 限制约为 8191 个令牌
});
const chunks = await splitter.splitText(veryLongText);
const embeddings = await embeddings.embedDocuments(chunks);
修复:在嵌入之前将长文本分块。大多数模型有 8k 令牌限制。
// ❌ Ollama 未运行
import { OllamaEmbeddings } from "@langchain/ollama";
const embeddings = new OllamaEmbeddings({ model: "nomic-embed-text" });
await embeddings.embedQuery("test"); // 连接错误!
// ✅ 确保 Ollama 正在运行并已拉取模型
// 终端:
// ollama pull nomic-embed-text
// ollama serve
const embeddings = new OllamaEmbeddings({ model: "nomic-embed-text" });
await embeddings.embedQuery("test"); // 有效!
修复:对于本地模型,确保服务正在运行并已下载模型。
// ❌ 缺少必填字段
const embeddings = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,
});
// ✅ 所有必填字段
const embeddings = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,
azureOpenAIApiInstanceName: "my-instance",
azureOpenAIApiEmbeddingsDeploymentName: "text-embedding-ada-002",
azureOpenAIApiVersion: "2024-02-01",
});
修复:Azure 需要实例名称、部署名称和 API 版本。
// ❌ 向量存储期望 1536 维度,模型产生 512
const embeddings = new OpenAIEmbeddings({
modelName: "text-embedding-3-small",
dimensions: 512,
});
// 使用默认 1536 维度创建的向量存储
const vectorStore = await MemoryVectorStore.fromTexts(
["text1"],
embeddings, // 不匹配!
);
// ✅ 一致的维度
const embeddings = new OpenAIEmbeddings({
modelName: "text-embedding-3-small",
// 不要覆盖维度,或确保向量存储匹配
});
修复:确保向量存储和嵌入使用兼容的维度。
# OpenAI
npm install @langchain/openai
# Cohere
npm install @langchain/cohere
# Ollama
npm install @langchain/ollama
# 社区 (HuggingFace 等)
npm install @langchain/community