Руководство по максимальной релевантности (RAG в поиске ИИ Azure)
В этом руководстве описано, как повысить релевантность результатов поиска, используемых в решениях RAG. Настройка релевантности может быть важным фактором в доставке решения RAG, соответствующего ожиданиям пользователей. В поиске ИИ Azure настройка релевантности включает профили семантического ранжирования и оценки L2.
Чтобы реализовать эти возможности, необходимо пересмотреть схему индекса, чтобы добавить конфигурации для семантического ранжирования и профилей оценки. Затем вы повторно запустите запросы с помощью новых конструкций.
В этом руководстве вы измените существующий индекс поиска и запросы для использования:
- Семантическое ранжирование L2
- Профиль оценки для повышения документа
В этом руководстве обновляется индекс поиска, созданный конвейером индексирования. Обновления не влияют на существующее содержимое, поэтому перестроение не требуется, и вам не нужно повторно запустить индексатор.
Примечание.
Существуют более релевантные функции в предварительной версии, в том числе векторный вес и установка минимальных пороговых значений, но мы опустим их из этого руководства, так как они находятся в предварительной версии.
Необходимые компоненты
Visual Studio Code с расширением Python и пакетом Jupyter.
Поиск ИИ Azure, уровень "Базовый" или выше для управляемого удостоверения и семантического ранжирования в том же регионе, что и Службы Azure OpenAI и Azure AI Services.
Azure OpenAI с развертыванием text-embedding-002 и gpt-35-turbo в том же регионе, что и поиск ИИ Azure.
Скачивание примера приложения
Пример записной книжки содержит обновленный индекс и запрос запроса.
Выполнение базового запроса для сравнения
Начнем с нового запроса: "Есть ли какие-либо облачные образования, относящиеся к океанам и крупным телам воды?".
Чтобы сравнить результаты после добавления функций релевантности, запустите запрос к существующей схеме индекса перед добавлением семантического ранжирования или профиля оценки.
Для облака Azure для государственных организаций измените конечную точку API в поставщике "https://cognitiveservices.azure.us/.default"
маркеров.
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
)
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}
"""
# Focused query on cloud formations and bodies of water
query="Are there any cloud formations specific to oceans and large bodies of water?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
search_results = search_client.search(
search_text=query,
vector_queries= [vector_query],
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])
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)
Выходные данные этого запроса могут выглядеть следующим образом.
Yes, there are cloud formations specific to oceans and large bodies of water.
A notable example is "cloud streets," which are parallel rows of clouds that form over
the Bering Strait in the Arctic Ocean. These cloud streets occur when wind blows from
a cold surface like sea ice over warmer, moister air near the open ocean, leading to
the formation of spinning air cylinders. Clouds form along the upward cycle of these cylinders,
while skies remain clear along the downward cycle (Source: page-21.pdf).
Обновление индекса для профилей семантического ранжирования и оценки
В предыдущем руководстве вы разработали схему индекса для рабочих нагрузок RAG. Мы намеренно опущены улучшения релевантности из этой схемы, чтобы вы могли сосредоточиться на основах. Отсрочка релевантности к отдельному упражнению дает вам сравнение качества результатов поиска до и после внесения обновлений.
Обновите инструкции импорта, чтобы включить классы для профилей семантического ранжирования и оценки.
from azure.identity import DefaultAzureCredential from azure.identity import get_bearer_token_provider from azure.search.documents.indexes import SearchIndexClient from azure.search.documents.indexes.models import ( SearchField, SearchFieldDataType, VectorSearch, HnswAlgorithmConfiguration, VectorSearchProfile, AzureOpenAIVectorizer, AzureOpenAIVectorizerParameters, SearchIndex, SemanticConfiguration, SemanticPrioritizedFields, SemanticField, SemanticSearch, ScoringProfile, TagScoringFunction, TagScoringParameters )
Добавьте следующую семантику конфигурации в индекс поиска. Этот пример можно найти на шаге схемы обновления в записной книжке.
# New semantic configuration semantic_config = SemanticConfiguration( name="my-semantic-config", prioritized_fields=SemanticPrioritizedFields( title_field=SemanticField(field_name="title"), keywords_fields=[SemanticField(field_name="locations")], content_fields=[SemanticField(field_name="chunk")] ) ) # Create the semantic settings with the configuration semantic_search = SemanticSearch(configurations=[semantic_config])
Семантическая конфигурация имеет имя и приоритетный список полей, которые помогают оптимизировать входные данные для семантического ранджера. Дополнительные сведения см. в разделе "Настройка семантического ранжирования".
Затем добавьте определение профиля оценки. Как и в случае семантической конфигурации, профиль оценки можно добавить в схему индекса в любое время. Этот пример также находится на шаге схемы обновления в записной книжке после семантической конфигурации.
# New scoring profile scoring_profiles = [ ScoringProfile( name="my-scoring-profile", functions=[ TagScoringFunction( field_name="locations", boost=5.0, parameters=TagScoringParameters( tags_parameter="tags", ), ) ] ) ]
Этот профиль использует функцию тега, которая повышает оценку документов, в которых было найдено совпадение в поле расположения. Помните, что индекс поиска содержит векторное поле и несколько невекторных полей для заголовка, блоков и расположений. Поле расположений — это коллекция строк, а коллекции строк можно повысить с помощью функции тегов в профиле оценки. Дополнительные сведения см. в разделе "Добавление профиля оценки" и повышение релевантности поиска с помощью повышения качества документов (запись блога).
Обновите определение индекса в службе поиска.
# Update the search index with the semantic configuration index = SearchIndex(name=index_name, fields=fields, vector_search=vector_search, semantic_search=semantic_search, scoring_profiles=scoring_profiles) result = index_client.create_or_update_index(index) print(f"{result.name} updated")
Обновление запросов для профилей семантического ранжирования и оценки
В предыдущем руководстве вы выполнили запросы , которые выполняются в поисковой системе, передав ответ и другие сведения в LLM для завершения чата.
В этом примере запрос изменяет запрос для включения семантической конфигурации и профиля оценки.
Для облака Azure для государственных организаций измените конечную точку 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
)
# Prompt is unchanged in this update
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.
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}
"""
# Queries are unchanged in this update
query="Are there any cloud formations specific to oceans and large bodies of water?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
# Add query_type semantic and semantic_configuration_name
# Add scoring_profile and scoring_parameters
search_results = search_client.search(
query_type="semantic",
semantic_configuration_name="my-semantic-config",
scoring_profile="my-scoring-profile",
scoring_parameters=["tags-ocean, 'sea surface', seas, surface"],
search_text=query,
vector_queries= [vector_query],
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])
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)
Выходные данные семантического ранжированного и увеличенного запроса могут выглядеть следующим образом.
Yes, there are specific cloud formations influenced by oceans and large bodies of water:
- **Stratus Clouds Over Icebergs**: Low stratus clouds can frame holes over icebergs,
such as Iceberg A-56 in the South Atlantic Ocean, likely due to thermal instability caused
by the iceberg (source: page-39.pdf).
- **Undular Bores**: These are wave structures in the atmosphere created by the collision
of cool, dry air from a continent with warm, moist air over the ocean, as seen off the
coast of Mauritania (source: page-23.pdf).
- **Ship Tracks**: These are narrow clouds formed by water vapor condensing around tiny
particles from ship exhaust. They are observed over the oceans, such as in the Pacific Ocean
off the coast of California (source: page-31.pdf).
These specific formations are influenced by unique interactions between atmospheric conditions
and the presence of large water bodies or objects within them.
Добавление семантического ранжирования и профилей оценки положительно влияет на ответ от LLM путем продвижения результатов, которые соответствуют критериям оценки и семантической связи.
Теперь, когда у вас есть более четкое представление о структуре индекса и запроса, давайте перейдем к оптимизации скорости и концессии. Мы возвращаем определение схемы для реализации сокращения квантизации и хранения, но остальная часть конвейера и моделей остается нетронутой.