La génération auprès de la récupération (RAG) améliore les modèles d'IA en intégrant les connaissances externes. Cependant, le chiffon traditionnel fragmente souvent les documents, perdant un contexte crucial et impactant la précision.
La récupération contextuelle d'Anthropic aborde cela en ajoutant des explications concises et riches en contexte à chaque morceau de document avant d'incorporer. Cela réduit considérablement les erreurs de récupération, conduisant à une amélioration des performances des tâches en aval. Cet article détaille la récupération contextuelle et sa mise en œuvre.
Tirez parti de Langchain et Rag pour intégrer les données externes avec les LLM.
Les méthodes de chiffon traditionnelles divisent les documents en morceaux plus petits pour une récupération plus facile, mais cela peut éliminer le contexte essentiel. Par exemple, un morceau pourrait indiquer "que plus de 3,85 millions d'habitants en font la ville la plus peuplée de l'Union européenne" sans préciser la ville. Ce manque de contexte entrave la précision.
La récupération contextuelle résout cela en ajoutant un court résumé spécifique au contexte à chaque morceau avant de l'incorporer. L'exemple précédent deviendrait:
<code>contextualized_chunk = """Berlin is the capital and largest city of Germany, known for being the EU's most populous city within its limits. Its more than 3.85 million inhabitants make it the European Union's most populous city, as measured by population within city limits. """</code>
Les tests internes d'Anthropic sur divers ensembles de données (bases de code, articles scientifiques, fiction) démontrent que la récupération contextuelle réduit les erreurs de récupération jusqu'à 49% lorsqu'elles sont associées à des modèles d'intégration contextuels et à BM25.
Cette section décrit une implémentation étape par étape à l'aide d'un exemple de document:
<code># Input text for the knowledge base input_text = """Berlin is the capital and largest city of Germany, both by area and by population. Its more than 3.85 million inhabitants make it the European Union's most populous city, as measured by population within city limits. The city is also one of the states of Germany and is the third smallest state in the country in terms of area. Paris is the capital and most populous city of France. It is situated along the Seine River in the north-central part of the country. The city has a population of over 2.1 million residents within its administrative limits, making it one of Europe's major population centers."""</code>
Étape 1: Création de morceaux
Divisez le document en morceaux plus petits et indépendants (ici, phrases):
<code># Splitting the input text into smaller chunks test_chunks = [ 'Berlin is the capital and largest city of Germany, both by area and by population.', "\n\nIts more than 3.85 million inhabitants make it the European Union's most populous city, as measured by population within city limits.", '\n\nThe city is also one of the states of Germany and is the third smallest state in the country in terms of area.', '\n\n# Paris is the capital and most populous city of France.', '\n\n# It is situated along the Seine River in the north-central part of the country.', "\n\n# The city has a population of over 2.1 million residents within its administrative limits, making it one of Europe's major population centers." ]</code>
Étape 2: Définition du modèle d'invite
Définissez l'invite pour la génération de contexte (le modèle d'Anthropic est utilisé):
<code>from langchain.prompts import ChatPromptTemplate, PromptTemplate, HumanMessagePromptTemplate # Define the prompt for generating contextual information anthropic_contextual_retrieval_system_prompt = """<document> {WHOLE_DOCUMENT} </document> Here is the chunk we want to situate within the whole document <chunk> {CHUNK_CONTENT} </chunk> Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else.""" # ... (rest of the prompt template code remains the same)</code>
Étape 3: Initialisation LLM
Choisissez un LLM (le GPT-4O d'OpenAI est utilisé ici):
<code>import os from langchain_openai import ChatOpenAI # Load environment variables os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" # Initialize the model instance llm_model_instance = ChatOpenAI( model="gpt-4o", )</code>
Étape 4: Création de chaîne
Connectez l'invite et LLM:
<code>from langchain.output_parsers import StrOutputParser # Chain the prompt with the model instance contextual_chunk_creation = anthropic_contextual_retrieval_final_prompt | llm_model_instance | StrOutputParser()</code>
Étape 5: Traitement des morceaux
Générer un contexte pour chaque morceau:
<code># Process each chunk and generate contextual information for test_chunk in test_chunks: res = contextual_chunk_creation.invoke({ "WHOLE_DOCUMENT": input_text, "CHUNK_CONTENT": test_chunk }) print(res) print('-----')</code>
(la sortie est affichée dans l'exemple d'origine)
Rerraner davantage la récupération de la récupération en priorisant les morceaux les plus pertinents. Cela améliore la précision et réduit les coûts. Dans les tests d'Anthropic, le rediffusion a diminué les erreurs de récupération de 5,7% à 1,9%, une amélioration de 67%.
pour les bases de connaissances plus petites (& LT; 200 000 jetons), y compris l'ensemble de la base de connaissances directement dans l'invite, pourrait être plus efficace que l'utilisation de systèmes de récupération. De plus, l'utilisation de la mise en cache rapide (disponible avec Claude) peut réduire considérablement les coûts et améliorer les temps de réponse.
La récupération contextuelle d'Anthropic offre une méthode simple mais puissante pour améliorer les systèmes de chiffon. La combinaison des intérêts contextuels, BM25 et RERANKING améliore considérablement la précision. Une exploration plus approfondie des autres techniques de récupération est recommandée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!