코드를 사용하여 인덱스 빌드 및 사용 방법
Important
이 문서에 표시된 항목(미리 보기)은 현재 퍼블릭 미리 보기에서 확인할 수 있습니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.
이 문서에서는 인덱스 만들기 및 코드에서 인덱스 사용 방법을 알아봅니다. 인덱스 로컬을 만들려면 promptflow-rag
패키지를 사용합니다. 클라우드에서 원격 인덱스 만들기를 위해 azure-ai-ml
패키지를 사용합니다. langchain
을(를) 사용하여 인덱스를 사용합니다.
필수 조건
다음을 갖춰야 합니다.
AI Foundry 허브 및 프로젝트입니다.
샘플 제품과 고객 데이터를 인덱싱하기 위한 Azure AI 검색 서비스 연결. Azure AI 검색 서비스가 없으면 Azure Portal에서 서비스를 만들거나 여기 지침을 참조하세요.
포함 모델:
인덱스 로컬 빌드 및 사용
인덱스 로컬을 빌드하고 사용할 수 있습니다.
로컬 인덱스 작업에 필요한 패키지
로컬 인덱스를 만드는 데 필요한 다음 패키지를 설치합니다.
pip install promptflow-rag langchain langchain-openai
로컬 사용을 위한 AI Search 구성
Azure AI Search를 인덱스 저장소로 사용합니다. 시작하려면 다음 코드를 사용하여 Azure AI Search 서비스를 설정할 수 있습니다.
import os
# set credentials to your Azure AI Search instance
os.environ["AZURE_AI_SEARCH_KEY"] = "<your-ai-search-key>"
os.environ["AZURE_AI_SEARCH_ENDPOINT"] = "https://<your-ai-search-service>.search.windows.net"
Azure OpenAI 포함을 사용하여 로컬로 인덱스 빌드
Azure OpenAI 포함을 사용하는 인덱스를 만들기 위해 모델에 연결하도록 환경 변수를 구성합니다.
import os
# set credentials to your Azure OpenAI instance
os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
os.environ["AZURE_OPENAI_API_KEY"] = "<your-azure-openai-api-key>"
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://<your-azure-openai-service>.openai.azure.com/"
이제 build_index
함수를 사용하여 인덱스 빌드를 살펴보겠습니다.
from promptflow.rag.config import LocalSource, AzureAISearchConfig, EmbeddingsModelConfig
from promptflow.rag import build_index
local_index_aoai=build_index(
name="<your-index-name>" + "aoai", # name of your index
vector_store="azure_ai_search", # the type of vector store
embeddings_model_config=EmbeddingsModelConfig(
model_name="text-embedding-ada-002",
deployment_name="text-embedding-ada-002", # verify if your deployment name is same as model name
),
input_source=LocalSource(input_data="<path-to-your-local-files>"), # the location of your file/folders
index_config=AzureAISearchConfig(
ai_search_index_name="<your-index-name>" + "-aoai-store", # the name of the index store inside the azure ai search service
),
tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)
위의 코드는 인덱스를 로컬로 빌드합니다. 환경 변수를 사용하여 AI Search 서비스를 가져와서 Azure OpenAI 포함 모델에 연결합니다.
AI Foundry 프로젝트에 배포된 다른 포함 모델을 사용하여 인덱스 로컬 빌드
AI Foundry 프로젝트에 배포된 포함 모델을 사용하는 인덱스 만들기를 위해 아래와 같이 모델에 ConnectionConfig
대한 연결을 구성합니다. subscription
, resource_group
및 workspace
포함 모델이 설치된 프로젝트를 나타냅니다. AI connection_name
Foundry 프로젝트 설정 페이지에서 찾을 수 있는 모델의 연결 이름을 참조합니다.
from promptflow.rag.config import ConnectionConfig
my_connection_config=ConnectionConfig(
subscription_id="<subscription_id>",
resource_group_name="<resource_group_name>",
workspace_name="<ai_studio_project_name>",
connection_name="<serverless_connection_name>"
)
이제 build_index
함수를 사용하여 인덱스 빌드를 살펴보겠습니다.
from promptflow.rag.config import LocalSource, AzureAISearchConfig, EmbeddingsModelConfig
from promptflow.rag import build_index
local_index_cohere=build_index(
name="<your-index-name>" + "cohere", # name of your index
vector_store="azure_ai_search", # the type of vector store
embeddings_model_config=EmbeddingsModelConfig(
model_name="cohere-embed-v3-multilingual", # in this example we use cohere multi lingual embedding
connection_config=my_connection_config # created in previous step
),
input_source=LocalSource(input_data="<path-to-your-local-files>"), # the location of your file/folders
index_config=AzureAISearchConfig(
ai_search_index_name="<your-index-name>" + "cohere-store", # the name of the index store inside the azure ai search service
),
tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)
위의 코드는 인덱스를 로컬로 빌드합니다. 환경 변수를 사용하여 AI Search 서비스와 연결 구성을 가져와 포함 모델에 연결합니다.
로컬 인덱스 사용
만든 로컬 인덱스는 검색 쿼리에 사용할 랭체인 검색자로 사용할 수 있습니다.
from promptflow.rag import get_langchain_retriever_from_index
# Get the OpenAI embedded Index
retriever=get_langchain_retriever_from_index(local_index_aoai)
retriever.get_relevant_documents("<your search query>")
# Get the Cohere embedded Index
retriever=get_langchain_retriever_from_index(local_index_cohere)
retriever.get_relevant_documents("<your search query>")
AI Foundry 프로젝트에 인덱스 등록(선택 사항)
필요에 따라 사용자 또는 프로젝트에 액세스할 수 있는 다른 사용자가 클라우드에서 사용할 수 있도록 AI Foundry 프로젝트에 인덱스 등록을 할 수 있습니다. 계속하기 전에 원격 작업에 필요한 패키지를 설치합니다.
프로젝트에 연결
# connect to the AI Foundry project
from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient
client=MLClient(
DefaultAzureCredential(),
subscription_id="<subscription_id>",
resource_group_name="<resource_group_name>",
workspace_name="<ai_studio_project_name>"
)
위 코드의 subscription
, resource_group
및 workspace
은(는) 연결하려는 프로젝트를 나타냅니다.
인덱스 등록
from azure.ai.ml.entities import Index
# register the index with Azure OpenAI embeddings
client.indexes.create_or_update(
Index(name="<your-index-name>" + "aoai",
path=local_index_aoai,
version="1")
)
# register the index with cohere embeddings
client.indexes.create_or_update(
Index(name="<your-index-name>" + "cohere",
path=local_index_cohere,
version="1")
)
참고 항목
환경 변수는 로컬 환경에서의 편의를 위한 것입니다. 그러나 환경 변수를 사용하여 만든 로컬 인덱스를 등록하는 경우 환경 변수의 비밀이 클라우드 인덱스로 전송되지 않으므로 인덱스가 예상대로 작동하지 않을 수 있습니다. 이 문제를 해결하려면 등록하기 전에 ConnectionConfig
또는 connection_id
를 사용하여 로컬 인덱스를 만들 수 있습니다.
AI Foundry 프로젝트에서 인덱스 빌드(원격)
AI Foundry 프로젝트의 클라우드에서 인덱스 빌드
원격 인덱스 작업에 필요한 패키지
원격 인덱스를 만드는 데 필요한 다음 패키지를 설치합니다.
pip install azure-ai-ml promptflow-rag langchain langchain-openai
AI Foundry 프로젝트에 연결
시작하려면 프로젝트에 연결합니다. 아래 코드의 subscription
, resource_group
및 workspace
은(는) 연결하려는 프로젝트를 참조합니다.
# connect to the AI Foundry project
from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient
client=MLClient(
DefaultAzureCredential(),
subscription_id="<subscription_id>",
resource_group_name="<resource_group_name>",
workspace_name="<ai_studio_project_name>"
)
AI Search 서비스 연결 가져오기
이 프로젝트에는 AI Search 서비스에 대한 연결이 있어야 합니다. 프로젝트에서 세부 정보를 검색합니다.
ai_search_connection = client.connections.get("<ai_search_connection>")
포함 모델에 연결
Microsoft Entra ID 연결 또는 API 키 기반 연결을 사용하여 Azure OpenAI에 연결할 수 있습니다.
from azure.ai.ml.entities import IndexModelConfiguration
## aoai connections - entra id
aoai_connection = client.connections.get("<your_aoai_entra_id_connection>")
embeddings_model_config = IndexModelConfiguration.from_connection(
aoai_connection,
model_name="text-embedding-ada-002",
deployment_name="text-embedding-ada-002") # verify if your deployment name is same as model name
## OR you can connect using API Key based connections
from azure.ai.ml.entities import IndexModelConfiguration
## aoai connections - API Key
aoai_connection = client.connections.get("<your_aoai_connection>", populate_secrets=True)
embeddings_model_config = IndexModelConfiguration.from_connection(
aoai_connection,
model_name="text-embedding-ada-002",
deployment_name="text-embedding-ada-002")
서버리스 연결을 사용하여 AI Foundry 프로젝트(비 Azure OpenAI 모델)에 배포된 모델 포함에 연결할 수 있습니다.
from azure.ai.ml.entities import IndexModelConfiguration
serverless_connection = client.connections.get("<my_embedding_model_severless_connection_name>")
embeddings_model_config = IndexModelConfiguration.from_connection(cohere_serverless_connection)
입력 데이터를 선택하여 인덱스 빌드
다음 형식의 입력에서 인덱스를 빌드할 수 있습니다.
- 로컬 파일 및 폴더
- GitHub 리포지토리
- Azure Storage
다음 코드 샘플을 사용하여 이러한 원본을 사용하고 input_source
을(를) 구성할 수 있습니다.
# Local source
from azure.ai.ml.entities import LocalSource
input_source=LocalSource(input_data="<path-to-your-local-files>")
# GitHub repository
from azure.ai.ml.entities import GitSource
input_source=GitSource(
git_url="https://github.com/rust-lang/book.git", # connecting to the RUST repo as an example
git_branch_name="main",
git_connection_id="")
# Azure Storage
input_source_subscription = "<subscription>"
input_source_resource_group = "<resource_group>"
input_source_workspace = "<workspace>"
input_source_datastore = "<datastore_name>"
input_source_path = "path"
input_source = f"azureml://subscriptions/{input_source_subscription}/resourcegroups/{input_source_resource_group}/workspaces/{input_source_workspace}/datastores/{input_source_datastore}/paths/{input_source_path}"
클라우드에서 인덱스 빌드
이제 ai_search_connection
, embeddings_model_config
및 input_source
을(를) 사용하여 인덱스 빌드를 수행할 수 있습니다. build_index
함수를 사용합니다. Azure Storage URL을 입력 원본으로 사용하는 경우 UserIdentityConfiguration
을(를) 제공해야 합니다.
# from azure.ai.ml.entities.credentials import UserIdentityConfiguration # user specified identity used to access the data. Required when using an azure storage URL
from azure.ai.ml.entities import AzureAISearchConfig
client.indexes.build_index(
name="<index_name>", # name of your index
embeddings_model_config=embeddings_model_config,
input_source=input_source,
# input_source_credential=UserIdentityConfiguration(), # user specified identity used to access the data. Required when using an azure storage URL
index_config=AzureAISearchConfig(
ai_search_index_name="<index_name>", # the name of the index store in AI search service
ai_search_connection_id=ai_search_connection.id,
),
tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)
입력 원본 데이터의 크기에 따라 위의 단계를 완료하는 데 다소 시간이 걸릴 수 있습니다. 작업이 완료되면 인덱스 개체를 검색할 수 있습니다.
my_index=client.indexes.get(name="<index_name>", label="latest")
프로젝트에서 등록된 인덱스 사용
프로젝트에서 등록된 인덱스 사용하려면 프로젝트에 연결하고 인덱스 검색을 수행해야 합니다. 검색된 인덱스가 랑가인 검색자로 사용하여 사용할 수 있습니다. 여기에 표시된 대로 client
을(를) 사용하여 프로젝트에 연결할 수 있습니다.
from promptflow.rag import get_langchain_retriever_from_index
my_index=client.indexes.get(
name="<registered_index_name>",
label="latest")
index_langchain_retriever=get_langchain_retriever_from_index(my_index.path)
index_langchain_retriever.get_relevant_documents("<your search query>")
인덱스 사용을 위한 질문 및 답변 함수
인덱스 로컬 또는 클라우드에서 빌드하는 방법을 알아보았습니다. 이 인덱스를 사용하여 사용자 질문을 수락하고 인덱스 데이터의 답변을 제공하는 QnA 함수를 빌드합니다. 먼저 여기 표시된 대로 langchain_retriever 인덱스로 가져옵니다. 이제 함수에서 이 retriever
을(를) 사용합니다. 이 함수는 AzureChatOpenAI
생성자에 정의된 대로 LLM을 사용합니다. 인덱스가 langchain_retriever 사용하여 데이터를 쿼리합니다. 컨텍스트 및 질문을 수락하는 프롬프트 템플릿을 빌드합니다. 우리는 랭체인의 RetrievalQA.from_chain_type
을(를) 사용하여 이 모든 것을 하나로 모으고 답을 얻습니다.
def qna(question: str, temperature: float = 0.0, prompt_template: object = None) -> str:
from langchain import PromptTemplate
from langchain.chains import RetrievalQA
from langchain_openai import AzureChatOpenAI
llm = AzureChatOpenAI(
openai_api_version="2023-06-01-preview",
api_key="<your-azure-openai-api-key>",
azure_endpoint="https://<your-azure-openai-service>.openai.azure.com/",
azure_deployment="<your-chat-model-deployment>", # verify the model name and deployment name
temperature=temperature,
)
template = """
System:
You are an AI assistant helping users answer questions given a specific context.
Use the following pieces of context to answer the questions as completely,
correctly, and concisely as possible.
Your answer should only come from the context. Don't try to make up an answer.
Do not add documentation reference in the response.
{context}
---
Question: {question}
Answer:"
"""
prompt_template = PromptTemplate(template=template, input_variables=["context", "question"])
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=index_langchain_retriever,
return_source_documents=True,
chain_type_kwargs={
"prompt": prompt_template,
},
)
response = qa(question)
return {
"question": response["query"],
"answer": response["result"],
"context": "\n\n".join([doc.page_content for doc in response["source_documents"]]),
}
우리가 대답을 얻을 수 있는지 확인하기 위해 질문을 할 수 있습니다.
result = qna("<your question>")
print(result["answer"])