Azure OpenAI 是一项云服务,可帮助您使用来自 OpenAI、Meta 等多种预构建和精选模型快速开发生成式 AI 体验。
LangChain.js 支持与 Azure OpenAI 集成,使用 OpenAI SDK 中的新 Azure 集成。 OpenAI SDK.
您可以在 此页面了解有关 Azure OpenAI 及其与 OpenAI API 差异的更多信息。如果您没有 Azure 账户,可以 创建免费账户 开始使用。
这将帮助您开始使用 AzureOpenAIEmbeddings 嵌入模型 配合 LangChain 使用。有关 AzureOpenAIEmbeddings 功能和配置选项的详细文档,请参阅 API 参考.
概览
集成详情
| 类 | 包 | 本地 | Py 支持 | 下载量 | 版本 |
|---|---|---|---|---|---|
AzureOpenAIEmbeddings | @langchain/openai | ❌ | ✅ | !NPM - 下载量 | !NPM - 版本 |
设置
要访问 Azure OpenAI 嵌入模型,您需要创建一个 Azure 账户,获取 API 密钥,并安装 @langchain/openai 集成包。
凭证
您需要部署一个 Azure OpenAI 实例。您可以按照 本指南.
在 Azure Portal 上部署一个版本。实例运行后,请确保您有实例名称和密钥。您可以在 Azure Portal 中实例的"密钥和终结点"部分找到密钥。
如果您使用的是 Node.js,可以定义以下环境变量来使用该服务:
AZURE_OPENAI_API_INSTANCE_NAME=
AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME=
AZURE_OPENAI_API_KEY=
AZURE_OPENAI_API_VERSION="2024-02-01"
如果您想获取模型调用的自动追踪,可以取消下面注释来设置您的 LangSmith API 密钥:
# export LANGSMITH_TRACING="true"
# export LANGSMITH_API_KEY="your-api-key"
安装
LangChain AzureOpenAIEmbeddings 集成位于 @langchain/openai package:
npm install @langchain/openai @langchain/core
yarn add @langchain/openai @langchain/core
pnpm add @langchain/openai @langchain/core
实例化
现在我们可以实例化模型对象并嵌入文本:
const embeddings = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: "<your_key>", // In Node.js defaults to process.env.AZURE_OPENAI_API_KEY
azureOpenAIApiInstanceName: "<your_instance_name>", // In Node.js defaults to process.env.AZURE_OPENAI_API_INSTANCE_NAME
azureOpenAIApiEmbeddingsDeploymentName: "<your_embeddings_deployment_name>", // In Node.js defaults to process.env.AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME
azureOpenAIApiVersion: "<api_version>", // In Node.js defaults to process.env.AZURE_OPENAI_API_VERSION
maxRetries: 1,
});
索引和检索
嵌入模型常用于检索增强生成(RAG)流程中,既作为索引数据的一部分,也用于后续检索。如需更详细的说明,请参阅 **学习** 选项卡下的.
下面,请查看如何使用 embeddings 对象(我们在上面初始化的)来索引和检索数据。在此示例中,我们将使用演示 MemoryVectorStore.
// Create a vector store with a sample text
const text = "LangChain is the framework for building context-aware reasoning applications";
const vectorstore = await MemoryVectorStore.fromDocuments(
[{ pageContent: text, metadata: {} }],
embeddings,
);
// Use the vector store as a retriever that returns a single document
const retriever = vectorstore.asRetriever(1);
// Retrieve the most similar text
const retrievedDocuments = await retriever.invoke("What is LangChain?");
retrievedDocuments[0].pageContent;
LangChain is the framework for building context-aware reasoning applications
直接使用
在底层,向量存储和检索器实现调用 embeddings.embedDocument(...) 和 embeddings.embedQuery(...) 来创建用于 fromDocuments 和检索器的 invoke 操作中的文本嵌入。
您可以直接调用这些方法来获取嵌入以满足您的使用场景。
嵌入单个文本
您可以使用 embedQuery嵌入搜索查询。这会生成特定于查询的向量表示:
const singleVector = await embeddings.embedQuery(text);
console.log(singleVector.slice(0, 100));
[
-0.024253517, -0.0054218727, 0.048715446, 0.020580322, 0.03180832,
0.0028770117, -0.012367731, 0.037383243, -0.054915592, 0.032225136,
0.00825818, -0.023888804, -0.01184671, 0.012257014, 0.016294925,
0.009254632, 0.0051353113, -0.008889917, 0.016855022, 0.04207243,
0.00082589936, -0.011664353, 0.00818654, 0.029020859, -0.012335167,
-0.019603407, 0.0013945447, 0.05538451, -0.011625277, -0.008153976,
0.038607642, -0.03811267, -0.0074440846, 0.047647353, -0.00927417,
0.024201415, -0.0069230637, -0.008538228, 0.003910912, 0.052805457,
-0.023159374, 0.0014352495, -0.038659744, 0.017141584, 0.005587948,
0.007971618, -0.016920151, 0.06658646, -0.0016916894, 0.045667473,
-0.042202685, -0.03983204, -0.04160351, -0.011729481, -0.055905532,
0.012543576, 0.0038848612, 0.007919516, 0.010915386, 0.0033117384,
-0.007548289, -0.030427614, -0.041890074, 0.036002535, -0.023771575,
-0.008792226, -0.049444873, 0.016490309, -0.0060568666, 0.040196754,
0.014106638, -0.014575557, -0.0017356506, -0.011234511, -0.012517525,
0.008362384, 0.01253055, 0.036158845, 0.008297256, -0.0010908874,
-0.014888169, -0.020489143, 0.018965157, -0.057937514, -0.0037122732,
0.004402626, -0.00840146, 0.042984217, -0.04936672, -0.03714878,
0.004969236, 0.03707063, 0.015396165, -0.02055427, 0.01988997,
0.030219207, -0.021257648, 0.01340326, 0.003692735, 0.012595678
]
嵌入多个文本
您可以使用以下方式嵌入多个文本以进行索引 embedDocuments。此方法使用的内部实现可能(但不一定)与嵌入查询不同:
const text2 = "LangGraph is a library for building stateful, multi-actor applications with LLMs";
const vectors = await embeddings.embedDocuments([text, text2]);
console.log(vectors[0].slice(0, 100));
console.log(vectors[1].slice(0, 100));
[
-0.024253517, -0.0054218727, 0.048715446, 0.020580322, 0.03180832,
0.0028770117, -0.012367731, 0.037383243, -0.054915592, 0.032225136,
0.00825818, -0.023888804, -0.01184671, 0.012257014, 0.016294925,
0.009254632, 0.0051353113, -0.008889917, 0.016855022, 0.04207243,
0.00082589936, -0.011664353, 0.00818654, 0.029020859, -0.012335167,
-0.019603407, 0.0013945447, 0.05538451, -0.011625277, -0.008153976,
0.038607642, -0.03811267, -0.0074440846, 0.047647353, -0.00927417,
0.024201415, -0.0069230637, -0.008538228, 0.003910912, 0.052805457,
-0.023159374, 0.0014352495, -0.038659744, 0.017141584, 0.005587948,
0.007971618, -0.016920151, 0.06658646, -0.0016916894, 0.045667473,
-0.042202685, -0.03983204, -0.04160351, -0.011729481, -0.055905532,
0.012543576, 0.0038848612, 0.007919516, 0.010915386, 0.0033117384,
-0.007548289, -0.030427614, -0.041890074, 0.036002535, -0.023771575,
-0.008792226, -0.049444873, 0.016490309, -0.0060568666, 0.040196754,
0.014106638, -0.014575557, -0.0017356506, -0.011234511, -0.012517525,
0.008362384, 0.01253055, 0.036158845, 0.008297256, -0.0010908874,
-0.014888169, -0.020489143, 0.018965157, -0.057937514, -0.0037122732,
0.004402626, -0.00840146, 0.042984217, -0.04936672, -0.03714878,
0.004969236, 0.03707063, 0.015396165, -0.02055427, 0.01988997,
0.030219207, -0.021257648, 0.01340326, 0.003692735, 0.012595678
]
[
-0.033366997, 0.010419146, 0.0118083665, -0.040441725, 0.0020355924,
-0.015808804, -0.023629595, -0.0066180876, -0.040004376, 0.020053642,
-0.0010797002, -0.03900105, -0.009956073, 0.0027896944, 0.003305828,
-0.034010153, 0.009833873, 0.0061164247, 0.022536227, 0.029147884,
0.017789727, 0.03182342, 0.010869357, 0.031849146, -0.028093107,
0.008283865, -0.0145610785, 0.01645196, -0.029430874, -0.02508313,
0.046178687, -0.01722375, -0.010046115, 0.013101112, 0.0044538635,
0.02197025, 0.03985002, 0.007955855, 0.0008819293, 0.012657333,
0.014368132, -0.014007963, -0.03722594, 0.031617608, -0.011570398,
0.039052505, 0.0020018267, 0.023706773, -0.0046950476, 0.056083307,
-0.08412496, -0.043425974, -0.015512952, 0.015950298, -0.03624834,
-0.0053317733, -0.037251666, 0.0046339477, 0.04193385, 0.023475237,
-0.021378545, 0.013699248, -0.026009277, 0.050757967, -0.0494202,
0.0007874656, -0.07208506, 0.015885983, -0.003259199, 0.015127057,
0.0068946453, -0.035373647, -0.005875241, -0.0032238255, -0.04185667,
-0.022047428, 0.0014326327, -0.0070940237, -0.0027864785, -0.016271876,
0.005097021, 0.034473225, 0.012361481, -0.026498076, 0.0067274245,
-0.026330855, -0.006132504, 0.008180959, -0.049368747, -0.032337945,
0.011049441, 0.00186194, -0.012097787, 0.01930758, 0.07059293,
0.029713862, 0.04337452, -0.0048461896, -0.019976463, 0.011473924
]
使用 Azure 托管标识
如果您使用的是 Azure 托管标识,可以按以下方式配置凭据:
DefaultAzureCredential,
getBearerTokenProvider,
} from "@azure/identity";
const credentials = new DefaultAzureCredential();
const azureADTokenProvider = getBearerTokenProvider(
credentials,
"https://cognitiveservices.azure.com/.default"
);
const modelWithManagedIdentity = new AzureOpenAIEmbeddings({
azureADTokenProvider,
azureOpenAIApiInstanceName: "<your_instance_name>",
azureOpenAIApiEmbeddingsDeploymentName: "<your_embeddings_deployment_name>",
azureOpenAIApiVersion: "<api_version>",
});
使用不同的域
如果您的实例托管在默认域以外的域上 openai.azure.com,则需要使用备用 AZURE_OPENAI_BASE_PATH 环境变量。 例如,以下是连接到该域的方法 https://westeurope.api.microsoft.com/openai/deployments/{DEPLOYMENT_NAME}:
const embeddingsDifferentDomain = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: "<your_key>", // In Node.js defaults to process.env.AZURE_OPENAI_API_KEY
azureOpenAIApiEmbeddingsDeploymentName: "<your_embedding_deployment_name>", // In Node.js defaults to process.env.AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME
azureOpenAIApiVersion: "<api_version>", // In Node.js defaults to process.env.AZURE_OPENAI_API_VERSION
azureOpenAIBasePath:
"https://westeurope.api.microsoft.com/openai/deployments", // In Node.js defaults to process.env.AZURE_OPENAI_BASE_PATH
});
自定义请求头
您可以通过传入 configuration field:
const embeddingsWithCustomHeaders = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: "<your_key>",
azureOpenAIApiInstanceName: "<your_instance_name>",
azureOpenAIApiEmbeddingsDeploymentName: "<your_embeddings_deployment_name>",
azureOpenAIApiVersion: "<api_version>",
configuration: {
defaultHeaders: {
"x-custom-header": `SOME_VALUE`,
},
},
});
该 configuration 字段还接受其他 ClientOptions 官方 SDK 接受的参数。
Note: 特定的请求头 api-key 目前无法以这种方式覆盖,将传递来自 azureOpenAIApiKey.
从 Azure OpenAI SDK 迁移
如果您使用的是已弃用的 Azure OpenAI SDK(使用 @langchain/azure-openai 包),可以按照以下步骤更新代码以使用新的 Azure 集成:
- 安装新的
@langchain/openai包并移除之前的@langchain/azure-openaipackage:
npm install @langchain/openai
npm uninstall @langchain/azure-openai
- 更新导入语句以使用新的
AzureOpenAIEmbeddings类(来自@langchain/openaipackage:
- 更新代码以使用新的
AzureOpenAIEmbeddings类并传递所需参数:
const model = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: "<your_key>",
azureOpenAIApiInstanceName: "<your_instance_name>",
azureOpenAIApiEmbeddingsDeploymentName:
"<your_embeddings_deployment_name>",
azureOpenAIApiVersion: "<api_version>",
});
请注意,构造函数现在需要 azureOpenAIApiInstanceName 参数,而不是 azureOpenAIEndpoint 参数,并且添加了 azureOpenAIApiVersion 参数来指定API版本。
- - 如果您使用的是Azure托管标识,现在需要使用
azureADTokenProvider参数到构造函数中,而不是credentials,请参阅 Azure托管标识 部分了解更多详情。 - - 如果您使用的是环境变量,现在必须设置
AZURE_OPENAI_API_INSTANCE_NAME环境变量,而不是AZURE_OPENAI_API_ENDPOINT,并添加AZURE_OPENAI_API_VERSION环境变量来指定API版本。
API参考
有关所有 AzureOpenAIEmbeddings 功能和配置的详细文档,请前往 API参考.