Utilisez LangChain pour créer une application RAG basée sur des documents Notion


Comment interroger des documents Notion via un modèle de langage ? LangChain et Milvus sont indispensables.


Tout au long du processus, nous utiliserons LangChain comme cadre et Milvus comme moteur de recherche de similarité, et les utiliserons pour créer une application de base de génération améliorée de récupération (RAG). Dans les articles précédents, nous avons introduit « l'auto-requête » dans LangChain. Essentiellement, la fonction d'auto-requête de LangChain consiste à créer une architecture RAG de base, comme le montre la figure :



Le traitement des documents Notion dans LangChain comprend trois étapes : l'obtention, le stockage et l'interrogation des documents. La récupération fait référence à l'obtention du document Notion et au chargement du contenu en mémoire. Les étapes de stockage comprennent le démarrage de la base de données vectorielles (Milvus), la conversion des documents en vecteurs et le stockage des vecteurs de documents dans la base de données vectorielles. La partie requête consiste à poser des questions sur le document Notion. Cet article vous guidera à travers ces trois étapes une par une. Pour le code, veuillez vous référer au  notebook Colab ( https://colab.research.google.com/drive/1hDwF9 EkGd1SND3CUe15OmfvpOMd0lM-m?usp=sharing).


01.

Obtenir la documentation Notion


Utilisez LangChain  NotionDirectoryLoaderpour charger le document en mémoire. Nous fournissons le chemin d'accès au document et appelons loadla fonction pour obtenir le document Notion. Après le chargement, vous pouvez obtenir le fichier Markdown du document Notion. Dans cet exemple, nous utilisons un fichier Markdown comme exemple.


Ensuite, utilisez le séparateur de texte de titre markdown de LangChain. Nous lui fournissons une liste de délimiteurs, puis transmettons ceux nommés précédemment md_filepour obtenir le contenu délimité. Lors de la définition headers_to_split_onde la liste, utilisez le titre de votre propre document Notion.


# Load Notion page as a markdownfile filefrom langchain.document_loaders import NotionDirectoryLoader
path='./notion_docs'
loader = NotionDirectoryLoader(path)
docs = loader.load()
md_file=docs[0].page_content
# Let's create groups based on the section headers in our pagefrom langchain.text_splitter import MarkdownHeaderTextSplitter
headers_to_split_on = [
    ("##""Section"),
]
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(md_file)

Divisez la tâche et vérifiez les résultats de la répartition. En utilisant LangChain RecursiveCharacterTextSplitter, utilisez des caractères différents pour la segmentation. Les quatre caractères de vérification par défaut sont la nouvelle ligne, la double nouvelle ligne, l'espace ou l'absence d'espace. Vous pouvez également choisir de transmettre vos propres separatorsparamètres.


Lorsque nous divisons le document Notion en morceaux, nous devons également définir deux hyperparamètres clés : la taille des morceaux et le chevauchement des morceaux. Dans cet exemple, la taille du bloc est de 64 et le chevauchement est de 8. Ensuite, nous pouvons appeler split_documentsla fonction pour diviser tous les documents.


# Define our text splitter
from langchain.text_splitter import RecursiveCharacterTextSplitter
chunk_size = 64
chunk_overlap = 8
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
all_splits = text_splitter.split_documents(md_header_splits)
all_splits

L'image ci-dessous montre un objet partiellement divisé documentqui contient le contenu de la page et les métadonnées. Les métadonnées indiquent de quel chapitre le contenu a été extrait.



02.

Stockage des documents Notion


Une fois que tous les documents ont été chargés et divisés, ces morceaux de documents doivent être stockés. Tout d'abord, exécutez la base de données vectorielle Milvus Lite directement dans le notebook, puis importez les modules LangChain requis - Milvuset OpenAI Embeddings.


Utilisez le module Milvus de LangChain pour créer une collection pour les blocs de documents. Les paramètres que nous devons transmettre à cette étape incluent : la liste des documents, le modèle d'intégration utilisé, les paramètres de connexion et le nom de la collection (facultatif).


