Maison  >  Article  >  Périphériques technologiques  >  Implémenter du code Python pour améliorer les capacités de récupération des grands modèles

Implémenter du code Python pour améliorer les capacités de récupération des grands modèles

WBOY
WBOYavant
2023-11-21 11:21:111641parcourir

Implémenter du code Python pour améliorer les capacités de récupération des grands modèles

L'objectif principal de cet article est le concept et la théorie de RAG. Ensuite, nous montrerons comment utiliser LangChain, le modèle de langage OpenAI et la base de données vectorielles Weaviate pour implémenter un système d'orchestration RAG simple

Qu'est-ce que la génération d'amélioration de récupération ?

Le concept de Retrieval Augmented Generation (RAG) fait référence à la fourniture d'informations supplémentaires au LLM via des sources de connaissances externes. Cela permet à LLM de générer des réponses plus précises et contextuelles tout en réduisant les hallucinations.

Lors de la réécriture du contenu, le texte original doit être réécrit en chinois sans la phrase originale

Le meilleur LLM actuel est formé à l'aide d'une grande quantité de données, de sorte que ses poids de réseau neuronal sont stockés dans A beaucoup de connaissances générales (mémoire de paramètres). Cependant, si l'invite demande à LLM de générer des résultats qui nécessitent des connaissances autres que ses données de formation (telles que de nouvelles informations, des données exclusives ou des informations spécifiques à un domaine), des inexactitudes factuelles peuvent survenir lors de la réécriture du contenu, vous devez le texte original. a été réécrit en chinois sans la phrase originale (illusion), comme le montre la capture d'écran ci-dessous :

Implémenter du code Python pour améliorer les capacités de récupération des grands modèles

Par conséquent, il est important de combiner les connaissances générales du LLM avec un contexte supplémentaire afin de générer des plus Résultats contextuels et hallucinations réduites

Solution

Traditionnellement, nous pouvons adapter les réseaux de neurones à des domaines spécifiques ou à des informations propriétaires en affinant le modèle. Bien que cette technique soit efficace, elle nécessite de grandes quantités de ressources informatiques, est coûteuse et nécessite le soutien d'experts techniques, ce qui rend difficile une adaptation rapide à l'évolution des informations

En 2020, l'article de Lewis et al. "Retrieval " -Augmented Generation for Knowledge-Intensive NLP Tasks" propose une technologie plus flexible : Retrieval Enhanced Generation (RAG). Dans cet article, les chercheurs combinent le modèle génératif avec un module de récupération pouvant fournir des informations supplémentaires à l’aide d’une source de connaissances externe plus facilement mise à jour.

Pour le dire en langue vernaculaire : RAG est au LLM ce que l'examen à livre ouvert est aux humains. Pour les examens à livre ouvert, les étudiants peuvent apporter du matériel de référence tel que des manuels et des notes où ils peuvent trouver des informations pertinentes pour répondre aux questions. L'idée derrière les examens à livre ouvert est que l'examen se concentre sur la capacité des étudiants à raisonner plutôt que sur leur capacité à mémoriser des informations spécifiques.

De même, les connaissances de facto sont distinctes des capacités d'inférence LLM et peuvent être stockées dans des sources de connaissances externes qui sont facilement accessibles et mises à jour

  • Connaissances paramétrées : connaissances apprises au cours de la formation pour implicitement La méthode incluse est stockée dans le poids des réseaux neuronaux.
  • Connaissances non paramétriques : stockées dans des sources de connaissances externes, telles que des bases de données vectorielles.

Le diagramme suivant montre le flux de travail RAG le plus basique :

Implémenter du code Python pour améliorer les capacités de récupération des grands modèles

Contenu réécrit : reconstruction du flux de travail de génération augmentée de récupération (RAG)

  1. Récupération : application de requêtes utilisateur pour récupérer le contexte pertinent à partir de sources de connaissances externes. Pour ce faire, un modèle d'intégration est utilisé pour intégrer la requête utilisateur dans le même espace vectoriel en tant que contexte supplémentaire dans la base de données vectorielle. Cela vous permet d'effectuer une recherche de similarité et de renvoyer les k objets de données de cette base de données vectorielles les plus proches de la requête de l'utilisateur.
  2. Amélioration : la requête de l'utilisateur et le contexte supplémentaire récupéré sont ensuite renseignés dans un modèle d'invite.
  3. Génération : Enfin, l'invite améliorée de récupération est transmise à LLM.

Utilisez LangChain pour implémenter la génération d'améliorations de récupération

Ce qui suit présentera comment implémenter le flux de travail RAG via Python, qui utilisera la base de données vectorielles OpenAI LLM et Weaviate et un modèle d'intégration OpenAI. Le rôle de LangChain est l’orchestration.

Veuillez reformuler : Prérequis requis

Veuillez vous assurer que les packages Python requis sont installés :

  • langchain, orchestration
  • openai, modèle embarqué et LLM
  • weaviate-client, base de données vectorielle
#!pip install langchain openai weaviate-client

