RAG(Retrieval-Augmented Generation) 솔루션의 이전 단계에서 청크에 대한 임베딩을 생성했습니다. 이 단계에서는 벡터 데이터베이스에서 인덱스 및 실험을 생성하여 최적의 검색을 결정합니다. 이 문서에서는 검색 인덱스, 검색 유형 및 재전송 전략에 대한 구성 옵션을 설명합니다.
이 문서는 시리즈의 일부입니다. 소개를 읽어 읽습니다.
검색 인덱스 구성
비고
이 섹션에서는 Azure AI Search에 대한 특정 권장 사항을 설명합니다. 다른 저장소를 사용하는 경우 적절한 설명서를 검토하여 해당 서비스에 대한 주요 구성을 찾습니다.
저장소의 검색 인덱스는 데이터의 각 필드에 대한 열을 가지고 있습니다. 검색 저장소는 일반적으로 문자열, 부울, 정수, 단일, double 및 datetime과 같은 비벡터 데이터 형식을 지원합니다. 또한 단일 형식 컬렉션 및 벡터 데이터 형식과 같은 컬렉션을 지원합니다. 각 열에 대해 데이터 형식 및 필드가 필터링 가능, 검색 가능 또는 검색 가능한지 여부와 같은 정보를 구성해야 합니다.
벡터 필드에 적용할 수 있는 다음 벡터 검색 구성 을 고려합니다.
벡터 검색 알고리즘:벡터 검색 알고리즘 은 상대 일치 항목을 검색합니다. AI Search에는 전체 벡터 공간을 모두 탐색하는 무차별 대입 알고리즘 옵션인 전체 k-최근접 이웃(KNN)이 있습니다. 또한 가장 가까운 인접 항목(ANN) 검색을 수행하는 HNSW(계층적 탐색 가능 Small World)라고 하는 더 성능이 뛰어난 알고리즘 옵션도 있습니다.
유사성 메트릭: 알고리즘은 유사성 메트릭 을 사용하여 근접성을 계산합니다. AI Search의 메트릭 유형에는 코사인, 점 제품 및 유클리드산이 포함됩니다. Azure OpenAI Service 포함 모델을 사용하는 경우 코사인을 선택합니다.
efConstruction
매개 변수: 이 매개 변수는 HNSW 인덱스를 작성하는 동안 사용됩니다. 인덱싱하는 동안 벡터에 연결된 가장 가까운 인접 항목의 수를 결정합니다. 값이 크efConstruction
면 더 작은 수보다 품질이 좋은 인덱스가 생성됩니다. 그러나 값이 클수록 더 많은 시간, 스토리지 및 컴퓨팅이 필요합니다. 많은 수의 청크의 경우 값을 더 높게 설정합니다efConstruction
. 적은 수의 청크의 경우 값을 낮게 설정합니다. 최적 값을 확인하려면 데이터 및 예상 쿼리를 실험합니다.efSearch
매개 변수: 이 매개 변수는 쿼리 시간 동안 검색에서 사용하는 가장 가까운 인접 항목 또는 유사한 청크의 수를 설정하는 데 사용됩니다.m
매개 변수: 이 매개 변수는 양방향 링크 수입니다. 범위는 4~10입니다. 숫자가 낮을수록 결과에서 노이즈가 줄어듭니다.
AI Search에서 벡터 설정은 vectorSearch
구성에 캡슐화됩니다. 벡터 열을 구성할 때 해당 벡터 열에 대한 적절한 구성을 참조하고 차원 수를 설정합니다. 벡터 열의 차원 특성은 포함 모델이 생성하는 차원 수를 나타냅니다. 예를 들어 스토리지에 최적화된 text-embedding-3-small 모델은 1,536개의 차원을 생성합니다.
검색 방법 선택
검색 저장소에 대해 프롬프트 오케스트레이터에서 쿼리를 실행하는 경우 다음 요소를 고려합니다.
벡터, 키워드 또는 하이브리드와 같이 수행하려는 검색 유형
하나 이상의 열에 대해 쿼리할지 여부
키워드 쿼리 및 벡터 검색과 같은 여러 쿼리를 수동으로 실행할지 여부
쿼리를 하위 쿼리로 분할해야 하는지 여부
쿼리에서 필터링을 사용해야 하는지 여부
프롬프트 오케스트레이터는 정적 접근 방식 또는 프롬프트의 컨텍스트 단서를 기반으로 하는 접근 방식을 결합하는 동적 접근 방식을 사용할 수 있습니다. 다음 섹션에서는 워크로드에 적합한 방법을 찾는 데 도움이 되는 이러한 옵션을 다룹니다.
검색 유형
검색 플랫폼은 일반적으로 전체 텍스트 및 벡터 검색을 지원합니다. AI Search와 같은 일부 플랫폼은 하이브리드 검색을 지원합니다.
벡터 검색
벡터 검색 은 벡터화된 쿼리(프롬프트)와 벡터 필드 간의 유사성을 비교합니다. 자세한 내용은 벡터 검색에 대한 Azure 서비스 선택을 참조하세요.
중요합니다
쿼리를 포함하기 전에 청크에서 수행한 것과 동일한 정리 작업을 수행해야 합니다. 예를 들어 포함된 청크의 모든 단어를 소문자로 지정한 경우 포함하기 전에 쿼리의 모든 단어를 소문자로 지정해야 합니다.
비고
동일한 쿼리에서 여러 벡터 필드에 대해 벡터 검색을 수행할 수 있습니다. AI Search에서 이 방법은 하이브리드 검색으로 간주됩니다. 자세한 내용은 하이브리드 검색을 참조하세요.
다음 샘플 코드는 contentVector 필드에 대해 벡터 검색을 수행합니다.
embedding = embedding_model.generate_embedding(
chunk=str(pre_process.preprocess(query))
)
vector = RawVectorQuery(
k=retrieve_num_of_documents,
fields="contentVector",
vector=embedding,
)
results = client.search(
search_text=None,
vector_queries=[vector],
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
쿼리를 포함하는 코드는 먼저 쿼리를 전처리합니다. 해당 전처리는 포함하기 전에 청크를 전처리하는 동일한 코드여야 합니다. 청크를 임베딩하는 데 사용한 동일한 임베딩 모델을 사용해야 합니다.
전체 텍스트 검색
전체 텍스트 검색 은 인덱스에 저장된 일반 텍스트와 일치합니다. 쿼리에서 키워드를 추출하고 하나 이상의 인덱싱된 열에 대해 전체 텍스트 검색에서 추출된 키워드를 사용하는 것이 일반적입니다. 용어 또는 모든 용어가 일치하는 경우 일치 항목을 반환하도록 전체 텍스트 검색을 구성할 수 있습니다.
전체 텍스트 검색을 실행할 필드를 결정하기 위한 실험을 진행합니다. 보강 단계 문서에 설명된 대로 콘텐츠의 의미 체계는 비슷하지만 엔터티 또는 키워드가 다른 시나리오에서는 전체 텍스트 검색에 키워드 및 엔터티 메타데이터 필드를 사용해야 합니다. 전체 텍스트 검색을 위해 고려해야 할 다른 일반적인 필드에는 제목, 요약 및 청크 텍스트가 포함됩니다.
다음 샘플 코드는 제목, 콘텐츠 및 요약 필드에 대해 전체 텍스트 검색을 수행합니다.
formatted_search_results = []
results = client.search(
search_text=query,
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
formatted_search_results = format_results(results)
하이브리드 검색
AI Search는 하나 이상의 텍스트 검색과 하나 이상의 벡터 검색을 포함하는 하이브리드 쿼리 를 지원합니다. 플랫폼은 각 쿼리를 수행하고, 중간 결과를 가져오고, 상호 순위 Fusion을 사용하여 결과를 다시 표시하고, 상위 N 개 결과를 반환합니다.
다음 샘플 코드는 제목, 콘텐츠 및 요약 필드에 대해 전체 텍스트 검색을 수행합니다. 또한 contentVector 및 questionVector 필드에 대해 벡터 검색을 수행합니다. AI Search는 모든 쿼리를 병렬로 실행하고 결과를 재정렬하며 최상위 retrieve_num_of_documents을 반환합니다.
embedding = embedding_model.generate_embedding(
chunk=str(pre_process.preprocess(query))
)
vector1 = RawVectorQuery(
k=retrieve_num_of_documents,
fields="contentVector",
vector=embedding,
)
vector2 = RawVectorQuery(
k=retrieve_num_of_documents,
fields="questionVector",
vector=embedding,
)
results = client.search(
search_text=query,
vector_queries=[vector1, vector2],
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
여러 개의 수동 쿼리
벡터 검색 및 키워드 전체 텍스트 검색과 같은 여러 쿼리를 수동으로 실행할 수 있습니다. 결과를 집계하고, 결과를 수동으로 다시 표시 하고, 상위 결과를 반환합니다. 수동 여러 쿼리에 대해 다음 사용 사례를 고려합니다.
하이브리드 검색을 지원하지 않는 검색 플랫폼을 사용합니다. 수동 여러 쿼리를 사용하여 고유한 하이브리드 검색을 수행합니다.
다른 쿼리에 대해 전체 텍스트 검색을 실행하려고 합니다. 예를 들어 쿼리에서 키워드를 추출하고 키워드 메타데이터 필드에 대해 전체 텍스트 검색을 실행할 수 있습니다. 그런 다음 엔터티를 추출하고 엔터티 메타데이터 필드에 대해 쿼리를 실행할 수 있습니다.
재랜킹 프로세스를 제어하려고 합니다.
쿼리를 수행하려면 분해된 하위 쿼리 를 실행하여 여러 원본에서 접지 데이터를 검색해야 합니다.
쿼리 변환
쿼리 변환은 RAG 솔루션의 정보 검색 단계에서 선택적 단계입니다. 이 단계에서는 쿼리를 최적화된 형식으로 변환하거나 번역하여 더 나은 결과를 검색합니다. 쿼리 변환 방법에는 확대, 분해, 다시 쓰기 및 HyDE(가상 문서 포함)가 포함됩니다.
쿼리 확대
쿼리 확대는 쿼리를 더 간단하고 더 쉽게 사용할 수 있게 하고 컨텍스트를 향상시키는 변환 단계입니다. 쿼리가 작거나 모호한 경우 확대를 고려해야 합니다. 예를 들어 "Microsoft의 수익 비교" 쿼리를 고려해 보세요. 해당 쿼리는 비교할 시간 프레임 또는 시간 단위를 포함하지 않으며 수입만 지정합니다. "현재 연도의 Microsoft 수익과 수익을 분기별 작년과 비교"와 같은 쿼리의 보강된 버전을 고려합니다. 새 쿼리는 명확하고 구체적입니다.
쿼리를 보강하면 원래 쿼리를 유지 관리하지만 컨텍스트를 더 추가합니다. 원래 쿼리를 제거하거나 변경하지 말고 쿼리의 특성을 변경하지 마세요.
언어 모델을 사용하여 쿼리를 보강할 수 있습니다. 그러나 모든 쿼리를 보강할 수는 없습니다. 컨텍스트가 있는 경우 언어 모델에 전달하여 쿼리를 보강할 수 있습니다. 컨텍스트가 없는 경우 언어 모델에 쿼리를 보강하는 데 사용할 수 있는 정보가 있는지 확인해야 합니다. 예를 들어 GPT 모델과 같은 큰 언어 모델을 사용하는 경우 쿼리에 대한 정보를 인터넷에서 쉽게 사용할 수 있는지 여부를 확인할 수 있습니다. 이 경우 모델을 사용하여 쿼리를 보강할 수 있습니다. 그렇지 않으면 쿼리를 보강해서는 안 됩니다.
다음 프롬프트에서 언어 모델은 쿼리를 보강합니다. 이 프롬프트에는 쿼리에 컨텍스트가 있고 그렇지 않은 경우에 대한 예제가 포함됩니다. 자세한 내용은 RAG 실험 가속기 GitHub 리포지토리를 참조하세요.
Input Processing:
Analyze the input query to identify the core concept or topic.
Check whether the query provides context.
If context is provided, use it as the primary basis for augmentation and explanation.
If no context is provided, determine the likely domain or field, such as science, technology, history, or arts, based on the query.
Query Augmentation:
If context is provided:
Use the given context to frame the query more specifically.
Identify other aspects of the topic not covered in the provided context that enrich the explanation.
If no context is provided, expand the original query by adding the following elements, as applicable:
Include definitions about every word, such as adjective or noun, and the meaning of each keyword, concept, and phrase including synonyms and antonyms.
Include historical context or background information, if relevant.
Identify key components or subtopics within the main concept.
Request information about practical applications or real-world relevance.
Ask for comparisons with related concepts or alternatives, if applicable.
Inquire about current developments or future prospects in the field.
Other Guidelines:
Prioritize information from provided context when available.
Adapt your language to suit the complexity of the topic, but aim for clarity.
Define technical terms or jargon when they're first introduced.
Use examples to illustrate complex ideas when appropriate.
If the topic is evolving, mention that your information might not reflect the very latest developments.
For scientific or technical topics, briefly mention the level of scientific consensus if relevant.
Use Markdown formatting for better readability when appropriate.
Example Input-Output:
Example 1 (With provided context):
Input: "Explain the impact of the Gutenberg Press"
Context Provided: "The query is part of a discussion about revolutionary inventions in medieval Europe and their long-term effects on society and culture."
Augmented Query: "Explain the impact of the Gutenberg Press in the context of revolutionary inventions in medieval Europe. Cover its role in the spread of information, its effects on literacy and education, its influence on the Reformation, and its long-term impact on European society and culture. Compare it to other medieval inventions in terms of societal influence."
Example 2 (Without provided context):
Input: "Explain CRISPR technology"
Augmented Query: "Explain CRISPR technology in the context of genetic engineering and its potential applications in medicine and biotechnology. Cover its discovery, how it works at a molecular level, its current uses in research and therapy, ethical considerations surrounding its use, and potential future developments in the field."
Now, provide a comprehensive explanation based on the appropriate augmented query.
Context: {context}
Query: {query}
Augmented Query:
분해
복잡한 쿼리는 모델을 접지하기 위해 둘 이상의 데이터 컬렉션이 필요합니다. 예를 들어 "전기 자동차가 작동하는 방식과 ICE(내부 연소 엔진) 차량과 비교하는 방법"이라는 쿼리에는 여러 원본의 접지 데이터가 필요할 수 있습니다. 한 소식통은 전기 자동차의 작동 방식을 설명할 수 있으며, 다른 소식통은 전기 자동차를 ICE 차량과 비교합니다.
분해는 복잡한 쿼리를 더 작고 간단한 여러 하위 쿼리로 분할하는 프로세스입니다. 분해된 각 쿼리를 독립적으로 실행하고 분해된 모든 쿼리의 상위 결과를 누적된 컨텍스트로 집계합니다. 그런 다음, 누적된 컨텍스트를 언어 모델에 전달하는 원래 쿼리를 실행합니다.
검색을 실행하기 전에 쿼리에 여러 검색이 필요한지 여부를 결정해야 합니다. 여러 하위 쿼리가 필요한 경우 모든 쿼리에 대해 수동으로 여러 쿼리를 실행할 수 있습니다. 언어 모델을 사용하여 여러 하위 쿼리가 권장되는지 여부를 확인합니다.
다음 프롬프트는 쿼리를 단순하거나 복잡한 것으로 분류합니다. 자세한 내용은 RAG 실험 가속기 GitHub 리포지토리를 참조하세요.
Consider the given question to analyze and determine whether it falls into one of these categories:
1. Simple, factual question
a. The question asks for a straightforward fact or piece of information.
b. The answer can likely be found stated directly in a single passage of a relevant document.
c. Breaking the question down further is unlikely to be beneficial.
Examples: "What year did World War 2 end?", "What is the capital of France?", "What are the features of productX?"
2. Complex, multipart question
a. The question has multiple distinct components or asks for information about several related topics.
b. Different parts of the question likely need to be answered by separate passages or documents.
c. Breaking the question down into subquestions for each component provides better results.
d. The question is open-ended and likely to have a complex or nuanced answer.
e. Answering the question might require synthesizing information from multiple sources.
f. The question might not have a single definitive answer and could warrant analysis from multiple angles.
Examples: "What were the key causes, major battles, and outcomes of the American Revolutionary War?", "How do electric cars work and how do they compare to gas-powered vehicles?"
Based on this rubric, does the given question fall under category 1 (simple) or category 2 (complex)? The output should be in strict JSON format. Ensure that the generated JSON is 100% structurally correct, with proper nesting, comma placement, and quotation marks. There shouldn't be a comma after the last element in the JSON.
Example output:
{
"category": "simple"
}
언어 모델을 사용하여 복잡한 쿼리를 분해할 수도 있습니다. 다음 프롬프트는 복잡한 쿼리를 분해합니다. 자세한 내용은 RAG 실험 가속기 GitHub 리포지토리를 참조하세요.
Analyze the following query:
For each query, follow these specific instructions:
- Expand the query to be clear, complete, fully qualified, and concise.
- Identify the main elements of the sentence, typically a subject, an action or relationship, and an object or complement. Determine which element is being asked about or emphasized (usually the unknown or focus of the question). Invert the sentence structure. Make the original object or complement the new subject. Transform the original subject into a descriptor or qualifier. Adjust the verb or relationship to fit the new structure.
- Break the query down into a set of subqueries that have clear, complete, fully qualified, concise, and self-contained propositions.
- Include another subquery by using one more rule: Identify the main subject and object. Swap their positions in the sentence. Adjust the wording to make the new sentence grammatically correct and meaningful. Ensure that the new sentence asks about the original subject.
- Express each idea or fact as a standalone statement that can be understood with the help of the given context.
- Break down the query into ordered subquestions, from least to most dependent.
- The most independent subquestion doesn't require or depend on the answer to any other subquestion or prior knowledge.
- Try having a complete subquestion that has all information only from the base query. There's no other context or information available.
- Separate complex ideas into multiple simpler propositions when appropriate.
- Decontextualize each proposition by adding necessary modifiers to nouns or entire sentences. Replace pronouns, such as it, he, she, they, this, and that, with the full name of the entities that they refer to.
- If you still need more questions, the subquestion isn't relevant and should be removed.
Provide your analysis in the following YAML format, and strictly adhere to the following structure. Don't output anything extra, including the language itself.
type: interdependent
queries:
- [First query or subquery]
- [Second query or subquery, if applicable]
- [Third query or subquery, if applicable]
- ...
Examples:
1. Query: "What is the capital of France?"
type: interdependent
queries:
- What is the capital of France?
2. Query: "Who is the current CEO of the company that created the iPhone?"
type: interdependent
queries:
- Which company created the iPhone?
- Who is the current CEO of Apple? (identified in the previous question)
3. Query: "What is the population of New York City, and what is the tallest building in Tokyo?"
type: multiple_independent
queries:
- What is the population of New York City?
- What is the tallest building in Tokyo?
Now, analyze the following query:
{query}
재작성
입력 쿼리가 접지 데이터를 검색하는 데 최적의 형식이 아닐 수 있습니다. 언어 모델을 사용하여 쿼리를 다시 작성하고 더 나은 결과를 얻을 수 있습니다. 쿼리를 다시 작성하여 다음 문제를 해결합니다.
- 모호함
- 누락된 키워드
- 불필요한 단어
- 불분명한 의미 체계
다음 프롬프트는 언어 모델을 사용하여 쿼리를 다시 작성합니다. 자세한 내용은 RAG 실험 가속기 GitHub 리포지토리를 참조하세요.
Rewrite the given query to optimize it for both keyword-based and semantic-similarity search methods. Follow these guidelines:
- Identify the core concepts and intent of the original query.
- Expand the query by including relevant synonyms, related terms, and alternate phrasings.
- Maintain the original meaning and intent of the query.
- Include specific keywords that are likely to appear in relevant documents.
- Incorporate natural language phrasing to capture semantic meaning.
- Include domain-specific terminology if applicable to the query's context.
- Ensure that the rewritten query covers both broad and specific aspects of the topic.
- Remove ambiguous or unnecessary words that might confuse the search.
- Combine all elements into a single, coherent paragraph that flows naturally.
- Aim for a balance between keyword richness and semantic clarity.
Provide the rewritten query as a single paragraph that incorporates various search aspects, such as keyword-focused, semantically focused, or domain-specific aspects.
query: {original_query}
HyDE 기술
HyDE 는 RAG 솔루션에 대한 대체 정보 검색 기술입니다. 쿼리를 포함으로 변환하고 이러한 포함을 사용하여 벡터 데이터베이스에서 가장 가까운 일치 항목을 찾는 대신 HyDE는 언어 모델을 사용하여 쿼리에서 답변을 생성합니다. 이러한 답변은 가장 가까운 일치 항목을 찾는 데 사용되는 임베딩(embeddings)으로 변환됩니다. 이 과정을 통해 HyDE는 답변 간 임베딩 유사성 검색을 수행할 수 있습니다.
여러 개의 쿼리 번역을 하나의 파이프라인으로 결합
여러 쿼리 번역을 사용할 수 있습니다. 이러한 4개의 번역을 모두 함께 사용할 수도 있습니다. 다음 다이어그램에서는 이러한 번역을 파이프라인으로 결합하는 방법의 예를 보여 줍니다.
파이프라인에는 다음 단계가 있습니다.
선택적 쿼리 보강자 단계는 원래 쿼리를 받습니다. 이 단계에서는 원래 쿼리와 보강된 쿼리를 출력합니다.
선택적 쿼리 디컴포저 단계는 보강된 쿼리를 받습니다. 이 단계에서는 원래 쿼리, 보강된 쿼리 및 분해된 쿼리를 출력합니다.
분해된 각 쿼리는 세 개의 하위 단계가 수행됩니다. 분해된 모든 쿼리가 하위 단계를 통과한 후 출력에는 원래 쿼리, 보강된 쿼리, 분해된 쿼리 및 누적된 컨텍스트가 포함됩니다. 누적된 컨텍스트에는 하위 단계를 통과하는 모든 분해된 쿼리에서 상위 N 개 결과의 집계가 포함됩니다. 하위 단계는 다음 작업을 포함합니다.
선택적 쿼리 다시 작성기는 분해된 쿼리를 다시 작성합니다.
검색 인덱스가 다시 작성된 쿼리 또는 원래 쿼리를 처리합니다. 벡터, 전체 텍스트, 하이브리드 또는 수동 다중 검색 형식을 사용하여 쿼리를 실행합니다. 검색 인덱스도 HyDE와 같은 고급 쿼리 기능을 사용할 수 있습니다.
결과가 다시 재정렬됩니다. 상위 N 개의 재랭킹 결과가 누적된 문맥에 추가됩니다.
원래 쿼리는 누적된 컨텍스트와 함께 각 분해된 쿼리와 동일한 세 개의 하위 단계를 수행합니다. 그러나 하나의 쿼리만 단계를 거치고 호출자는 상위 N 개의 결과를 받습니다.
쿼리에 이미지 전달
GPT-4V 및 GPT-4o와 같은 일부 멀티모달 모델은 이미지를 해석할 수 있습니다. 이러한 모델을 사용하는 경우 이미지 청크를 방지하고 프롬프트의 일부로 이미지를 다중 모달 모델에 전달할 수 있습니다. 추가 컨텍스트를 전달하지 않고 이미지를 청크 분할하는 것과 비교하여 이 방법이 어떻게 수행되는지 실험해야 합니다. 또한 비용 차이를 비교하고 비용 혜택 분석을 수행해야 합니다.
쿼리 필터링
쿼리를 필터링하려면 필터링 가능한 것으로 구성된 검색 저장소의 필드를 사용할 수 있습니다. 해당 필드를 사용하여 결과의 범위를 좁히는 데 도움이 되는 쿼리에 대한 키워드 및 엔터티를 필터링하는 것이 좋습니다. 필터링을 사용하여 관련 없는 데이터를 제거합니다. 인덱스에서 특정 조건을 충족하는 데이터만 검색합니다. 이 방법은 쿼리의 전반적인 성능을 향상시키고 더 관련성이 뛰어난 결과를 제공합니다. 필터링이 시나리오에 유익한지 여부를 확인하려면 실험 및 테스트를 수행합니다. 키워드가 없거나 정확하지 않은 키워드, 약어 또는 머리글자어가 있는 쿼리와 같은 요소를 고려합니다.
가중치 필드
AI Search에서 조건에 따라 결과의 순위에 영향을 주는 필드의 가중치를 지정할 수 있습니다.
비고
이 섹션에서는 AI Search 가중치 기능에 대해 설명합니다. 다른 데이터 플랫폼을 사용하는 경우 해당 플랫폼의 가중치 기능을 조사합니다.
AI Search는 숫자 데이터에 대한 가중치 필드 및 함수에 대한 매개 변수를 포함하는 점수 매기기 프로필을 지원합니다. 점수 매기기 프로필은 비벡터 필드에만 적용됩니다. 벡터 및 하이브리드 검색에 대한 지원은 미리 보기로 제공됩니다. 인덱스에 여러 채점 프로필을 만들고 필요에 따라 쿼리별로 하나를 사용하도록 선택할 수 있습니다.
가중치를 지정하는 필드는 쿼리 유형 및 사용 사례에 따라 달라집니다. 예를 들어 쿼리가 키워드 중심인 경우(예: "Microsoft 본사 위치는 어디인가요?") 엔터티 또는 키워드 필드의 가중치를 더 높게 지정하는 점수 매기기 프로필을 원합니다. 다른 사용자에 대해 다른 프로필을 사용하거나, 사용자가 포커스를 선택하도록 허용하거나, 애플리케이션에 따라 프로필을 선택할 수 있습니다.
프로덕션 시스템에서는 프로덕션 환경에서 적극적으로 사용하는 프로필만 유지 관리해야 합니다.
재랜킹 사용
재랜킹을 사용하여 하나 이상의 쿼리를 실행하고, 결과를 집계하고, 해당 결과의 순위를 지정합니다. 검색 결과를 다시 표시하면 도움이 되는 다음 시나리오를 고려하세요.
수동으로 여러 검색을 수행했으며 결과를 집계하고 순위를 지정하려고 합니다.
벡터 및 키워드 검색이 항상 정확한 것은 아닙니다. 검색에서 반환하는 문서 수를 늘려 무시될 수 있는 유효한 결과를 포함하고, 결과의 품질을 평가하기 위해 재랭킹을 사용하려고 합니다.
언어 모델 또는 크로스 인코더를 사용하여 재순위 매김을 수행할 수 있습니다. AI Search와 같은 일부 플랫폼에는 결과를 재정렬하는 독점적인 방법이 있습니다. 데이터에 대해 이러한 옵션을 평가하여 시나리오에 가장 적합한 항목을 결정할 수 있습니다. 다음 섹션에서는 이러한 메서드에 대한 세부 정보를 제공합니다.
언어 모델 재순위 매김
다음 샘플 언어 모델 프롬프트는 결과를 다시 순위를 매깁니다. 자세한 내용은 RAG 실험 가속기를 참조하세요.
Each document in the following list has a number next to it along with a summary of the document. A question is also provided.
Respond with the numbers of the documents that you should consult to answer the question, in order of relevance, and the relevance score as a JSON string based on JSON format as shown in the schema section. The relevance score is a number from 1 to 10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any other text, explanation, or metadata apart from the JSON string. Just output the JSON string, and strip every other text. Strictly remove the last comma from the nested JSON elements if it's present.
Don't include any documents that aren't relevant to the question. There should be exactly one document element.
Example format:
Document 1:
content of document 1
Document 2:
content of document 2
Document 3:
content of document 3
Document 4:
content of document 4
Document 5:
content of document 5
Document 6:
content of document 6
Question: user-defined question
schema:
{
"documents": {
"document_1": "Relevance",
"document_2": "Relevance"
}
}
크로스 인코더 재정렬
다음 예제에서는 Hugging Face에서 제공하는 크로스 인코더를 사용하여 Roberta 모델을 로드합니다. 각 청크를 순차적으로 반복하며, 모델을 사용하여 유사성을 계산하고 그 결과로 값을 제공합니다. 결과를 정렬하고 상위 N 결과를 반환합니다. 자세한 내용은 RAG 실험 가속기 GitHub 리포지토리를 참조하세요.
from sentence_transformers import CrossEncoder
...
model_name = 'cross-encoder/stsb-roberta-base'
model = CrossEncoder(model_name)
cross_scores_ques = model.predict(
[[user_prompt, item] for item in documents],
apply_softmax=True,
convert_to_numpy=True,
)
top_indices_ques = cross_scores_ques.argsort()[-k:][::-1]
sub_context = []
for idx in list(top_indices_ques):
sub_context.append(documents[idx])
의미 기반 순위
AI Search에는 의미 체계 순위라는 독점 기능이 있습니다. 이 기능은 의미상 가장 관련성이 높은 결과를 촉진하는 Microsoft Bing에서 조정된 딥 러닝 모델을 사용합니다. 자세한 내용은 의미 체계 순위의 작동 방식을 참조하세요.
다른 검색 지침 고려
검색 솔루션을 구현할 때 다음 일반적인 지침을 고려합니다.
검색에서 제목, 요약, 원본 및 부정한 원시 콘텐츠 필드를 반환합니다.
쿼리를 하위 쿼리로 분할해야 하는지 여부를 미리 결정합니다.
여러 필드에서 벡터 및 텍스트 쿼리를 실행합니다. 쿼리를 받으면 벡터 검색 또는 텍스트 검색이 더 나은지 알 수 없습니다. 또한 벡터 검색 또는 키워드 검색에서 검색해야 하는 이상적인 필드를 알 수 없습니다. 여러 쿼리를 사용하여 여러 필드를 검색하고, 결과를 다시 표시하고, 점수가 가장 높은 결과를 반환할 수 있습니다.
키워드 및 엔터티 필드를 필터링하여 결과의 범위를 좁힐 수 있습니다.
벡터 검색과 함께 키워드를 사용합니다. 키워드는 결과를 더 작은 하위 집합으로 필터링합니다. 벡터 저장소는 해당 하위 집합에 대해 작동하여 가장 일치하는 항목을 찾습니다.
검색 결과 평가
준비 단계에서 테스트 문서 정보와 함께 테스트 쿼리를 수집했습니다. 해당 단계에서 수집한 다음 정보를 사용하여 검색 결과를 평가할 수 있습니다.
- 쿼리: 샘플 쿼리
- 컨텍스트: 샘플 쿼리를 처리하는 테스트 문서의 모든 텍스트 컬렉션
검색 솔루션을 평가하려면 다음과 같은 잘 설정된 검색 평가 방법을 사용할 수 있습니다.
K의 정밀도: 전체 검색 결과에서 올바르게 식별된 관련 항목의 백분율입니다. 이 메트릭은 검색 결과의 정확도에 중점을 둡니다.
K에서 재현율: 전체 가능한 관련 항목 중 상위 K에 위치한 관련 항목의 백분율입니다. 이 메트릭은 검색 결과 검사에 중점을 둡니다.
MRR(평균 상호 순위): 순위가 지정된 검색 결과에서 첫 번째 관련 답변의 상호 순위 평균입니다. 이 메트릭은 검색 결과에서 첫 번째 관련 결과가 발생하는 위치에 중점을 둡니다.
긍정 및 부정 예제를 테스트해야 합니다. 긍정적인 예제의 경우 메트릭을 가능한 한 1에 가깝게 지정하려고 합니다. 데이터가 쿼리를 처리할 수 없는 부정적인 예제의 경우 메트릭을 가능한 0에 가깝게 지정하려고 합니다. 모든 테스트 쿼리를 테스트해야 합니다. 긍정 쿼리 결과와 음수 쿼리 결과를 평균화하여 검색 결과가 집계에서 어떻게 수행되는지 이해합니다.