AzureOpenAIEmbeddings 통합
AzureOpenAIEmbeddings 통합
LangChain JavaScript로 AzureOpenAIEmbeddings 임베딩 모델과 통합하는 방법을 안내할게요.
출처: 문서
본문
Azure OpenAI는 OpenAI, Meta 등의 사전 구축되고 정제된 다양한 모델로 생성형 AI 경험을 빠르게 개발하도록 돕는 클라우드 서비스예요.
LangChain.js는 OpenAI SDK의 새로운 Azure 통합을 사용해 Azure OpenAI와의 통합을 지원해요.
Azure OpenAI와 OpenAI API의 차이점에 대해 더 자세히 알아보려면 이 페이지를 참고하세요. Azure 계정이 없다면 무료 계정을 만들어 시작할 수 있어요.
이 문서는 LangChain으로 AzureOpenAIEmbeddings 임베딩 모델을 시작하는 데 도움을 줘요. AzureOpenAIEmbeddings 기능과 구성 옵션에 대한 자세한 문서는 API 레퍼런스를 참고하세요.
If you are using Azure OpenAI with the deprecated SDK, see the migration guide to update to the new API.
개요
통합 세부 정보
| 클래스 | 패키지 | Local | Py 지원 | Downloads | Version |
|---|---|---|---|---|---|
AzureOpenAIEmbeddings |
@langchain/openai |
❌ | ✅ |
설정
Azure OpenAI 임베딩 모델에 접근하려면 Azure 계정을 만들고 API 키를 받은 뒤 @langchain/openai 통합 패키지를 설치해야 해요.
자격 증명
Azure OpenAI 인스턴스가 배포되어 있어야 해요. 이 가이드에 따라 Azure Portal에서 버전을 배포할 수 있어요.
인스턴스가 실행 중이면 인스턴스 이름과 키가 있어야 해요. 키는 Azure Portal에서 인스턴스의 "Keys and Endpoint" 섹션에서 찾을 수 있어요.
Node.js를 사용한다면 서비스를 사용하도록 다음 환경 변수를 정의할 수 있어요:
AZURE_OPENAI_API_INSTANCE_NAME=<YOUR_INSTANCE_NAME>
AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME=<YOUR_EMBEDDINGS_DEPLOYMENT_NAME>
AZURE_OPENAI_API_KEY=<YOUR_KEY>
AZURE_OPENAI_API_VERSION="2024-02-01"
모델 호출의 자동 추적(tracing)을 원한다면 아래 주석을 해제해 LangSmith API 키를 설정할 수도 있어요:
# export LANGSMITH_TRACING="true"
# export LANGSMITH_API_KEY="your-api-key"
설치
LangChain AzureOpenAIEmbeddings 통합은 @langchain/openai 패키지에 있어요:
yarn add @langchain/openai @langchain/core
pnpm add @langchain/openai @langchain/core
인스턴스 생성
이제 모델 객체를 생성하고 텍스트를 임베딩할 수 있어요:
import { AzureOpenAIEmbeddings } from "@langchain/openai";
const embeddings = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: *** // 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) 흐름에서 자주 사용돼요. 더 자세한 지침은 Learn 탭의 RAG 튜토리얼을 참고하세요.
아래에서 위에서 초기화한 embeddings 객체로 데이터를 인덱싱하고 검색하는 방법을 확인하세요. 이 예제에서는 데모 MemoryVectorStore를 사용해 샘플 문서를 인덱싱하고 검색할 거예요.
// Create a vector store with a sample text
import { MemoryVectorStore } from "@langchain/classic/vectorstores/memory";
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
직접 사용
내부적으로 vectorstore와 retriever 구현은 fromDocuments에 사용된 텍스트와 retriever의 invoke 연산에 대해 각각 embeddings.embedDocument(...) 와 embeddings.embedQuery(...)를 호출해 임베딩을 만들어요.
이 메서드들을 직접 호출해 자신의 사용 사례에 대한 임베딩을 얻을 수 있어요.
단일 텍스트 임베딩
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 Managed Identity 사용
Azure Managed Identity를 사용한다면 자격 증명을 다음과 같이 구성할 수 있어요:
import {
DefaultAzureCredential,
getBearerTokenProvider,
} from "@azure/identity";
import { AzureOpenAIEmbeddings } from "@langchain/openai";
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}에 연결하는 방법은 다음과 같아요:
import { AzureOpenAIEmbeddings } from "@langchain/openai";
const embeddingsDifferentDomain = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: *** // 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 필드를 전달해 커스텀 헤더를 지정할 수 있어요:
import { AzureOpenAIEmbeddings } from "@langchain/openai";
const embeddingsWithCustomHeaders = new AzureOpenAIEmbeddings({
azureOpenAIApiKey: ***
azureOpenAIApiInstanceName: "<your_instance_name>",
azureOpenAIApiEmbeddingsDeploymentName: "<your_embeddings_deployment_name>",
azureOpenAIApiVersion: "<api_version>",
configuration: {
defaultHeaders: {
"x-custom-header": `SOME_VALUE`,
},
},
});
configuration 필드는 공식 SDK가 받아들이는 다른 ClientOptions 매개변수도 받아들여요.
참고: api-key 헤더는 현재 이 방식으로 재정의할 수 없으며 azureOpenAIApiKey의 값을 통과시킬 거예요.
Azure OpenAI SDK에서 마이그레이션
@langchain/azure-openai 패키지와 함께 더 이상 사용되지 않는 Azure OpenAI SDK를 사용하고 있다면 다음 단계에 따라 새로운 Azure 통합을 사용하도록 코드를 업데이트할 수 있어요:
-
새
@langchain/openai패키지를 설치하고 이전@langchain/azure-openai패키지를 제거하세요:npm install @langchain/openai npm uninstall @langchain/azure-openai -
@langchain/openai패키지의 새AzureOpenAIEmbeddings클래스를 사용하도록 임포트를 업데이트하세요:import { AzureOpenAIEmbeddings } from "@langchain/openai"; -
필요한 매개변수를 전달하는 새
AzureOpenAIEmbeddings클래스를 사용하도록 코드를 업데이트하세요:const model = new AzureOpenAIEmbeddings({ azureOpenAIApiKey: *** azureOpenAIApiInstanceName: "<your_instance_name>", azureOpenAIApiEmbeddingsDeploymentName: "<your_embeddings_deployment_name>", azureOpenAIApiVersion: "<api_version>", });이제 생성자가
azureOpenAIEndpoint매개변수 대신azureOpenAIApiInstanceName매개변수를 요구하고, API 버전을 지정하는azureOpenAIApiVersion매개변수를 추가한다는 점에 유의하세요.-
Azure Managed Identity를 사용했다면 이제
credentials대신 생성자에azureADTokenProvider매개변수를 사용해야 해요. 자세한 내용은 Azure Managed Identity 섹션을 참고하세요. -
환경 변수를 사용했다면 이제
AZURE_OPENAI_API_ENDPOINT대신AZURE_OPENAI_API_INSTANCE_NAME환경 변수를 설정하고, API 버전을 지정하는AZURE_OPENAI_API_VERSION환경 변수를 추가해야 해요.
-
API 레퍼런스
모든 AzureOpenAIEmbeddings 기능과 구성에 대한 자세한 문서는 API 레퍼런스를 참고하세요.
더 알아보기
- 이 문서를 MCP로 연결하면 Claude, VSCode 등에서 실시간 답변을 받을 수 있어요.
- GitHub에서 이 페이지 편집하기 또는 이슈 제출하기.