Redigera

Dela via


Informationssökning

Azure AI services
Azure AI Search
Azure OpenAI Service
Azure Machine Learning

När du har genererat inbäddningarna för dina segment är nästa steg att generera indexet i vektordatabasen och experimentera för att fastställa de optimala sökningar som ska utföras. När du experimenterar med informationshämtning finns det flera områden att tänka på, inklusive konfigurationsalternativ för sökindexet, vilka typer av sökningar du bör utföra och din omrankningsstrategi. Den här artikeln beskriver dessa tre ämnen.

Den här artikeln ingår i en serie. Läs introduktionen.

Sökindex

Kommentar

Azure AI Search är en Azure-söktjänst från första part. I det här avsnittet beskrivs några detaljer för AI Search. Om du använder ett annat arkiv kan du läsa dokumentationen för att hitta nyckelkonfigurationen för den tjänsten.

Sökindexet i ditt lager har en kolumn för varje fält i dina data. Söklager har vanligtvis stöd för datatyper som inte är datatyper som sträng, booleskt värde, heltal, enkel, dubbel, datetime och samlingar som Samling(enkel) och vektordatatyper som Samling(enkel). För varje kolumn måste du konfigurera information , till exempel datatypen, om fältet är filterbart, hämtningsbart och/eller sökbart.

Följande är några viktiga beslut som du måste fatta för vektorsökningskonfigurationen som tillämpas på vektorfält:

  • Vektorsökningsalgoritm – Algoritmen som används för att söka efter relativa matchningar. Azure AI Search har ett brute-force-algoritmalternativ som söker igenom hela vektorutrymmet som kallas fullständig KNN och ett mer högpresterande algoritmalternativ som utför en ungefärlig sökning med närmaste granne (ANN) med namnet Hierarchical Navigable Small World (HNSW).
  • metric – Den här konfigurationen är likhetsmåttet som används för att beräkna närliggande algoritmen. Alternativen i Azure AI Search är cosinus, dotProduct och Euclidean. Om du använder Inbäddningsmodeller för Azure OpenAI väljer du cosine.
  • efConstruction – Parameter som används under HNSW-indexkonstruktionen (Hierarchical Navigable Small Worlds) som anger antalet närmaste grannar som är anslutna till en vektor under indexeringen. Ett större efConstruction-värde resulterar i ett index av bättre kvalitet än ett mindre tal. Kompromissen är att ett större värde kräver mer tid, lagring och beräkning. efConstruction bör vara högre för ett stort antal segment och lägre för ett lågt antal segment. För att fastställa det optimala värdet krävs experimentering med dina data och förväntade frågor.
  • efSearch – parameter som används vid frågetillfället för att ange antalet närmaste grannar (dvs. liknande segment) som används under sökningen.
  • m – Antalet dubbelriktade länkar. Intervallet är 4 till 10, med lägre tal som returnerar mindre brus i resultaten.

I Azure AI Search kapslas vektorkonfigurationerna in i en vectorSearch konfiguration. När du konfigurerar vektorkolumnerna refererar du till lämplig konfiguration för den vektorkolumnen och anger antalet dimensioner. Vektorkolumnens dimensionsattribut representerar antalet dimensioner som genereras av den inbäddningsmodell som du har valt. Till exempel genererar den lagringsoptimerade text-embedding-3-small modellen 1 536 dimensioner.

Sökningar

När du kör frågor från din promptorkestrerare mot sökarkivet har du många alternativ att tänka på. Du måste fastställa följande:

  • Vilken typ av sökning du ska utföra: vektor eller nyckelord eller hybrid
  • Oavsett om du ska köra frågor mot en eller flera kolumner
  • Om du ska köra flera frågor manuellt, till exempel en nyckelordsfråga och en vektorsökning
  • Om frågan behöver delas upp i underfrågor
  • Om filtrering ska användas i dina frågor

