Un nouvel index de synthèse des documents pour les systèmes d'assurance qualité basés sur LLM

May 09 2023
Dans cet article de blog, nous présentons une toute nouvelle structure de données LlamaIndex : un index de résumé de document. Nous décrivons comment cela peut aider à offrir de meilleures performances de récupération par rapport à la recherche sémantique traditionnelle, et nous passons également en revue un exemple.

Dans cet article de blog, nous présentons une toute nouvelle structure de données LlamaIndex : un index de résumé de document. Nous décrivons comment cela peut aider à offrir de meilleures performances de récupération par rapport à la recherche sémantique traditionnelle, et nous passons également en revue un exemple.

Arrière-plan

L'un des principaux cas d'utilisation des grands modèles de langage (LLM) est la question-réponse sur vos propres données. Pour ce faire, nous associons le LLM à un modèle de "récupération" qui peut effectuer une récupération d'informations sur un corpus de connaissances et effectuer une synthèse de réponse sur les textes récupérés à l'aide du LLM. Ce cadre général est appelé génération augmentée par récupération.

La plupart des utilisateurs qui construisent aujourd'hui des systèmes d'assurance qualité alimentés par LLM ont tendance à effectuer les opérations suivantes :

  1. Prenez des documents source, divisez chacun en morceaux de texte
  2. Stocker des morceaux de texte dans une base de données vectorielle
  3. Au moment de la requête, récupérez des morceaux de texte en intégrant des filtres de similarité et/ou de mots clés.
  4. Effectuer une synthèse de réponse

Limites des approches existantes

Il existe quelques limites à l'intégration de la récupération à l'aide de blocs de texte.

  • Les morceaux de texte manquent de contexte global. Souvent, la question nécessite un contexte au-delà de ce qui est indexé dans un morceau spécifique.
  • Réglage minutieux des seuils de top-k / score de similarité. Rendez la valeur trop petite et vous manquerez de contexte. Rendez la valeur trop grande et le coût/la latence pourrait augmenter avec un contexte plus non pertinent.
  • Les représentations incorporées ne sélectionnent pas toujours le contexte le plus pertinent pour une question. Les imbrications sont intrinsèquement déterminées séparément entre le texte et le contexte.

Index du résumé des documents

Un diagramme pour l'Index du résumé du document

Nous proposons un nouvel index dans LlamaIndex qui extraira/indexera un résumé textuel non structuré pour chaque document . Cet index peut aider à améliorer les performances de récupération au-delà des approches de récupération existantes. Il aide à indexer plus d'informations qu'un seul bloc de texte et a plus de signification sémantique que les balises de mots clés. Cela permet également une forme de récupération plus flexible : nous pouvons effectuer à la fois une récupération LLM et une récupération basée sur l'intégration.

Comment ça fonctionne

Pendant la construction, nous ingérons chaque document et utilisons un LLM pour extraire un résumé de chaque document. Nous avons également divisé le document en morceaux de texte (nœuds). Le résumé et les nœuds sont stockés dans notre abstraction de magasin de documents . Nous maintenons une correspondance entre le résumé et le document source/nœuds.

Au moment de la requête, nous récupérons les documents pertinents pour la requête en fonction de leurs résumés, en utilisant les approches suivantes :

  • Récupération basée sur le LLM : Nous présentons des ensembles de résumés de documents au LLM et demandons au LLM de déterminer quels documents sont pertinents + leur score de pertinence.
  • Récupération basée sur l'intégration : nous récupérons les documents pertinents en fonction de la similarité d'intégration du résumé (avec un seuil de top-k).

Le stockage des résumés d'un document permet également une récupération basée sur LLM . Au lieu de transmettre l'intégralité du document au LLM au début, nous pouvons d'abord demander au LLM d'inspecter le résumé concis du document pour voir s'il est pertinent pour la requête. Cela tire parti des capacités de raisonnement des LLM qui sont plus avancées que la recherche basée sur l'intégration, mais évite le coût/la latence de l'envoi de l'intégralité du document au LLM.

