Recupero delle informazioni

Servizi di intelligenza artificiale di Azure
Ricerca di intelligenza artificiale di Azure
Servizio OpenAI di Azure
Azure Machine Learning

Dopo aver generato gli incorporamenti per i blocchi, il passaggio successivo consiste nel generare l'indice nel database vettoriale e sperimentare per determinare le ricerche ottimali da eseguire. Quando si sta sperimentando il recupero delle informazioni, sono disponibili diverse aree da considerare, incluse le opzioni di configurazione per l'indice di ricerca, i tipi di ricerche da eseguire e la strategia di reranking. Questo articolo descrive queste tre topic.

Questo articolo fa parte di una serie. Leggere l'introduzione.

Indice di ricerca

Nota

Ricerca di intelligenza artificiale di Azure è un servizio di ricerca di Azure di prima parte. In questa sezione verranno menzionate alcune specifiche per la ricerca di intelligenza artificiale. Se si usa un archivio diverso, consultare la documentazione per trovare la configurazione della chiave per tale servizio.

L'indice di ricerca nell'archivio include una colonna per ogni campo nei dati. Gli archivi di ricerca in genere supportano tipi di dati non di ottimizzazione, ad esempio string, Boolean, Integer, single, double, datetime e raccolte come Collection(single) e tipi di dati vettoriali, ad esempio Collection(single). Per ogni colonna, è necessario configurare informazioni quali il tipo di dati, indipendentemente dal fatto che il campo sia filtrabile, recuperabile e/o ricercabile.

Di seguito sono riportate alcune decisioni chiave da prendere per la configurazione di ricerca vettoriale applicata ai campi vettoriali:

  • Algoritmo di ricerca vettoriale: algoritmo usato per cercare corrispondenze relative. Ricerca di intelligenza artificiale di Azure offre un'opzione di algoritmo di forza bruta che analizza l'intero spazio vettoriale denominato KNN esaustivo e un'opzione di algoritmo più efficiente che esegue una ricerca approssimativa vicina più vicina (ANN) denominata HNSW (Hierarchical Navigable Small World).
  • metrica : questa configurazione è la metrica di somiglianza usata per calcolare la prossimità in base all'algoritmo. Le opzioni in Ricerca intelligenza artificiale di Azure sono coseno, dotProduct ed Euclidean. Se si usano modelli di incorporamento openAI di Azure, scegliere cosine.
  • efConstruction : parametro usato durante la costruzione dell'indice HNSW (Navigable Small Worlds) gerarchico che imposta il numero di vicini più vicini connessi a un vettore durante l'indicizzazione. Un valore efConstruction maggiore genera un indice di qualità migliore rispetto a un numero minore. Il compromesso è che un valore più grande richiede più tempo, archiviazione e calcolo. EfConstruction deve essere superiore per un numero elevato di blocchi e inferiore per un numero ridotto di blocchi. Determinare il valore ottimale richiede la sperimentazione con i dati e le query previste.
  • efSearch : parametro usato in fase di query per impostare il numero di vicini più vicini (ovvero blocchi simili) usati durante la ricerca.
  • m - Il conteggio dei collegamenti bidirezionali. L'intervallo è compreso tra 4 e 10, con numeri inferiori che restituiscono meno rumore nei risultati.

In Ricerca di intelligenza artificiale di Azure le configurazioni vettoriali vengono incapsulate in una vectorSearch configurazione. Quando si configurano le colonne vettoriali, si fa riferimento alla configurazione appropriata per tale colonna vettoriale e si imposta il numero di dimensioni. L'attributo dimensioni della colonna vettoriale rappresenta il numero di dimensioni generate dal modello di incorporamento scelto. Ad esempio, il modello ottimizzato per text-embedding-3-small l'archiviazione genera 1.536 dimensioni.

Ricerche

Quando si eseguono query dall'agente di orchestrazione prompt nell'archivio di ricerca, sono disponibili molte opzioni da considerare. È necessario determinare:

  • Quale tipo di ricerca eseguire: vettore o parola chiave o ibrido
  • Se si intende eseguire una query su una o più colonne
  • Se si intende eseguire manualmente più query, ad esempio una query con parole chiave e una ricerca vettoriale
  • Indica se la query deve essere suddivisa in sottoquery
  • Indica se il filtro deve essere usato nelle query