Din uppmaningsorkestrerare kan ha en statisk metod eller en dynamisk metod som blandar metoderna baserat på kontext ledtrådar från prompten. I följande avsnitt beskrivs de här alternativen som hjälper dig att experimentera för att hitta rätt metod för din arbetsbelastning.

Söktyper

Sökplattformar stöder vanligtvis fulltext- och vektorsökningar. Vissa plattformar, till exempel Azure AI Search, stöder hybridsökningar. Om du vill se funktionerna i olika vektorsökningserbjudanden läser du Välj en Azure-tjänst för vektorsökning.

Vektorsökningar matchar likheten mellan den vektoriserade frågan (prompt) och vektorfälten.

Viktigt!

Du bör utföra samma rensningsåtgärder som du utförde i segment innan du bäddar in frågan. Om du till exempel har sänkt varje ord i ditt inbäddade segment bör du ge varje ord i frågan gemener innan du bäddar in.

Kommentar

Du kan utföra en vektorsökning mot flera vektorfält i samma fråga. I Azure AI Search är det tekniskt sett en hybridsökning. Mer information finns i det avsnittet.

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"],
)

Exempelkoden utför en vektorsökning mot fältet contentVector . Observera att koden som bäddar in frågan förbearbetar frågan först. Den förbearbetningen bör vara samma kod som förbearbetar segmenten före inbäddning. Inbäddningsmodellen måste vara samma inbäddningsmodell som inbäddade segmenten.

Fulltextsökningar matchar oformaterad text som lagras i ett index. Det är vanligt att extrahera nyckelord från en fråga och använda de extraherade nyckelorden i en fulltextsökning mot en eller flera indexerade kolumner. Fulltextsökningar kan konfigureras för att returnera matchningar där alla villkor eller villkor matchar.

Du måste experimentera för att avgöra vilka fält som är effektiva att köra fulltextsökningar mot. Som beskrivs i berikningsfasen är fälten för nyckelord och entitetsmetadata bra kandidater att överväga för fulltextsökning i scenarier där innehållet har liknande semantisk betydelse, men entiteter eller nyckelord skiljer sig åt. Andra vanliga fält att tänka på för fulltextsökning är rubrik, sammanfattning och segmenttext.

formatted_search_results = []

results = client.search(
    search_text=query,
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

formatted_search_results = format_results(results)

Exempelkoden utför en fulltextsökning mot fälten rubrik, innehåll och sammanfattning.

Azure AI Search stöder hybridfrågor där din fråga kan innehålla en eller flera textsökningar och en eller flera vektorsökningar. Plattformen utför varje fråga, hämtar mellanliggande resultat, rangordnar om resultaten med hjälp av Reciprocal Rank Fusion (RRF) och returnerar de främsta N-resultaten.

 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"],
)

Exempelkoden utför en fulltextsökning mot fälten rubrik, innehåll och sammanfattning och vektorsökningar mot fälten contentVector och questionVector. Azure AI Search-plattformen kör alla frågor parallellt, återställer resultaten och returnerar de översta retrieve_num_of_documents dokumenten.

Manuell multipel

Du kan naturligtvis köra flera frågor, till exempel en vektorsökning och en fulltextsökning med nyckelord manuellt. Du aggregerar resultaten och rankar resultatet manuellt och returnerar de bästa resultaten. Följande är användningsfall för manuell multipel:

  • Du använder en sökplattform som inte stöder hybridsökningar. Du skulle följa det här alternativet för att utföra din egen hybridsökning.
  • Du vill köra fulltextsökningar mot olika frågor. Du kan till exempel extrahera nyckelord från frågan och köra en fulltextsökning mot nyckelordens metadatafält. Du kan sedan extrahera entiteter och köra en fråga mot metadatafältet entiteter.
  • Du vill styra omrankningsprocessen själv.
  • Frågan kräver uppdelade underfrågor köras för att hämta jordningsdata från flera källor.

Frågeöversättning

