Zodra u de insluitingen voor uw segmenten hebt gegenereerd, bestaat de volgende stap uit het genereren van de index in de vectordatabase en het experimenteren om de optimale zoekopdrachten te bepalen die moeten worden uitgevoerd. Wanneer u experimenteert met het ophalen van gegevens, zijn er verschillende gebieden waarmee u rekening moet houden, waaronder configuratieopties voor de zoekindex, de typen zoekopdrachten die u moet uitvoeren en uw strategie voor het herrankeren. In dit artikel worden deze drie onderwerpen behandeld.
Dit artikel maakt deel uit van een serie. Lees de inleiding.
Zoekindex
Notitie
Azure AI Search is een eigen Azure Search-service. In deze sectie worden enkele specifieke informatie over AI Search genoemd. Als u een ander archief gebruikt, raadpleegt u de documentatie om de sleutelconfiguratie voor die service te vinden.
De zoekindex in uw winkel heeft een kolom voor elk veld in uw gegevens. Zoekarchieven bieden over het algemeen ondersteuning voor niet-vectorgegevenstypen , zoals tekenreeks, Booleaanse waarde, geheel getal, enkel, dubbel, datum/tijd en verzamelingen zoals Verzameling(één) en vectorgegevenstypen , zoals Verzameling (enkel). Voor elke kolom moet u informatie configureren, zoals het gegevenstype, of het veld filterbaar, ophaalbaar en/of doorzoekbaar is.
Hier volgen enkele belangrijke beslissingen die u moet nemen voor de configuratie van vectorzoekopdrachten die worden toegepast op vectorvelden:
- Vectorzoekalgoritmen : het algoritme dat wordt gebruikt om te zoeken naar relatieve overeenkomsten. Azure AI Search heeft een brute-force algoritmeoptie die de volledige vectorruimte scant met de naam uitgebreide KNN en een meer presterende algoritmeoptie die een bijna dichtstbijzijnde buur (ANN) zoekopdracht uitvoert met de naam Hierarchical Navigable Small World (HNSW).
-
metrische waarde: deze configuratie is de metrische overeenkomst die wordt gebruikt voor het berekenen van de nabijheid door het algoritme. De opties in Azure AI Search zijn cosinus, dotProduct en Euclidean. Als u Azure OpenAI-insluitingsmodellen gebruikt, kiest u
cosine
. - efConstruction : parameter die wordt gebruikt tijdens de indexconstructie hierarchical Navigable Navigable Small Worlds (HNSW) waarmee het aantal dichtstbijzijnde buren wordt ingesteld dat is verbonden met een vector tijdens het indexeren. Een grotere efConstruction-waarde resulteert in een index van betere kwaliteit dan een kleiner getal. Het nadeel is dat een grotere waarde meer tijd, opslag en rekenkracht vereist. efConstruction moet hoger zijn voor een groot aantal segmenten en lager voor een laag aantal segmenten. Het bepalen van de optimale waarde vereist experimenten met uw gegevens en verwachte query's.
- efSearch : parameter die wordt gebruikt tijdens het uitvoeren van query's om het aantal dichtstbijzijnde buren (dat wil gezegd, vergelijkbare segmenten) in te stellen dat tijdens de zoekopdracht wordt gebruikt.
- m - Het aantal bidirectionele koppelingen. Het bereik is 4 tot 10, met lagere getallen die minder ruis retourneren in de resultaten.
In Azure AI Search worden de vectorconfiguraties ingekapseld in een vectorSearch
configuratie. Wanneer u de vectorkolommen configureert, verwijst u naar de juiste configuratie voor die vectorkolom en stelt u het aantal dimensies in. Het dimensiekenmerk van de vectorkolom vertegenwoordigt het aantal dimensies dat is gegenereerd door het insluitmodel dat u hebt gekozen. Het model dat is geoptimaliseerd voor text-embedding-3-small
opslag genereert bijvoorbeeld 1536 dimensies.
Zoekopdrachten
Wanneer u query's uitvoert vanuit uw promptorchestrator voor uw zoekarchief, hebt u veel opties om rekening mee te houden. U moet het volgende bepalen:
- Welk type zoekopdracht u wilt uitvoeren: vector of trefwoord of hybride
- Of u nu query's wilt uitvoeren op een of meer kolommen
- Of u nu handmatig meerdere query's wilt uitvoeren, zoals een trefwoordquery en een vectorzoekopdracht
- Of de query moet worden opgesplitst in subquery's
- Of filteren moet worden gebruikt in uw query's
Uw promptorchestrator kan een statische benadering hebben of een dynamische benadering waarbij de benaderingen worden vermengd op basis van contextopwijzing van de prompt. In de volgende secties worden deze opties besproken, zodat u kunt experimenteren om de juiste aanpak voor uw workload te vinden.
Zoektypen
Zoekplatformen ondersteunen over het algemeen volledige tekst en vectorzoekopdrachten. Sommige platforms, zoals Azure AI Search, ondersteunen hybride zoekopdrachten. Als u mogelijkheden van verschillende vectorzoekopdrachten wilt zien, raadpleegt u Een Azure-service kiezen voor vectorzoekopdrachten.
Vector zoeken
Vectorzoekopdrachten komen overeen met overeenkomsten tussen de vectorquery (prompt) en vectorvelden.
Belangrijk
U moet dezelfde schoonmaakbewerkingen uitvoeren die u op segmenten hebt uitgevoerd voordat u de query insluit. Als u bijvoorbeeld elk woord in het ingesloten segment hebt ingekapseld, moet u elk woord in de query in kleine letters plaatsen voordat u het insluiten.
Notitie
U kunt een vectorzoekopdracht uitvoeren op meerdere vectorvelden in dezelfde query. In Azure AI Search is dat technisch gezien een hybride zoekopdracht. Zie deze sectie voor meer informatie.
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"],
)
De voorbeeldcode voert een vectorzoekactie uit op het contentVector
veld. Houd er rekening mee dat de code waarmee de query vooraf wordt ingesloten, de query eerst verwerkt. Deze voorverwerking moet dezelfde code zijn die de segmenten voorbewerkt voordat ze worden ingesloten. Het insluitmodel moet hetzelfde insluitmodel zijn dat de segmenten heeft ingesloten.
Zoeken in volledige tekst
Zoekopdrachten in volledige tekst komen overeen met tekst zonder opmaak die is opgeslagen in een index. Het is gebruikelijk om trefwoorden uit een query te extraheren en deze geëxtraheerde trefwoorden in een zoekopdracht in volledige tekst te gebruiken voor een of meer geïndexeerde kolommen. Zoekopdrachten in volledige tekst kunnen worden geconfigureerd om overeenkomsten te retourneren waarbij alle termen of alle termen overeenkomen.
U moet experimenteren om te bepalen welke velden effectief zijn om zoekopdrachten in volledige tekst uit te voeren. Zoals besproken in de verrijkingsfase, zijn trefwoord- en entiteitmetagegevensvelden goede kandidaten voor zoeken in volledige tekst in scenario's waarin inhoud vergelijkbare semantische betekenis heeft, maar entiteiten of trefwoorden verschillen. Andere algemene velden die u kunt overwegen voor zoeken in volledige tekst, zijn titel, samenvatting en de segmenttekst.
formatted_search_results = []
results = client.search(
search_text=query,
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
formatted_search_results = format_results(results)
De voorbeeldcode voert een zoekopdracht in volledige tekst uit op de titel-, inhouds- en samenvattingsvelden.
Hybride zoekopdracht
Azure AI Search ondersteunt hybride query's waarbij uw query een of meer zoekopdrachten voor tekst en een of meer vectorzoekopdrachten kan bevatten. Het platform voert elke query uit, haalt de tussenliggende resultaten op, rangschikt de resultaten opnieuw met behulp van Wederzijdse Rank Fusion (RRF) en retourneert de bovenste 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"],
)
De voorbeeldcode voert een zoekopdracht in volledige tekst uit op de titel-, inhouds- en samenvattingsvelden en vectorzoekopdrachten op basis van de velden contentVector en questionVector. Het Azure AI Search-platform voert alle query's parallel uit, ranglijnt de resultaten opnieuw en retourneert de belangrijkste retrieve_num_of_documents documenten.
Handmatig meerdere
U kunt natuurlijk meerdere query's uitvoeren, zoals een vectorzoekopdracht en een zoekopdracht in volledige tekst voor trefwoorden, handmatig. U voegt de resultaten samen en rangtelt de resultaten handmatig en retourneert de belangrijkste resultaten. Hier volgen use cases voor handmatig meerdere:
- U gebruikt een zoekplatform dat geen ondersteuning biedt voor hybride zoekopdrachten. U volgt deze optie om uw eigen hybride zoekopdracht uit te voeren.
- U wilt zoekopdrachten in volledige tekst uitvoeren op verschillende query's. U kunt bijvoorbeeld trefwoorden uit de query extraheren en een zoekopdracht in volledige tekst uitvoeren voor het metagegevensveld van uw trefwoorden. Vervolgens kunt u entiteiten extraheren en een query uitvoeren op het veld met metagegevens van entiteiten.
- U wilt zelf het herrankeringsproces beheren.
- Voor de query moeten uitgevouwen subquery's worden uitgevoerd om grondgegevens uit meerdere bronnen op te halen.
Queryomzetting
Queryomzetting is een optionele stap in de fase voor het ophalen van gegevens van een RAG-oplossing. In de vertaalstap wordt een query getransformeerd of vertaald in een formulier dat is geoptimaliseerd om betere resultaten op te halen. Er zijn veel vormen van queryomzetting, waaronder de vier die in dit artikel worden behandeld: uitbreiding, ontleding, herschrijven en hypothetische document-insluitingen (HyDE).
Query-uitbreiding
Query-uitbreiding is een vertaalstap waarbij het doel is om de query eenvoudiger, bruikbaarder te maken en de context te verbeteren. Overweeg de uitbreiding als uw query te klein of vaag is. Denk bijvoorbeeld aan de query: 'Vergelijk de inkomsten van Microsoft'. Die query is vaag. U hebt geen tijdsperioden of tijdseenheden genoemd om te vergelijken en alleen opgegeven inkomsten. Bekijk nu een uitgebreide versie van de query: 'Vergelijk de inkomsten en omzet van Microsoft huidig jaar versus vorig jaar per kwartaal'. De nieuwe query is duidelijk en specifiek.
Wanneer u een query toevoegt, onderhoudt u de oorspronkelijke query, maar voegt u meer context toe. Het uitbreiden van een query kan geen kwaad zolang u de oorspronkelijke query niet verwijdert of wijzigt en de aard van de query niet wijzigt.
U kunt een taalmodel gebruiken om uw query te verbeteren. Niet alle query's kunnen echter worden uitgebreid. Als u een context hebt, kunt u deze doorgeven aan uw taalmodel om de query te verbeteren. Als u geen context hebt, moet u bepalen of uw taalmodel informatie bevat die nuttig kan zijn bij het uitbreiden van de query. Als u bijvoorbeeld een groot taalmodel zoals een van de GPT-modellen gebruikt, kunt u bepalen of er informatie beschikbaar is op internet over de query. Zo ja, dan kunt u het model gebruiken om de query uit te voeren. Anders moet u de query niet uitbreiden.
De volgende prompt wordt opgehaald uit de gitHub-opslagplaats van de RAG Experiment Accelerator waarin een taalmodel wordt weergegeven dat wordt gebruikt om een query uit te voeren.
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:
U ziet dat er voorbeelden zijn voor wanneer context aanwezig is en niet aanwezig is.
Decompositie
Sommige query's zijn complex en vereisen meer dan één verzameling gegevens om het model te gronden. De query 'Hoe werken elektrische auto's en hoe kunnen ze zich verhouden tot ICE-voertuigen?' vereist waarschijnlijk grondgegevens uit meerdere bronnen. Eén bron kan beschrijven hoe elektrische auto's werken, waar een andere zich verhoudt tot interne verbrandingsmotorvoertuigen (ICE).
Ontleding is het proces van het opsplitsen van een complexe query in meerdere kleinere en eenvoudigere subquery's. U voert elk van de uitgevouwen query's onafhankelijk uit en voegt de belangrijkste resultaten van alle uitgevouwen query's samen als een samengevoegde context. Vervolgens voert u de oorspronkelijke query uit en geeft u de samengevoegde context door aan het taalmodel.
Het is raadzaam om te bepalen of voor de query meerdere zoekopdrachten zijn vereist voordat u zoekopdrachten uitvoert. Als u denkt dat meerdere subquery's vereist zijn, kunt u handmatig meerdere query's uitvoeren voor alle query's. Gebruik een taalmodel om te bepalen of meerdere subquery's worden aanbevolen. De volgende prompt wordt opgehaald uit de GitHub-opslagplaats van RAG Experiment Accelerator die wordt gebruikt om een query als eenvoudig of complex te categoriseren, waarbij complexe query's meerdere query's vereisen:
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"
}
Een taalmodel kan ook worden gebruikt om een complexe query te ontleden. De volgende prompt wordt opgehaald uit de gitHub-opslagplaats van de RAG Experiment Accelerator waarmee een complexe query wordt ontleden.
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}
Herschrijven
Een invoerquery heeft mogelijk niet de optimale vorm om grondgegevens op te halen. Het gebruik van een taalmodel voor het herschrijven van de query is gebruikelijk om betere resultaten te bereiken. Hier volgen enkele uitdagingen die u kunt oplossen door een query te herschrijven:
- Vaagheid
- Ontbrekende trefwoorden
- Overbodige woorden
- Onduidelijk semantisch
Met de volgende prompt, afkomstig uit de gitHub-opslagplaats van de RAG Experiment Accelerator, worden de vermelde uitdagingen opgelost met behulp van een taalmodel om de query opnieuw te schrijven.
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
Hypothetische Document Embeddings (HyDE) is een alternatieve techniek voor het ophalen van informatie die wordt gebruikt in RAG-oplossingen. In plaats van een query te converteren naar insluitingen en deze insluitingen te gebruiken om de dichtstbijzijnde overeenkomsten in een vectordatabase te vinden, gebruikt HyDE een taalmodel om antwoorden van de query te genereren. Deze antwoorden worden vervolgens geconverteerd naar insluitingen, die worden gebruikt om de dichtstbijzijnde overeenkomsten te vinden. Met dit proces kan HyDE zoekopdrachten voor antwoord-naar-antwoord insluiten.
Queryvertalingen combineren in een pijplijn
U bent niet beperkt tot het kiezen van één queryomzetting. In de praktijk kunnen meerdere of zelfs al deze vertalingen in combinatie worden gebruikt. In het volgende diagram ziet u een voorbeeld van hoe deze vertalingen kunnen worden gecombineerd in een pijplijn.
afbeelding 1: RAG-pijplijn met querytransformaties
Het diagram is genummerd voor belangrijke stappen in deze pijplijn:
De oorspronkelijke query wordt doorgegeven aan de optionele stap voor het uitbreiden van query's. Met deze stap worden de oorspronkelijke query en de uitgebreide query uitgevoerd.
De uitgebreide query wordt doorgegeven aan de optionele stap voor het decomposeren van query's. Met deze stap worden de oorspronkelijke query, de uitgebreide query en de uitgevouwen query's uitgevoerd.
Elke uitgevouwen query wordt doorgegeven via drie substappen. Zodra alle uitgevouwen query's worden uitgevoerd via de substappen, voert de stap de oorspronkelijke query, de uitgebreide query, de uitgevouwen query's en een samengevoegde context uit. De samengevoegde context is de aggregatie van de bovenste N-resultaten van alle uitgevouwen query's die worden verwerkt via de substeps.
- De optionele query herschrijft de uitgevouwen query.
- De herschreven query, als deze opnieuw is geschreven of als de oorspronkelijke query wordt uitgevoerd op basis van de zoekindex. De query kan worden uitgevoerd met behulp van een van de zoektypen: vector, volledige tekst, hybride of handmatig veelvoud. Het kan ook worden uitgevoerd met behulp van geavanceerde querymogelijkheden zoals HyDE.
- De resultaten worden opnieuw geherrankeerd. De bovenste N gererankeerde resultaten worden toegevoegd aan de samengevoegde context.
De oorspronkelijke query, samen met de samengevoegde context, wordt uitgevoerd via dezelfde drie substappen als elke uitgevouwen query. Het enige verschil is dat er slechts één query wordt uitgevoerd en dat de bovenste N resultaten worden geretourneerd naar de aanroeper.
Afbeeldingen doorgeven in query's
Sommige multimodale modellen, zoals GPT-4V en GPT-4o, kunnen afbeeldingen interpreteren. Als u deze modellen gebruikt, kunt u kiezen of u de afbeeldingen niet wilt segmenteren en de afbeelding wilt doorgeven als onderdeel van de prompt voor het multimodale model. U moet experimenteren om te bepalen hoe deze aanpak presteert in vergelijking met het segmenteren van de afbeeldingen met en zonder dat er extra context wordt doorgegeven. U moet ook het verschil in kosten tussen de benaderingen vergelijken en een kosten-batenanalyse uitvoeren.
Filteren
Velden in het zoekarchief die zijn geconfigureerd als filterbaar, kunnen worden gebruikt om query's te filteren. U kunt filteren op trefwoorden en entiteiten voor query's die deze velden gebruiken om het resultaat te verfijnen. Met filteren kunt u alleen de gegevens ophalen die aan bepaalde voorwaarden van een index voldoen door irrelevante gegevens te elimineren. Filteren verbetert de algehele prestaties van de query met relevantere resultaten. Net als bij elke beslissing is het belangrijk om te experimenteren en testen. Query's hebben mogelijk geen trefwoorden of verkeerde trefwoorden, afkortingen of acroniemen. U moet rekening houden met deze zaken.
Weging
Sommige zoekplatforms, zoals Azure AI Search, ondersteunen de mogelijkheid om de rangorde van resultaten te beïnvloeden op basis van criteria, waaronder wegingsvelden.
Notitie
In deze sectie worden de wegingsmogelijkheden in Azure AI Search besproken. Als u een ander gegevensplatform gebruikt, onderzoekt u de wegingsmogelijkheden van dat platform.
Azure AI Search ondersteunt scoreprofielen die parameters bevatten voor gewogen velden en functies voor numerieke gegevens. Scoreprofielen zijn momenteel alleen van toepassing op niet-vectorvelden, terwijl ondersteuning voor vector- en hybride zoekopdrachten in preview is. U kunt meerdere scoreprofielen maken op een index en er eventueel voor kiezen om er één per query te gebruiken.
Het kiezen van de velden die moeten worden gewogen, is afhankelijk van het type query en de use-case. Als u bijvoorbeeld bepaalt dat de query trefwoordgericht is, zoals 'Waar is Microsoft hoofdkantoor?', wilt u een scoreprofiel dat de entiteit of trefwoordvelden hoger weegt. U kunt ook verschillende profielen gebruiken voor verschillende gebruikers, gebruikers toestaan hun focus te kiezen of profielen te kiezen op basis van de toepassing.
We raden u aan in productiesystemen alleen profielen te onderhouden die u actief in productie gebruikt.
Herrankering
Met opnieuw rangschikken kunt u een of meer query's uitvoeren, de resultaten aggregeren en deze resultaten rangschikken. Houd rekening met de volgende redenen om uw zoekresultaten opnieuw in te voeren:
- U hebt handmatig meerdere zoekopdrachten uitgevoerd en u wilt de resultaten aggregeren en rangschikken.
- Vector- en trefwoordzoekopdrachten zijn niet altijd nauwkeurig. U kunt het aantal documenten dat wordt geretourneerd uit uw zoekopdracht verhogen, mogelijk inclusief enkele geldige resultaten die anders worden genegeerd, en u kunt de rangrangering gebruiken om de resultaten te evalueren.
U kunt een taalmodel of cross-encoder gebruiken om de rangindeling opnieuw uit te voeren. Sommige platforms, zoals Azure AI Search, hebben eigen methoden om resultaten opnieuw te rangschikt. U kunt deze opties voor uw gegevens evalueren om te bepalen wat het beste werkt voor uw scenario. In de volgende secties vindt u meer informatie over deze methoden.
Taalmodel opnieuw rangverwijzingen
Hier volgt een voorbeeld van een voorbeeldtaalmodelprompt van de RAG-experimentversneller waarmee de resultaten opnieuw worden geherrankt.
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"
}
}
Herrankering tussen coderingsprogramma's
In het volgende voorbeeld uit de GitHub-opslagplaats RAG Experiment Accelerator wordt gebruikgemaakt van de CrossEncoder van Hugging Face om het Roberta-model te laden. Vervolgens wordt elke segment herhaald en wordt het model gebruikt om overeenkomsten te berekenen, waardoor ze een waarde hebben. We sorteren resultaten en retourneren de bovenste 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])
Semantische rangschikking
Azure AI Search heeft een eigen functie met de naam semantische rangschikking. Deze functie maakt gebruik van deep learning-modellen die zijn aangepast van Microsoft Bing die de meest semantisch relevante resultaten promoten. Lees het volgende om te zien hoe semantische ranker werkt.
Zoekrichtlijnen
Houd rekening met de volgende algemene richtlijnen bij het implementeren van uw zoekoplossing:
- Titel, samenvatting, bron en de onbewerkte inhoud (niet opgeschoond) zijn goede velden om terug te keren van een zoekopdracht.
- Bepaal vooraf of een query moet worden opgesplitst in subquery's.
- Over het algemeen is het een goede gewoonte om query's uit te voeren op meerdere velden, zowel vector- als tekstquery's. Wanneer u een query ontvangt, weet u niet of vectorzoekopdrachten of tekstzoekopdrachten beter zijn. U weet verder niet welke velden de vectorzoekopdracht of trefwoordzoekopdracht het beste zijn om te zoeken. U kunt zoeken op meerdere velden, mogelijk met meerdere query's, de resultaten opnieuw rangverkennen en de resultaten retourneren met de hoogste scores.
- Trefwoorden en entiteitsvelden zijn goede kandidaten om te overwegen om te filteren.
- Het is een goede gewoonte om trefwoorden samen met vectorzoekopdrachten te gebruiken. De trefwoorden filteren de resultaten op een kleinere subset. Het vectorarchief werkt met die subset om de beste overeenkomsten te vinden.
Zoekevaluatie
In de voorbereidingsfase moet u testquery's hebben verzameld, samen met informatie over het testdocument. U kunt de volgende informatie gebruiken die u in die fase hebt verzameld om uw zoekresultaten te evalueren:
- De query - De voorbeeldquery
- De context: de verzameling van alle tekst in de testdocumenten die betrekking hebben op de voorbeeldquery
Hieronder vindt u drie bekende evaluatiemethoden voor het ophalen van uw zoekoplossing:
- Precisie bij K : het percentage correct geïdentificeerde relevante items uit de totale zoekresultaten. Deze metrische waarde is gericht op de nauwkeurigheid van uw zoekresultaten.
- Relevante overeenkomsten bij K - Terugroepen bij K meet het percentage relevante items in de bovenste K van de totaal mogelijke relatieve items. Deze metrische waarde is gericht op de dekking van zoekresultaten.
- Mean Reciprocal Rank (MRR) - MRR meet het gemiddelde van de wederzijdse rangschikkingen van het eerste relevante antwoord in uw gerangschikte zoekresultaten. Deze metrische waarde is gericht op de plaats waar het eerste relevante resultaat voorkomt in de zoekresultaten.
U moet zowel positieve als negatieve voorbeelden testen. Voor de positieve voorbeelden wilt u dat de metrische gegevens zo dicht mogelijk bij 1 liggen. Voor de negatieve voorbeelden, waarbij uw gegevens de query's niet kunnen aanpakken, wilt u dat de metrische gegevens zo dicht mogelijk bij 0 liggen. U moet al uw testquery's testen en het gemiddelde berekenen van de positieve queryresultaten en de negatieve queryresultaten om te begrijpen hoe uw zoekresultaten samen worden uitgevoerd.