L'agente di orchestrazione prompt potrebbe adottare un approccio statico o un approccio dinamico che combina gli approcci in base agli indizi di contesto dal prompt. Le sezioni seguenti illustrano queste opzioni che consentono di provare a trovare l'approccio appropriato per il carico di lavoro.

Tipi di ricerca

Le piattaforme di ricerca supportano in genere ricerche full-text e vettoriali. Alcune piattaforme, ad esempio Ricerca intelligenza artificiale di Azure, supportano le ricerche ibride. Per visualizzare le funzionalità di varie offerte di ricerca vettoriale, vedere Scegliere un servizio di Azure per la ricerca vettoriale.

Le ricerche vettoriali corrispondono alla somiglianza tra la query vettorializzata (prompt) e i campi vettoriali.

Importante

È necessario eseguire le stesse operazioni di pulizia eseguite sui blocchi prima di incorporare la query. Ad esempio, se ogni parola nel blocco incorporato è in minuscolo, è consigliabile minuscole ogni parola nella query prima dell'incorporamento.

Nota

È possibile eseguire una ricerca vettoriale su più campi vettoriali nella stessa query. In Ricerca di intelligenza artificiale di Azure, tecnicamente una ricerca ibrida. Per ulteriori informazioni, vedi la sezione.

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

Il codice di esempio esegue una ricerca vettoriale sul contentVector campo. Si noti che il codice che incorpora la query esegue prima di tutto la pre-elaborazione della query. Tale pre-elaborazione deve essere lo stesso codice che pre-elabora i blocchi prima dell'incorporamento. Il modello di incorporamento deve essere lo stesso modello di incorporamento che ha incorporato i blocchi.

Le ricerche full-text corrispondono a testo normale archiviato in un indice. È pratica comune estrarre parole chiave da una query e usare tali parole chiave estratte in una ricerca full-text su una o più colonne indicizzate. Le ricerche full-text possono essere configurate per restituire corrispondenze in cui tutti i termini o tutti i termini corrispondono.

È necessario sperimentare per determinare quali campi sono efficaci per eseguire ricerche full-text. Come descritto nei campi Fase di arricchimento, parola chiave ed entità metadati sono candidati validi da considerare per la ricerca full-text negli scenari in cui il contenuto ha un significato semantico simile, ma le entità o le parole chiave differiscono. Altri campi comuni da considerare per la ricerca full-text sono titolo, riepilogo e testo in blocchi.

formatted_search_results = []

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

formatted_search_results = format_results(results)

Il codice di esempio esegue una ricerca full-text sui campi titolo, contenuto e riepilogo.

Ricerca di intelligenza artificiale di Azure supporta query ibride in cui la query può contenere una o più ricerche di testo e una o più ricerche vettoriali. La piattaforma esegue ogni query, ottiene i risultati intermedi, beve i risultati usando La fusione di rango reciproco (RRF) e restituisce i primi N risultati.

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

Il codice di esempio esegue una ricerca full-text nei campi titolo, contenuto e riepilogo e nelle ricerche vettoriali nei campi contentVector e questionVector. La piattaforma Ricerca intelligenza artificiale di Azure esegue tutte le query in parallelo, classifica i risultati e restituisce i primi retrieve_num_of_documents documenti.

Multiplo manuale

Naturalmente, è possibile eseguire più query, ad esempio una ricerca vettoriale e una ricerca full-text con parole chiave, manualmente. Aggregare i risultati e reranking dei risultati manualmente e restituire i risultati principali. Di seguito sono riportati i casi d'uso per più manuali:

  • Si usa una piattaforma di ricerca che non supporta le ricerche ibride. Seguire questa opzione per eseguire la propria ricerca ibrida.
  • Si vogliono eseguire ricerche full-text su query diverse. Ad esempio, è possibile estrarre parole chiave dalla query ed eseguire una ricerca full-text sul campo dei metadati delle parole chiave. È quindi possibile estrarre le entità ed eseguire una query sul campo dei metadati delle entità.
  • Si vuole controllare il processo di reranking manualmente.
  • La query richiede l'esecuzione di più sottoquery per recuperare i dati di base da più origini.

Più sottoquery

Alcune richieste sono complesse e richiedono più di una raccolta di dati per il suolo del modello. Ad esempio, la query "Come funzionano le automobili elettriche e come si confrontano con i veicoli ICE?" richiede probabilmente dati di terra da più origini.

È consigliabile determinare se la query richiede più ricerche prima di eseguire ricerche. Se si ritiene che siano necessarie più sottoquery, è possibile eseguire manualmente più query per tutte le query. Usare un modello linguistico di grandi dimensioni per determinare se sono necessarie più sottoquery. Il prompt seguente viene ottenuto dal repository GitHub dell'acceleratore di esperimenti RAG usato per classificare una query come semplice o complessa, con più query che richiedono più query:

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"
}

È anche possibile usare un modello linguistico di grandi dimensioni per estrarre sottoquery da una query complessa. Il prompt seguente viene ottenuto dal repository GitHub dell'acceleratore di esperimenti RAG che converte una query complessa in più sottoquery.

Your task is to take a question as input and generate maximum 3 sub-questions that cover all aspects of the original question. The output should be in strict JSON format, with the sub-questions contained in an array.
Here are the requirements:
1. Analyze the original question and identify the key aspects or components.
2. Generate sub-questions that address each aspect of the original question.
3. Ensure that the sub-questions collectively cover the entire scope of the original question.
4. Format the output as a JSON object with a single key "questions" that contains an array of the generated sub-questions.
5. Each sub-question should be a string within the "questions" array.
6. The JSON output should be valid and strictly formatted.
7. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. The JSON should be formatted with proper indentation for readability.
8. There should not be any comma after last element in the array.

Example input question:
What are the main causes of deforestation, and how can it be mitigated?

Example output:
{
  "questions": [
    "What are the primary human activities that contribute to deforestation?",
    "How does agriculture play a role in deforestation?",
    "What is the impact of logging and timber harvesting on deforestation?",
    "How do urbanization and infrastructure development contribute to deforestation?",
    "What are the environmental consequences of deforestation?",
    "What are some effective strategies for reducing deforestation?",
    "How can reforestation and afforestation help mitigate the effects of deforestation?",
    "What role can governments and policies play in preventing deforestation?",
    "How can individuals and communities contribute to reducing deforestation?"
  ]
}

Passaggio di immagini nelle query

Alcuni modellimultidimensionali, ad esempio GPT-4V e GPT-4o, possono interpretare le immagini. Se si usano questi modelli, è possibile scegliere se si vuole evitare la suddivisione in blocchi delle immagini e passare l'immagine come parte della richiesta almodellooe. È consigliabile provare a determinare il modo in cui questo approccio viene eseguito rispetto alla suddivisione in blocchi delle immagini con e senza passare un contesto aggiuntivo. È anche consigliabile confrontare la differenza di costo tra gli approcci ed eseguire un'analisi dei costi-benefit.

Filtri

I campi nell'archivio di ricerca configurati come filtrabili possono essere usati per filtrare le query. Valutare la possibilità di filtrare le parole chiave e le entità per le query che usano tali campi per limitare il risultato. Il filtro consente di recuperare solo i dati che soddisfano determinate condizioni da un indice eliminando i dati irrilevanti. Ciò migliora le prestazioni complessive della query con risultati più pertinenti. Come per ogni decisione, è importante sperimentare e testare. Le query potrebbero non avere parole chiave o parole chiave errate, abbreviazioni o acronimi. È necessario prendere in considerazione questi casi.

Reranking

Il reranking consente di eseguire una o più query, aggregare i risultati e classificarli. Prendere in considerazione i motivi seguenti per reranking dei risultati della ricerca:

  • Sono state eseguite più ricerche manuali e si vogliono aggregare i risultati e classificarli.
  • Le ricerche vettoriali e di parole chiave non sono sempre accurate. È possibile aumentare il numero di documenti restituiti dalla ricerca, inclusi potenzialmente alcuni risultati validi che altrimenti verrebbero ignorati e usare il reranking per valutare i risultati.You can increase the count of documents returned from your search, potentially including some valid results that would otherwise be ignored, and use reranking to evaluate the results.