Frågeöversättning är ett valfritt steg i hämtningsfasen för information i en RAG-lösning. I översättningssteget omvandlas eller översätts en fråga till ett formulär som är optimerat för att hämta bättre resultat. Det finns många former av frågeöversättning, inklusive de fyra som behandlas i den här artikeln: förhöjdhet, nedbrytning, omskrivning och hyDE (Hypothetical Document Embeddings).

Frågeförstoring

Frågeförstoring är ett översättningssteg där målet är att göra frågan enklare, mer användbar och att förbättra kontexten. Du bör överväga förhöjdhet om frågan är för liten eller vag. Tänk till exempel på frågan: "Jämför Intäkter för Microsoft." Frågan är vag. Du nämnde inte tidsramar eller tidsenheter att jämföra och endast angivna intäkter. Överväg nu en förhöjd version av frågan: "Jämför intäkter och intäkter för Microsofts nuvarande år jämfört med förra året efter kvartal." Den nya frågan är tydlig och specifik.

När du utökar en fråga behåller du den ursprungliga frågan, men lägger till mer kontext. Det skadar inte att utöka en fråga så länge du inte tar bort eller ändrar den ursprungliga frågan och du inte ändrar frågans natur.

Du kan använda en språkmodell för att utöka frågan. Alla frågor kan dock inte utökas. Om du har en kontext kan du skicka den vidare till din språkmodell för att utöka frågan. Om du inte har någon kontext måste du avgöra om det finns information i din språkmodell som kan vara användbar för att utöka frågan. Om du till exempel använder en stor språkmodell som en av GPT-modellerna kan du avgöra om det finns information som är lätt tillgänglig på Internet om frågan. I så fall kan du använda modellen för att utöka frågan. Annars bör du inte utöka frågan.

Följande fråga tas från github-lagringsplatsen RAG Experiment Accelerator som visar en språkmodell som används för att utöka en fråga.

Input Processing:

Analyze the input query to identify the core concept or topic.
Check if any context is provided with the query.
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 (e.g., science, technology, history, arts, etc.) based on the query.

Query Augmentation:
If context is provided:

Use the given context to frame the query more specifically.
Identify any additional aspects of the topic not covered in the provided context that would enrich the explanation.

If no context is provided, expand the original query by adding the following elements, as applicable:

Include definitions about every word (adjective, noun etc) and meaning of each keyword, concept and phrase including synonyms and antonyms.
Include historical context or background information if relevant.
Identify key components or sub-topics within the main concept.
Request information on 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.

Additional 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 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:

Observera att det finns exempel på när kontexten är och inte finns.

Nedbrytning

Vissa frågor är komplexa och kräver mer än en datainsamling för att grunda modellen. Frågan "Hur fungerar elbilar och hur jämför de med ICE-fordon?" kräver till exempel sannolikt grunddata från flera källor. En källa kan beskriva hur elbilar fungerar, där en annan jämför dem med fordon med förbränningsmotor (ICE).

Nedbrytning är processen att dela upp en komplex fråga i flera mindre och enklare underfrågor. Du kör var och en av de uppdelade frågorna oberoende av varandra och aggregerar de främsta resultaten av alla de uppdelade frågorna som en ackumulerad kontext. Sedan kör du den ursprungliga frågan och skickar den ackumulerade kontexten till språkmodellen.

Det är bra att avgöra om frågan kräver flera sökningar innan du kör några sökningar. Om du anser att flera underfrågor krävs kan du köra manuella flera frågor för alla frågor. Använd en språkmodell för att avgöra om flera underfrågor rekommenderas. Följande fråga hämtas från GITHub-lagringsplatsen för RAG-experimentacceleratorn som används för att kategorisera en fråga som enkel eller komplex, med komplexa krav på flera frågor:

Consider the given question to analyze and determine if it falls into one of these categories:
1. Simple, factual question
  a. The question is asking for a straightforward fact or piece of information
  b. The answer could 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 is the features of productX?"
