本概述涵盖基于文本的嵌入模型。LangChain 目前不支持多模态嵌入。
嵌入模型将原始文本——如句子、段落或推文——转换为捕捉其语义的固定长度数字向量。这些向量让机器能够基于语义而非确切词语来比较和搜索文本。
在实践中,这意味着具有相似概念的文本会在向量空间中彼此靠近。例如,嵌入不仅仅是匹配“machine learning”这个短语,还能检索到讨论相关概念的文档,即使使用了不同的措辞。
工作原理
- 向量化 — 模型将每个输入字符串编码为一个高维向量。
- 相似度评分 — 使用数学指标对向量进行比较,以衡量底层文本的关联程度。
相似度指标
比较嵌入时常用的几种指标:
- 余弦相似度 — 衡量两个向量之间的夹角。
- 欧几里得距离 — 衡量点之间的直线距离。
- 点积 — 衡量一个向量在另一个向量上的投影程度。
LangChain provides a standard interface for text embedding models (e.g., OpenAI, Cohere, Hugging Face) via the Embeddings interface.
主要有两种方法:
embedDocuments(documents: string[]) → number[][]: 嵌入文档列表。
embedQuery(text: string) → number[]: 嵌入单个查询。
该接口支持采用不同策略对查询和文档进行嵌入,不过实际上大多数提供商都以相同的方式处理。
安装和使用
安装依赖:添加环境变量:OPENAI_API_KEY=your-api-key
实例化模型:import { OpenAIEmbeddings } from "@langchain/openai";
const embeddings = new OpenAIEmbeddings({
model: "text-embedding-3-large"
});
安装依赖添加环境变量:AZURE_OPENAI_API_INSTANCE_NAME=<YOUR_INSTANCE_NAME>
AZURE_OPENAI_API_KEY=<YOUR_KEY>
AZURE_OPENAI_API_VERSION="2024-02-01"
实例化模型:import { AzureOpenAIEmbeddings } from "@langchain/openai";
const embeddings = new AzureOpenAIEmbeddings({
azureOpenAIApiEmbeddingsDeploymentName: "text-embedding-ada-002"
});
安装依赖项:添加环境变量:BEDROCK_AWS_REGION=your-region
实例化模型:import { BedrockEmbeddings } from "@langchain/aws";
const embeddings = new BedrockEmbeddings({
model: "amazon.titan-embed-text-v1"
});
安装依赖:npm i @langchain/google-genai
添加环境变量:GOOGLE_API_KEY=your-api-key
实例化模型:import { GoogleGenerativeAIEmbeddings } from "@langchain/google-genai";
const embeddings = new GoogleGenerativeAIEmbeddings({
model: "text-embedding-004"
});
安装依赖:npm i @langchain/google-vertexai
添加环境变量:GOOGLE_APPLICATION_CREDENTIALS=credentials.json
实例化模型:import { VertexAIEmbeddings } from "@langchain/google-vertexai";
const embeddings = new VertexAIEmbeddings({
model: "gemini-embedding-001"
});
安装依赖:npm i @langchain/mistralai
添加环境变量:MISTRAL_API_KEY=your-api-key
实例化模型:import { MistralAIEmbeddings } from "@langchain/mistralai";
const embeddings = new MistralAIEmbeddings({
model: "mistral-embed"
});
安装依赖:添加环境变量:COHERE_API_KEY=your-api-key
实例化模型:import { CohereEmbeddings } from "@langchain/cohere";
const embeddings = new CohereEmbeddings({
model: "embed-english-v3.0"
});
安装依赖:实例化模型:import { OllamaEmbeddings } from "@langchain/ollama";
const embeddings = new OllamaEmbeddings({
model: "llama2",
baseUrl: "http://localhost:11434", // Default value
});
嵌入可以存储或临时缓存,以避免重复计算。
缓存嵌入可以使用 CacheBackedEmbeddings 来实现。这个包装器将嵌入存储在键值存储中,其中文本会被哈希处理,并且哈希值被用作缓存中的键。
初始化一个 CacheBackedEmbeddings 的主要支持方式是 fromBytesStore。它接受以下参数:
- underlyingEmbeddings: 用于嵌入的嵌入器。
- documentEmbeddingStore: 任何用于缓存文档嵌入的
BaseStore。
- options.namespace: (可选,默认为
"")用于文档缓存的命名空间。有助于避免冲突(例如,设置为嵌入模型名称)。
import { CacheBackedEmbeddings } from "@langchain/classic/embeddings/cache_backed";
import { InMemoryStore } from "@langchain/core/stores";
const underlyingEmbeddings = new OpenAIEmbeddings();
const inMemoryStore = new InMemoryStore();
const cacheBackedEmbeddings = CacheBackedEmbeddings.fromBytesStore(
underlyingEmbeddings,
inMemoryStore,
{
namespace: underlyingEmbeddings.model,
}
);
// Example: caching a query embedding
const tic = Date.now();
const queryEmbedding = cacheBackedEmbeddings.embedQuery("Hello, world!");
console.log(`First call took: ${Date.now() - tic}ms`);
// Example: caching a document embedding
const tic = Date.now();
const documentEmbedding = cacheBackedEmbeddings.embedDocuments(["Hello, world!"]);
console.log(`Cached creation time: ${Date.now() - tic}ms`);
在生产环境中,通常会使用更健壮的持久化存储,例如数据库或云存储。请参阅 存储集成 了解可用选项。
所有集成