È possibile usare un modello linguistico di grandi dimensioni o un codificatore incrociato per eseguire il reranking. Alcune piattaforme, ad esempio Ricerca di intelligenza artificiale di Azure, hanno metodi proprietari per rerank results. È possibile valutare queste opzioni per i dati per determinare il funzionamento migliore per lo scenario in uso. Le sezioni seguenti forniscono informazioni dettagliate su questi metodi.

Reranking del modello linguistico di grandi dimensioni

Di seguito è riportato un esempio di richiesta di modello linguistico di grandi dimensioni dall'acceleratore dell'esperimento RAG che classifica i risultati.

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 are not 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"
    }
}

Reranking tra codificatori

L'esempio seguente del repository GitHub dell'acceleratore di esperimenti RAG usa CrossEncoder fornito da Hugging Face per caricare il modello Roberta. Esegue quindi l'iterazione su ogni blocco e usa il modello per calcolare la somiglianza, assegnando loro un valore. I risultati vengono ordinati e restituiti i primi 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])

Classificazione semantica

Ricerca di intelligenza artificiale di Azure ha una funzionalità proprietaria denominata classificazione semantica. Questa funzionalità usa modelli di Deep Learning adattati da Microsoft Bing che promuovono i risultati semanticamente più rilevanti. Leggere quanto segue per vedere Funzionamento del ranker semantico.

Indicazioni per la ricerca

Quando si implementa la soluzione di ricerca, prendere in considerazione le indicazioni generali seguenti:

  • Titolo, riepilogo, origine e contenuto non elaborato (non pulito) sono campi validi da restituire da una ricerca.
  • Determinare in anticipo se una query deve essere suddivisa in sottoquery.
  • In generale, è consigliabile eseguire query su più campi, sia vettoriali che di testo. Quando si riceve una query, non si sa se la ricerca vettoriale o la ricerca di testo sono migliori. Inoltre, non si conoscono i campi che la ricerca vettoriale o la ricerca di parole chiave sono migliori per la ricerca. È possibile eseguire ricerche in più campi, potenzialmente con più query, riesezionare i risultati e restituire i risultati con i punteggi più alti.
  • Le parole chiave e i campi delle entità sono candidati validi per valutare l'applicazione di filtri.
  • È consigliabile usare parole chiave insieme alle ricerche vettoriali. Le parole chiave filtrano i risultati in un subset più piccolo. L'archivio vettoriale funziona con tale subset per trovare le corrispondenze migliori.

Valutazione della ricerca

Nella fase di preparazione è necessario raccogliere query di test insieme alle informazioni sul documento di test. È possibile usare le informazioni seguenti raccolte in tale fase per valutare i risultati della ricerca:

  • Query : query di esempio
  • Contesto: raccolta di tutto il testo nei documenti di test che puntano alla query di esempio

Di seguito sono riportati tre metodi di valutazione di recupero ben definiti che è possibile usare per valutare la soluzione di ricerca:

  • Precisione in K : percentuale di elementi pertinenti identificati correttamente dai risultati totali della ricerca. Questa metrica è incentrata sull'accuratezza dei risultati della ricerca.
  • Richiamo a K : il richiamo a K misura la percentuale di elementi rilevanti nella parte superiore K rispetto al totale degli elementi relativi possibili. Questa metrica è incentrata sulla copertura dei risultati della ricerca.
  • Rango reciproco medio ( MRR) - MRR misura la media dei ranghi reciproci della prima risposta pertinente nei risultati della ricerca classificati. Questa metrica è incentrata sulla posizione in cui si verifica il primo risultato pertinente nei risultati della ricerca.

È consigliabile testare sia esempi positivi che negativi. Per gli esempi positivi, si vuole che le metriche siano il più vicino possibile a 1. Per gli esempi negativi, in cui i dati non devono essere in grado di risolvere le query, si vuole che le metriche siano il più vicino possibile a 0. È consigliabile testare tutte le query di test e mediare i risultati positivi della query e i risultati negativi della query per comprendere come i risultati della ricerca vengono eseguite in aggregazione.

Passaggi successivi