2. Complex, multi-part question
  a. The question has multiple distinct components or is asking for information about several related topics
  b. Different parts of the question would likely need to be answered by separate passages or documents
  c. Breaking the question down into sub-questions for each component would allow for better results
  d. The question is open-ended and likely to have a complex or nuanced answer
  e. Answering it may require synthesizing information from multiple sources
  f. The question may 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 percent structurally correct, with proper nesting, comma placement, and quotation marks. There should not be any comma after last element in the JSON.

Example output:
{
  "category": "simple"
}

En språkmodell kan också användas för att dela upp en komplex fråga. Följande fråga hämtas från github-lagringsplatsen RAG Experiment Accelerator som delar upp en komplex fråga.

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 sub-queries with clear, complete, fully qualified, concise and self-contained propositions.
- Include an addition sub-query 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 the new sentence asks about the original subject.
- Express each idea or fact as a standalone statement that can be understood with help of given context.
- Break down the query into ordered sub-questions, from least to most dependent.
- The most independent sub-question does not requires or dependend on the answer to any other sub-question or prior knowledge.
- Try having a complete sub-question having all information only from base query. There is no additional 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 (e.g., "it", "he", "she", "they", "this", "that") with the full name of the entities they refer to.
- if you still need more question, the sub-question is not relevant and should be removed.


Provide your analysis in the following YAML format strictly adhering to the structure below and do not output anything extra including the language itself:

type: interdependent
queries:
- [First query or sub-query]
- [Second query or sub-query, if applicable]
- [Third query or sub-query, 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 the Apple(identified in the previous question) company ?

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}

Skriva

En indatafråga kanske inte är i optimalt format för att hämta jordningsdata. Det är vanligt att använda en språkmodell för att skriva om frågan för att uppnå bättre resultat. Följande är några utmaningar som du kan lösa genom att skriva om en fråga:

  • Vaghet
  • Nyckelord saknas
  • Onödiga ord
  • Oklart semantiskt

Följande fråga, som hämtats från github-lagringsplatsen RAG Experiment Accelerator, åtgärdar de listade utmaningarna med hjälp av en språkmodell för att skriva om frågan.

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 the rewritten query covers both broad and specific aspects of the topic.
Remove any 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 (e.g. keyword-focused, semantically-focused, domain-specific).

query: {original_query}

Hyde

Hypothetical Document Embeddings (HyDE) är en alternativ informationshämtningsteknik som används i RAG-lösningar. I stället för att konvertera en fråga till inbäddningar och använda dessa inbäddningar för att hitta de närmaste matchningarna i en vektordatabas använder HyDE en språkmodell för att generera svar från frågan. Dessa svar konverteras sedan till inbäddningar, som används för att hitta de närmaste matchningarna. Den här processen gör det möjligt för HyDE att utföra inbäddningssökningar för svar-till-svar-inbäddning.

Kombinera frågeöversättningar till en pipeline

Du är inte begränsad till att välja en frågeöversättning. I praktiken kan flera eller till och med alla dessa översättningar användas tillsammans. Följande diagram illustrerar ett exempel på hur dessa översättningar kan kombineras till en pipeline.

diagram som visar en RAG-pipeline med frågetransformatorer.

bild 1: RAG-pipeline med frågetransformatorer

Diagrammet är numrerat för viktiga steg i den här pipelinen:

  1. Den ursprungliga frågan skickas till det valfria frågeförstoringssteget. Det här steget matar ut den ursprungliga frågan och den förhöjda frågan.

  2. Den förhöjda frågan skickas till det valfria steget för att dela upp frågan. Det här steget matar ut den ursprungliga frågan, den förhöjda frågan och de uppdelade frågorna.

  3. Varje uppdelad fråga skickas via tre understeg. När alla de uppdelade frågorna har körts genom understegen matar steget ut den ursprungliga frågan, den förhöjda frågan, de uppdelade frågorna och en ackumulerad kontext. Den ackumulerade kontexten är aggregeringen av de främsta N-resultaten från alla de uppdelade frågor som bearbetas via understegen.

    1. Den valfria frågerewritern skriver om den uppdelade frågan.
    2. Den omskrivna frågan, om den skrevs om, eller om den ursprungliga frågan körs mot sökindexet. Frågan kan köras med någon av söktyperna: vektor, fulltext, hybrid eller manuell multipel. Den kan också köras med hjälp av avancerade frågefunktioner som HyDE.
    3. Resultaten rangordnas om. De översta N omrankade resultat läggs till i den ackumulerade kontexten.
  4. Den ursprungliga frågan, tillsammans med den ackumulerade kontexten, körs genom samma tre understeg som varje uppdelad fråga var. Den enda skillnaden är att det bara finns en frågekörning och att de översta N- resultat returneras till anroparen.

Skicka bilder i frågor

Vissa multimodala modeller som GPT-4V och GPT-4o kan tolka bilder. Om du använder dessa modeller kan du välja om du vill undvika segmentering av dina bilder och skicka bilden som en del av prompten till den multimodala modellen. Du bör experimentera för att avgöra hur den här metoden fungerar jämfört med att segmentera bilderna med och utan att skicka ytterligare kontext. Du bör också jämföra skillnaden i kostnad mellan metoderna och göra en kostnads-nyttoanalys.

Filtrering

Fält i sökarkivet som är konfigurerade som filtreringsbara kan användas för att filtrera frågor. Överväg att filtrera efter nyckelord och entiteter för frågor som använder dessa fält för att begränsa resultatet. Med filtrering kan du endast hämta data som uppfyller vissa villkor från ett index genom att eliminera irrelevanta data. Filtrering förbättrar frågans övergripande prestanda med mer relevanta resultat. Precis som med varje beslut är det viktigt att experimentera och testa. Frågor kanske inte har nyckelord eller felaktiga nyckelord, förkortningar eller förkortningar. Du måste ta hänsyn till dessa fall.

Viktning

Vissa sökplattformar, till exempel Azure AI Search, stöder möjligheten att påverka rankningen av resultat baserat på kriterier, inklusive viktningsfält.

Kommentar

I det här avsnittet beskrivs viktningsfunktionerna i Azure AI Search. Om du använder en annan dataplattform kan du undersöka plattformens viktningsfunktioner.

Azure AI Search stöder bedömningsprofiler som innehåller parametrar för viktade fält och funktioner för numeriska data. För närvarande gäller bedömningsprofiler endast för icke-bevektorfält, medan stöd för vektor- och hybridsökning finns i förhandsversion. Du kan skapa flera bedömningsprofiler för ett index och välja att använda en per fråga.

Att välja vilka fält som ska viktas beror på typen av fråga och användningsfallet. Om du till exempel fastställer att frågan är nyckelordscentrerad, till exempel "Var har Microsoft sitt huvudkontor?", vill du ha en bedömningsprofil som viktar entitets- eller nyckelordsfält högre. Du kan också använda olika profiler för olika användare, tillåta användare att välja fokus eller välja profiler baserat på programmet.

Vi rekommenderar att du i produktionssystem endast underhåller profiler som du aktivt använder i produktion.

Ändra rangordning

Med omrankning kan du köra en eller flera frågor, aggregera resultaten och rangordna dessa resultat. Överväg följande skäl för att ändra rangordningen av sökresultaten:

  • Du utförde manuella flera sökningar och vill aggregera resultaten och rangordna dem.
  • Vektor- och nyckelordssökningar är inte alltid korrekta. Du kan öka antalet dokument som returneras från sökningen, eventuellt inklusive några giltiga resultat som annars skulle ignoreras, och använda omrankning för att utvärdera resultaten.

