자습서: 채팅 모델을 사용하여 데이터 검색(Azure AI 검색의 RAG)
Azure AI Search에서 RAG 솔루션의 특징은 인덱싱된 콘텐츠에 대한 대화형 검색 환경을 위해 LLM(대규모 언어 모델)에 쿼리를 보내는 것입니다. 기본 사항만 구현하면 놀라울 정도로 쉬울 수 있습니다.
이 자습서에서는 다음을 수행합니다.
- 클라이언트 설정
- LLM에 대한 쓰기 지침
- LLM 입력용으로 설계된 쿼리 제공
- 결과 검토 및 다음 단계 살펴보기
이 자습서는 이전 자습서를 기반으로 합니다. 인덱싱 파이프라인에서 만든 검색 인덱스가 있다고 가정합니다.
필수 조건
Python 확장 및 Jupyter 패키지가 있는 Visual Studio Code. 자세한 내용은 Visual Studio Code의 Python을 참조하세요.
Azure OpenAI와 공유되는 지역에서 Azure AI 검색.
Gpt-4o 배포를 사용하는 Azure OpenAI. 자세한 내용은 Azure AI 검색에서 RAG에 대한 모델 선택을 참조하세요.
샘플 다운로드
이전에 인덱싱 파이프라인 자습서에서 동일한 Notebook을 사용합니다. LLM을 쿼리하는 스크립트는 파이프라인 만들기 단계를 따릅니다. Notebook이 아직 없는 경우 GitHub에서 다운로드하세요.
쿼리를 보내기 위한 클라이언트 구성
Azure AI Search의 RAG 패턴은 검색 인덱스에 대한 동기화된 일련의 연결로 그라운딩 데이터를 가져온 다음에 LLM에 대한 연결로 사용자의 질문에 대한 응답을 공식화합니다. 두 클라이언트에서 동일한 쿼리 문자열을 사용합니다.
두 클라이언트를 설정하므로 두 리소스에 대한 엔드포인트와 권한이 필요합니다. 이 자습서에서는 권한 있는 연결에 대한 역할 할당을 설정했지만 샘플 Notebook에 엔드포인트를 제공해야 한다고 가정합니다.
# Set endpoints and API keys for Azure services
AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE"
# AZURE_SEARCH_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR SEARCH SERVICE ADMIN KEY HERE"
AZURE_OPENAI_ACCOUNT: str = "PUR YOUR AZURE OPENAI ENDPOINT HERE"
# AZURE_OPENAI_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR AZURE OPENAI KEY HERE"
프롬프트 및 쿼리에 대한 예제 스크립트
클라이언트를 인스턴스화하고, 프롬프트를 정의하며, 쿼리를 설정하는 Python 스크립트는 다음과 같습니다. Notebook에서 이 스크립트를 실행하여 채팅 모델 배포에서 응답을 생성할 수 있습니다.
Azure Government 클라우드의 경우 토큰 공급자의 API 엔드포인트를 수정합니다 "https://cognitiveservices.azure.us/.default"
.
# Import libraries
from azure.search.documents import SearchClient
from openai import AzureOpenAI
token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
api_version="2024-06-01",
azure_endpoint=AZURE_OPENAI_ACCOUNT,
azure_ad_token_provider=token_provider
)
deployment_name = "gpt-4o"
search_client = SearchClient(
endpoint=AZURE_SEARCH_SERVICE,
index_name=index_name,
credential=credential
)
# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps users learn from the information found in the source material.
Answer the query using only the sources provided below.
Use bullets if the answer has multiple points.
If the answer is longer than 3 sentences, provide a summary.
Answer ONLY with the facts listed in the list of sources below. Cite your source when you answer the question
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""
# Provide the search query.
# It's hybrid: a keyword search on "query", with text-to-vector conversion for "vector_query".
# The vector query finds 50 nearest neighbor matches in the search index
query="What's the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
# Search results are limited to the top 5 matches. Limiting top can help you stay under LLM quotas.
search_results = search_client.search(
search_text=query,
vector_queries= [vector_query],
select=["title", "chunk", "locations"],
top=5,
)
# Newlines could be in the OCR'd content or in PDFs, as is the case for the sample PDFs used for this tutorial.
# Use a unique separator to make the sources distinct.
# We chose repeated equal signs (=) followed by a newline because it's unlikely the source documents contain this sequence.
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])
response = openai_client.chat.completions.create(
messages=[
{
"role": "user",
"content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
}
],
model=deployment_name
)
print(response.choices[0].message.content)
결과 검토
이 응답에서 대답은 검색 엔진이 가장 관련성이 있다고 판단한 청크로 구성된 5개의 입력(top=5
)을 기반으로 합니다. 프롬프트의 지침은 LLM에 sources
의 정보 또는 형식이 지정된 검색 결과만 사용하도록 지시합니다.
첫 번째 쿼리 "What's the NASA earth book about?"
의 결과는 다음 예제와 유사해야 합니다.
The NASA Earth book is about the intricate and captivating science of our planet, studied
through NASA's unique perspective and tools. It presents Earth as a dynamic and complex
system, observed through various cycles and processes such as the water cycle and ocean
circulation. The book combines stunning satellite images with detailed scientific insights,
portraying Earth’s beauty and the continuous interaction of land, wind, water, ice, and
air seen from above. It aims to inspire and demonstrate that the truth of our planet is
as compelling as any fiction.
Source: page-8.pdf
프롬프트와 쿼리가 변경되지 않더라도 LLM은 다른 답변을 반환해야 합니다. 결과는 예제와 매우 다르게 보일 수 있습니다. 자세한 내용은 재현 가능한 출력을 사용하는 방법 알아보기를 참조하세요.
참고 항목
이 자습서를 테스트할 때 다양한 응답을 보았으며 일부는 다른 응답보다 더 관련성이 있었습니다. 여러 번 동일한 요청을 반복하면 응답이 악화되었는데 채팅 기록의 혼란으로 인한 것일 가능성이 크며 모델이 반복 요청을 생성된 답변에 대한 불만족으로 등록했을 수도 있습니다. 채팅 기록 관리는 이 자습서의 범위를 벗어나지만 애플리케이션 코드에 이를 포함하면 이 동작을 완화하거나 제거할 수 있습니다.
필터 추가
엔터티 인식 기술로 인식되는 위치로 채워진 응용 AI를 사용하여 locations
필드를 만들었음을 기억하세요. 위치에 대한 필드 정의에는 filterable
특성이 포함됩니다. 이전 요청을 반복해 보겠습니다. 하지만 이번에는 위치 필드에서 용어 ice에 대해 선택하는 필터를 추가합니다.
필터는 포함 또는 제외 조건을 도입합니다. 검색 엔진은 여전히 "What's the NASA earth book about?"
에 대한 벡터 검색을 수행하고 있지만, 이제 ice를 포함하지 않는 일치 항목은 제외됩니다. 문자열 컬렉션 및 벡터 쿼리에 대한 필터링에 대한 자세한 내용은 텍스트 필터 기본 사항, 컬렉션 필터 이해 및 벡터 쿼리에 필터 추가를 참조하세요.
search_results 정의를 필터를 포함하는 다음 예제로 바꿉니다.
query="what is the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
# Add a filter that selects documents based on whether locations includes the term "ice".
search_results = search_client.search(
search_text=query,
vector_queries= [vector_query],
filter="search.ismatch('ice*', 'locations', 'full', 'any')",
select=["title", "chunk", "locations"],
top=5,
)
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])
search_results = search_client.search(
search_text=query,
top=10,
filter="search.ismatch('ice*', 'locations', 'full', 'any')",
select="title, chunk, locations"
필터링된 쿼리의 결과는 이제 다음 응답과 유사하게 표시됩니다. ice 커버에 대한 강조에 주목하세요.
The NASA Earth book showcases various geographic and environmental features of Earth through
satellite imagery, highlighting remarkable landscapes and natural phenomena.
- It features extraordinary views like the Holuhraun Lava Field in Iceland, captured by
Landsat 8 during an eruption in 2014, with false-color images illustrating different elements
such as ice, steam, sulfur dioxide, and fresh lava ([source](page-43.pdf)).
- Other examples include the North Patagonian Icefield in South America, depicted through
clear satellite images showing glaciers and their changes over time ([source](page-147.pdf)).
- It documents melt ponds in the Arctic, exploring their effects on ice melting and
- heat absorption ([source](page-153.pdf)).
Overall, the book uses satellite imagery to give insights into Earth's dynamic systems
and natural changes.
입력 변경
LLM에 대한 입력 수를 늘리거나 줄이면 응답에 큰 영향을 줄 수 있습니다. top=8
을설정한 후 동일한 쿼리를 다시 실행해 보세요. 입력을 늘리면 쿼리가 변경되지 않더라도 모델은 매번 다른 결과를 반환합니다.
다음은 입력을 8로 늘인 후 모델이 반환하는 내용의 한 예입니다.
The NASA Earth book features a range of satellite images capturing various natural phenomena
across the globe. These include:
- The Holuhraun Lava Field in Iceland documented by Landsat 8 during a 2014 volcanic
eruption (Source: page-43.pdf).
- The North Patagonian Icefield in South America, highlighting glacial landscapes
captured in a rare cloud-free view in 2017 (Source: page-147.pdf).
- The impact of melt ponds on ice sheets and sea ice in the Arctic, with images from
an airborne research campaign in Alaska during July 2014 (Source: page-153.pdf).
- Sea ice formations at Shikotan, Japan, and other notable geographic features in various
locations recorded by different Landsat missions (Source: page-168.pdf).
Summary: The book showcases satellite images of diverse Earth phenomena, such as volcanic
eruptions, icefields, and sea ice, to provide insights into natural processes and landscapes.
모델은 접지 데이터에 바인딩되므로 입력 크기를 늘리면 답이 더욱 넓어집니다. 관련성 튜닝을 사용하여 잠재적으로 더 집중된 답변을 생성할 수 있습니다.
프롬프트 변경
프롬프트를 변경하여 출력, 톤 및 모델이 프롬프트를 변경하여 자체 학습 데이터로 답변을 보완할지 여부를 제어하도록 프롬프트를 변경할 수도 있습니다.
다음은 과학적 연구를 위한 위치를 식별하는 프롬프트에 다시 초점을 맞추는 경우 LLM 출력의 또 다른 예입니다.
# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps scientists identify locations for future study.
Answer the query cocisely, using bulleted points.
Answer ONLY with the facts listed in the list of sources below.
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Do not exceed 5 bullets.
Query: {query}
Sources:\n{sources}
"""
이전 쿼리의 모든 측면을 유지하는 프롬프트만 변경하면 출력이 이 예제와 같이 표시될 수 있습니다.
The NASA Earth book appears to showcase various locations on Earth captured through satellite imagery,
highlighting natural phenomena and geographic features. For instance, the book includes:
- The Holuhraun Lava Field in Iceland, detailing volcanic activity and its observation via Landsat 8.
- The North Patagonian Icefield in South America, covering its glaciers and changes over time as seen by Landsat 8.
- Melt ponds in the Arctic and their impacts on the heat balance and ice melting.
- Iceberg A-56 in the South Atlantic Ocean and its interaction with cloud formations.
(Source: page-43.pdf, page-147.pdf, page-153.pdf, page-39.pdf)
팁
자습서를 계속 진행하는 경우 프롬프트를 이전 값(You are an AI assistant that helps users learn from the information found in the source material
)으로 복원해야 합니다.
매개 변수 및 프롬프트를 변경하면 LLM의 응답에 영향을 줍니다. 직접 탐색할 때 다음 팁을 염두에 두세요.
top
값을 올리면 모델에서 사용 가능한 할당량이 소진될 수 있습니다. 할당량이 없으면 오류 메시지가 반환되거나 모델이 "알 수 없음"을 반환할 수 있습니다.top
값을 높인다고 결과가 반드시 향상되지는 않습니다. 상위를 사용하여 테스트할 때 답변이 크게 향상되지 않는 경우가 있습니다.그렇다면 무엇이 도움이 될까요? 일반적으로 대답은 관련성 조정입니다. 일반적으로 Azure AI 검색에서 검색 결과의 관련성을 개선하는 것이 LLM의 유틸리티를 극대화하는 가장 효과적인 방법입니다.
다음 자습서 시리즈에서는 관련성을 극대화하고 속도 및 간결성을 위해 쿼리 성능을 최적화하는 데 초점을 맞춥니다. 스키마 정의 및 쿼리 논리를 다시 검토하여 관련성 기능을 구현하지만 나머지 파이프라인 및 모델은 그대로 유지됩니다.