Informations supplémentaires

La récupération de documents avec des résumés peut être considérée comme un « terrain d'entente » entre la recherche sémantique et la synthèse par force brute dans tous les documents. Nous recherchons des documents en fonction de la pertinence du résumé avec la requête donnée, puis renvoyons tous les * nœuds * correspondant aux documents récupérés.

Pourquoi devrions-nous faire cela ? Cette méthode de récupération donne à l'utilisateur plus de contexte que top-k sur un morceau de texte, en récupérant le contexte au niveau du document. Mais c'est aussi une approche plus flexible/automatique que la modélisation thématique ; ne vous souciez plus de savoir si votre texte contient les bonnes balises de mots-clés !

Exemple

Passons en revue un exemple qui présente l'index de résumé de document, sur des articles de Wikipédia sur différentes villes.

Le reste de ce guide présente les extraits de code pertinents. Vous pouvez trouver la procédure pas à pas complète ici (et voici le lien du bloc-notes ).

Nous pouvons construire le GPTDocumentSummaryIndexsur un ensemble de documents, et passer un ResponseSynthesizerobjet pour synthétiser les résumés des documents.

from llama_index import (
    SimpleDirectoryReader,
    LLMPredictor,
    ServiceContext,
    ResponseSynthesizer
)
from llama_index.indices.document_summary import GPTDocumentSummaryIndex
from langchain.chat_models import ChatOpenAI

# load docs, define service context
...

# build the index
response_synthesizer = ResponseSynthesizer.from_args(response_mode="tree_summarize", use_async=True)
doc_summary_index = GPTDocumentSummaryIndex.from_documents(
    city_docs, 
    service_context=service_context,
    response_synthesizer=response_synthesizer
)

summary = doc_summary_index.get_document_summary("Boston")

from llama_index.indices.document_summary import DocumentSummaryIndexRetriever

retriever = DocumentSummaryIndexRetriever(
    doc_summary_index,
    # choice_select_prompt=choice_select_prompt,
    # choice_batch_size=choice_batch_size,
    # format_node_batch_fn=format_node_batch_fn,
    # parse_choice_select_answer_fn=parse_choice_select_answer_fn,
    # service_context=service_context
)
retrieved_nodes = retriever.retrieve("What are the sports teams in Toronto?")
print(retrieved_nodes[0].score)
print(retrieved_nodes[0].node.get_text())The retriever will retrieve a set of relevant nodes for a given index.

8.0
Toronto ( (listen) tə-RON-toh; locally [təˈɹɒɾ̃ə] or [ˈtɹɒɾ̃ə]) is the capital city of the Canadian province of Ontario. With a recorded population of 2,794,356 in 2021, it is the most populous city in Canada...

API de haut niveau

query_engine = doc_summary_index.as_query_engine(
  response_mode="tree_summarize", use_async=True
)
response = query_engine.query("What are the sports teams in Toronto?")
print(response)

# use retriever as part of a query engine
from llama_index.query_engine import RetrieverQueryEngine

# configure response synthesizer
response_synthesizer = ResponseSynthesizer.from_args()

# assemble query engine
query_engine = RetrieverQueryEngine(
    retriever=retriever,
    response_synthesizer=response_synthesizer,
)

# query
response = query_engine.query("What are the sports teams in Toronto?")
print(response)

L'approche de la synthèse automatique sur n'importe quel morceau de texte est vraiment excitante. Nous sommes ravis de développer des extensions dans deux domaines :

  • Continuez à explorer la synthèse automatique dans différentes couches. Actuellement, c'est au niveau de la documentation, mais qu'en est-il de résumer un gros morceau de texte en un plus petit ? (par exemple un one-liner).
  • Continuez à explorer la récupération basée sur LLM, que la synthèse aide à débloquer.

Guide de synthèse des documents

Lien vers le bloc-notes