Du kan använda en språkmodell eller korskodare för att utföra omrankning. Vissa plattformar, till exempel Azure AI Search, har egna metoder för att ändra resultat. Du kan utvärdera de här alternativen för dina data för att avgöra vad som fungerar bäst för ditt scenario. Följande avsnitt innehåller information om dessa metoder.

Omrankning av språkmodell

Följande är en exempelspråkmodellprompt från RAG-experimentacceleratorn som genererar resultat på nytt.

A list of documents is shown below. Each document 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 you should consult to answer the question, in order of relevance, as well as the relevance score as json string based on json format as shown in the schema section. The relevance score is a number from 1–10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any additional text or explanation or metadata apart from json string. Just output the json string and strip rest every other text. Strictly remove any 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 exactly be one documents 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"
    }
}

Korskodaromrankning

I följande exempel från GITHub-lagringsplatsen för RAG-experimentacceleratorn används CrossEncoder som tillhandahålls av Hugging Face för att läsa in Roberta-modellen. Den itererar sedan över varje segment och använder modellen för att beräkna likheten, vilket ger dem ett värde. Vi sorterar resultat och returnerar det översta N.

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])

Semantisk rankning

Azure AI Search har en egenutvecklad funktion som kallas semantisk rankning. Den här funktionen använder djupinlärningsmodeller som har anpassats från Microsoft Bing som främjar de mest semantiskt relevanta resultaten. Läs följande för att se Hur semantisk ranker fungerar.

Sökvägledning

Överväg följande allmänna vägledning när du implementerar din söklösning:

  • Rubrik, sammanfattning, källa och råinnehåll (rensas inte) är bra fält att returnera från en sökning.
  • Ta reda på i förväg om en fråga måste delas upp i underfrågor.
  • I allmänhet är det bra att köra frågor på flera fält, både vektor- och textfrågor. När du får en fråga vet du inte om vektorsökning eller textsökning är bättre. Du vet inte heller vilka fält vektorsökningen eller nyckelordssökningen är bäst att söka i. Du kan söka i flera fält, eventuellt med flera frågor, ändra rangordning på resultaten och returnera resultaten med de högsta poängen.
  • Nyckelord och entitetsfält är bra kandidater att överväga att filtrera på.
  • Det är en bra idé att använda nyckelord tillsammans med vektorsökningar. Nyckelorden filtrerar resultatet till en mindre delmängd. Vektorlagret arbetar mot den delmängden för att hitta de bästa matchningarna.

Sökutvärdering

I förberedelsefasen bör du ha samlat in testfrågor tillsammans med testdokumentinformation. Du kan använda följande information som du samlade in i den fasen för att utvärdera sökresultaten:

  • Frågan – exempelfrågan
  • Kontexten – samlingen av all text i testdokumenten som hanterar exempelfrågan

Följande är tre väletablerade metoder för hämtningsutvärdering som du kan använda för att utvärdera din söklösning:

  • Precision vid K – Procentandelen korrekt identifierade relevanta objekt av det totala sökresultatet. Det här måttet fokuserar på noggrannheten i sökresultaten.
  • Recall at K – Recall at K mäter procentandelen relevanta objekt i topp K av de totala möjliga relativa objekten. Det här måttet fokuserar på sökresultattäckning.
  • Genomsnittlig reciprocal rankning (MRR) – MRR mäter medelvärdet av de ömsesidiga rangordningarna för det första relevanta svaret i dina rankade sökresultat. Det här måttet fokuserar på var det första relevanta resultatet inträffar i sökresultaten.

Du bör testa både positiva och negativa exempel. För de positiva exemplen vill du att måtten ska vara så nära 1 som möjligt. För de negativa exemplen, där dina data inte ska kunna hantera frågorna, vill du att måtten ska vara så nära 0 som möjligt. Du bör testa alla dina testfrågor och medelvärdet av de positiva frågeresultaten och de negativa frågeresultaten för att förstå hur sökresultaten presterar aggregerat.

Nästa steg