from milvus import default_server
default_server.start()
from langchain.vectorstores import Milvus
from langchain.embeddings import OpenAIEmbeddings


vectordb = Milvus.from_documents(documents=all_splits,
    embedding=OpenAIEmbeddings(),
    connection_args={"host""127.0.0.1""port": default_server.listen_port},
    collection_name="EngineeringNotionDoc")


03.

Documentation sur la notion de requête


Vous pouvez maintenant commencer à interroger le document. Avant de commencer, nous devons importer trois modules supplémentaires depuis LangChain :


  • OpenAI: Utilisé pour accéder à GPT.

  • SelfQueryRetriever: Utilisé pour créer des applications RAG de base.

  • Attribute info: utilisé pour transmettre des métadonnées.


Tout d’abord, nous définissons les métadonnées. Par la suite, le récupérateur d’auto-requête doit recevoir une description du document. Dans ce cas, la description constitue la « partie principale du document ». Avant d'instancier le récupérateur d'auto-requête, définissez la température du GPT sur 0 et affectez-la à une variable nommée llm. Avec les champs LLM, base de données vectorielles, description du document et métadonnées en place, nous avons complété la définition du récupérateur d'auto-requête.


from langchain.llms import OpenAI
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.base import AttributeInfo


metadata_fields_info = [
    AttributeInfo(
        name="Section",
        description="Part of the document that the text comes from",
        type="string or list[string]"
    ),
]
document_content_description = "Major sections of the document"


llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(llm, vectordb, document_content_description, metadata_fields_info, verbose=True)
retriever.get_relevant_documents("What makes a distinguished engineer?")


Dans l'exemple suivant, nous posons la question : « Qu'est-ce qui fait un ingénieur distingué ? »


La réponse est présentée ci-dessous. Nous obtenons le fragment de document le plus similaire sémantiquement à la question. Mais il n’est pas difficile de constater que les réponses ne sont similaires que sémantiquement et ne sont pas tout à fait correctes.


Ce didacticiel explique comment charger et analyser des documents Notion, et créer une application RAG de base pour interroger les documents Notion. Nous avons utilisé LangChain comme framework et Milvus comme base de données vectorielles pour la recherche de similarité. Si vous souhaitez explorer plus en profondeur, il est recommandé d'ajuster les paramètres tels que la taille des fragments et le chevauchement pour vérifier comment les différentes valeurs de paramètres affectent les résultats de la requête.


Ce que l'on appelle le chunking est le problème le plus difficile dans la création d'applications de génération augmentée par récupération (RAG) (https://zilliz.com.cn/use-cases/llm-retrieval-augmented-generation). Pour une introduction et un fonctionnement spécifiques, veuillez vous référer à « Après avoir essayé N possibilités dans LangChain, j'ai découvert le secret du blocage ! »


Auteur de cet article

Yujian Tang
Zilliz Développeur Évangéliste

Lecture recommandée



Cet article est partagé à partir du compte public WeChat - ZILLIZ (Zilliztech).
En cas d'infraction, veuillez contacter [email protected] pour suppression.
Cet article participe au " Plan de création de sources OSC ". Vous qui lisez êtes invités à vous joindre et à partager ensemble.

Tang Xiaoou, fondateur de SenseTime, est décédé à l'âge de 55 ans. En 2023, PHP stagne . Le système Hongmeng est sur le point de devenir indépendant et de nombreuses universités ont mis en place des « classes Hongmeng ». La version PC de Quark Browser a commencé les tests internes . ByteDance a été "interdit" par OpenAI. La start-up de Zhihuijun a été refinancée, avec un montant de plus de 600 millions de yuans et une valorisation pré-monétaire de 3,5 milliards de yuans. Les assistants de code IA sont si populaires qu'ils ne peuvent même pas rivaliser dans la programmation classement des langues Le modem 5G et la technologie de radiofréquence du Mate 60 Pro sont loin devant No Star, No Fix MariaDB se sépare de SkySQL et forme une société indépendante
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/u/4209276/blog/10315608
conseillé
Classement