بنقرة واحدة
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