De plus, utilisez un fichier .env dans le répertoire racine pour définir les variables d'environnement pertinentes. Vous avez besoin d'un compte OpenAI pour obtenir la clé API OpenAI, puis de "Créer une nouvelle clé" dans Clés API (https://platform.openai.com/account/api-keys).

OPENAI_API_KEY="<your_openai_api_key>"</your_openai_api_key>

Ensuite, exécutez la commande suivante pour charger les variables d'environnement pertinentes.

import dotenvdotenv.load_dotenv()

Préparation

Dans la phase de préparation, vous devez préparer une base de données vectorielles en tant que source de connaissances externe pour enregistrer toutes les informations supplémentaires. La construction de cette base de données vectorielles comprend les étapes suivantes :

  1. Collecter et charger les données
  2. Catégoriser le document
  3. Intégrer les blocs de texte et enregistrer

Le contenu réécrit : Tout d'abord, il nous faut pour collecter et charger les données. À titre d’exemple, si nous souhaitons utiliser le discours sur l’état de l’Union 2022 du président Biden comme contexte supplémentaire, le référentiel GitHub de LangChain fournit le document texte original de ce fichier. Afin de charger ces données, nous pouvons profiter des différents outils de chargement de documents intégrés de LangChain. Un document est un dictionnaire composé de texte et de métadonnées. Pour charger du texte, vous pouvez utiliser l'outil TextLoader de LangChain

Adresse originale du document : https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt

import requestsfrom langchain.document_loaders import TextLoaderurl = "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt"res = requests.get(url)with open("state_of_the_union.txt", "w") as f:f.write(res.text)loader = TextLoader('./state_of_the_union.txt')documents = loader.load()

Ensuite, divisez le document en morceaux. Étant donné que l'état original du document est trop long pour tenir dans la fenêtre contextuelle de LLM, il doit être divisé en morceaux de texte plus petits. LangChain dispose également de nombreux outils de fractionnement intégrés. Pour cet exemple simple, nous pouvons utiliser un CharacterTextSplitter avec chunk_size défini sur 500 et chunk_overlap défini sur 50, qui maintient la continuité du texte entre les morceaux de texte.

from langchain.text_splitter import CharacterTextSplittertext_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)chunks = text_splitter.split_documents(documents)

Enfin, intégrez le bloc de texte et enregistrez-le. Pour que la recherche sémantique soit effectuée dans les blocs de texte, des intégrations vectorielles doivent être générées pour chaque bloc de texte et enregistrées avec leurs intégrations. Pour générer des intégrations vectorielles, utilisez le modèle d'intégration OpenAI ; pour le stockage, utilisez la base de données vectorielles Weaviate. Des blocs de texte peuvent être automatiquement renseignés dans une base de données vectorielles en appelant .from_documents().

from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Weaviateimport weaviatefrom weaviate.embedded import EmbeddedOptionsclient = weaviate.Client(embedded_options = EmbeddedOptions())vectorstore = Weaviate.from_documents(client = client,documents = chunks,embedding = OpenAIEmbeddings(),by_text = False)

Étape 1 : Récupérer

Après avoir rempli la base de données vectorielle, nous pouvons la définir comme un composant de récupération qui peut être récupéré en fonction de la similarité sémantique entre la requête utilisateur et le bloc intégré. Contexte supplémentaire

retriever = vectorstore.as_retriever()

Étape 2 : Améliorer

from langchain.prompts import ChatPromptTemplatetemplate = """You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.Question: {question} Context: {context} Answer:"""prompt = ChatPromptTemplate.from_template(template)print(prompt)

Ensuite, afin d'améliorer l'invite avec un contexte supplémentaire, vous devez préparer un modèle d'invite. Comme indiqué ci-dessous, l'invite peut être facilement personnalisée à l'aide d'un modèle d'invite.

Étape 3 : Générer

Enfin, nous pouvons créer une chaîne de pensée pour ce processus RAG qui relie le récupérateur, le modèle d'invite et le LLM. Une fois la chaîne RAG définie, elle peut être appelée

from langchain.chat_models import ChatOpenAIfrom langchain.schema.runnable import RunnablePassthroughfrom langchain.schema.output_parser import StrOutputParserllm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)rag_chain = ({"context": retriever,"question": RunnablePassthrough()} | prompt | llm| StrOutputParser() )query = "What did the president say about Justice Breyer"rag_chain.invoke(query)"The president thanked Justice Breyer for his service and acknowledged his dedication to serving the country. The president also mentioned that he nominated Judge Ketanji Brown Jackson as a successor to continue Justice Breyer's legacy of excellence."

La figure suivante montre le processus RAG pour cet exemple spécifique :

Implémenter du code Python pour améliorer les capacités de récupération des grands modèles

Résumé

Cet article présente le concept de RAG, qui provient à l'origine de l'article de 2020 « Génération augmentée de récupération pour les tâches PNL à forte intensité de connaissances ». Après avoir présenté la théorie derrière RAG, y compris la motivation et les solutions, cet article montre comment l'implémenter en Python. Cet article montre comment implémenter un workflow RAG à l'aide d'OpenAI LLM couplé à la base de données vectorielles Weaviate et au modèle d'intégration OpenAI. Le rôle de LangChain est l’orchestration.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer