{"id":28969,"date":"2024-08-06T15:17:01","date_gmt":"2024-08-06T13:17:01","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=28969"},"modified":"2024-09-10T17:11:59","modified_gmt":"2024-09-10T15:11:59","slug":"rag-langchain","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/","title":{"rendered":"Recupero ed esplorazione di documenti: dalla creazione di agenti LLM a un RAG personalizzato con LangChain"},"content":{"rendered":"\n<p>I modelli linguistici di grandi dimensioni (LLM), come GPT-3 e GPT-4, sono potenti strumenti di generazione del linguaggio naturale. Tuttavia, <strong>uno dei loro principali limiti \u00e8 l&#8217;incapacit\u00e0 di accedere a informazioni aggiornate<\/strong> e accurate, il che pu\u00f2 portare a risposte imprecise o &#8220;allucinate&#8221;. La Retrieval-Augmented Generation (RAG) rappresenta una soluzione a questo problema, combinando la generazione del linguaggio naturale con il recupero di informazioni da una base di conoscenza esterna. Questo approccio non solo migliora l&#8217;accuratezza delle risposte, ma <strong>consente anche di accedere a informazioni aggiornate e verificate<\/strong>. In questo articolo, esploreremo come creare da zero agenti LLM per RAG e come costruire un RAG personalizzato con LangChain per migliorare l&#8217;esplorazione della documentazione.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cos-e-rag-e-perche-e-importante\">Cos\u2019\u00e8 RAG e perch\u00e9 \u00e8 importante<\/h2>\n\n\n\n<p>RAG, o Retrieval-Augmented Generation, \u00e8 un approccio che combina il recupero di informazioni con la generazione di testo. In un sistema RAG: <\/p>\n\n\n\n<p><strong>1. &nbsp;<\/strong>Una query viene utilizzata per recuperare documenti rilevanti da una knowledge base.<\/p>\n\n\n\n<p><strong>2. &nbsp;<\/strong>Questi documenti vengono quindi inseriti in un modello linguistico insieme alla query originale.<\/p>\n\n\n\n<p><strong>3. &nbsp;<\/strong>Il modello genera una risposta basata sia sulla query che sulle informazioni recuperate.<\/p>\n\n\n\n<p>I vantaggi di RAG:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ancorando le risposte nelle informazioni recuperate, RAG riduce le allucinazioni e migliora l&#8217;accuratezza dei fatti.<\/li>\n\n\n\n<li>la base di conoscenza pu\u00f2 essere aggiornata regolarmente, consentendo al sistema di accedere alle informazioni attuali.<\/li>\n\n\n\n<li>il sistema pu\u00f2 fornire fonti per le sue informazioni, aumentando la fiducia e consentendo il controllo dei fatti.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-comprendere-gli-agenti-llm\">Comprendere gli agenti LLM<\/h2>\n\n\n\n<p>Gli agenti LLM sono ideali per affrontare problemi complessi senza una risposta semplice. Essi combinano analisi approfondita dei dati, pianificazione strategica, recupero dei dati e capacit\u00e0 di apprendere dalle azioni passate per risolvere problemi complessi. I componenti degli agenti LLM sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agente\/cervello: il modello linguistico che elabora e comprende il linguaggio.<\/li>\n\n\n\n<li>Pianificazione: capacit\u00e0 di ragionare, suddividere i compiti e sviluppare piani specifici.<\/li>\n\n\n\n<li>Memorie: conserva le registrazioni delle interazioni passate e impara da esse.<\/li>\n\n\n\n<li>Uso dello strumento: integra varie risorse per eseguire attivit\u00e0.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-costruire-un-rag-personalizzato-con-langchain-per-esplorare-i-documenti\">Costruire un RAG personalizzato con LangChain per esplorare i documenti<\/h2>\n\n\n\n<p>Per cercare, esplorare, elaborare e gestire efficacemente la documentazione, possiamo creare un <a href=\"https:\/\/seacom.it\/costruire-un-rag-personalizzato-con-langchain-per-esplorare-i-documenti\/?aff=codemotion\" target=\"_blank\" rel=\"noreferrer noopener\">RAG personalizzato con LangChain<\/a> che consente di recuperare e generare risposte basate su documenti specifici. LangChain, framework per facilitare lo sviluppo e l\u2019implementazione di applicazioni di intelligenza artificiale (<a href=\"https:\/\/seacom.it\/soluzioni\/business-ai\/?aff=codemotion\" target=\"_blank\" rel=\"noreferrer noopener\">AI<\/a>), offre una serie di librerie e moduli che permettono agli sviluppatori di integrare facilmente capacit\u00e0 di ricerca, elaborazione e generazione del linguaggio nei loro progetti.<\/p>\n\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1-1024x576.png\" alt=\"\" class=\"wp-image-28984\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1-1024x576.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1-300x169.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1-768x432.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1-1536x864.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1-896x504.png 896w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1-400x225.png 400w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-1-1.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Flusso che mostra il processo completo: dal caricamento dei documenti alla risposta <\/figcaption><\/figure>\n\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-document-loader\"><strong>Document Loader<\/strong><\/h3>\n\n\n\n<p>Per interagire con i nostri dati, \u00e8 fondamentale caricarli in un formato che ne consenta l&#8217;elaborazione. A tale scopo, utilizziamo i <a href=\"https:\/\/python.langchain.com\/v0.2\/docs\/integrations\/document_loaders\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Document Loader<\/a> di LangChain, che semplificano l&#8217;accesso e la conversione dei dati provenienti da una vasta gamma di formati e fonti.<\/p>\n\n\n\n<p>Questi Loader sono progettati per gestire le specificit\u00e0 dell&#8217;accesso ai dati da diverse sorgenti, tra cui:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Siti web<\/li>\n\n\n\n<li>Database<\/li>\n\n\n\n<li>YouTube<\/li>\n\n\n\n<li>Twitter<\/li>\n\n\n\n<li>Hacker News<\/li>\n\n\n\n<li>Figma, Notion, o servizi come Stripe<\/li>\n<\/ul>\n\n\n\n<p>Per ulteriori dettagli, si consiglia di consultare la documentazione ufficiale di LangChain.<\/p>\n\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-unstructuredmarkdownloader\"><strong>UnstructuredMarkdownLoader<\/strong><\/h3>\n\n\n\n<p>Per lavorare con documenti in formato Markdown, facciamo affidamento su UnstructuredMarkdownLoader. Implementiamo una classe DocumentManager per caricare efficacemente una directory contenente i documenti Markdown:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">from langchain_community.document_loaders import DirectoryLoader\nfrom langchain_community.document_loaders import UnstructuredMarkdownLoader\n\nclass DocumentManager:\n    def __init__(self, directory_path, glob_pattern=\".\/*.md\"):\n        self.directory_path = directory_path\n        self.glob_pattern = glob_pattern\n        self.documents = &#91;]\n        self.all_sections = &#91;]\n    \n    def load_documents(self): loader = DirectoryLoader(self.directory_path, \n        glob=self.glob_pattern, show_progress=True, \n        loader_cls=UnstructuredMarkdownLoader)\n        self.documents = loader.load()<\/code><\/span><\/pre>\n\n\n<p>La classe&nbsp;<code>DocumentManager<\/code>&nbsp;permette il&nbsp;<strong>caricamento di documenti Markdown<\/strong>&nbsp;da una directory specificata. Attraverso l\u2019uso di&nbsp;<code>DirectoryLoader<\/code>&nbsp;e&nbsp;<code>UnstructuredMarkdownLoader<\/code>, la classe \u00e8 in grado di:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\"><\/code><\/span><\/pre>\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Accedere alla directory<\/strong>: individua la directory dove si trovano i documenti Markdown.<\/li>\n\n\n\n<li><strong>Filtrare i file<\/strong>: utilizza il&nbsp;<code>glob_pattern<\/code>&nbsp;fornito (di default, tutti i file&nbsp;<code>.md<\/code>) per selezionare i documenti da caricare.<\/li>\n\n\n\n<li><strong>Caricare i documenti<\/strong>: importa i file filtrati per l\u2019elaborazione successiva.<\/li>\n<\/ol>\n\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-text-splitters\"><strong>Text Splitters<\/strong><\/h3>\n\n\n\n<p>I <a href=\"https:\/\/python.langchain.com\/v0.1\/docs\/modules\/data_connection\/document_transformers\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Text Splitters<\/a> sono cruciali per l&#8217;elaborazione dei testi, poich\u00e9 consentono di dividere documenti complessi in parti pi\u00f9 gestibili. La sfida principale in questo processo \u00e8 mantenere le relazioni semantiche tra i segmenti, evitando di perdere connessioni significative tra i blocchi.<\/p>\n\n\n\n<p>LangChain offre diverse soluzioni per affrontare questa sfida. Nel caso di documenti in formato Markdown, utilizzeremo il MarkdownHeaderTextSplitter. Per ulteriori dettagli sulle diverse tipologie di splitter disponibili, consultate la documentazione ufficiale di LangChain.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"> <span class=\"hljs-comment\"># Class DocumentManager<\/span>\n\nfrom langchain.text_splitter import MarkdownHeaderTextSplitter\n\n    def split_documents(<span class=\"hljs-keyword\">self<\/span>):\n        headers_to_split_on = &#91;(<span class=\"hljs-string\">\"#\"<\/span>, <span class=\"hljs-string\">\"Header 1\"<\/span>), \n        (<span class=\"hljs-string\">\"##\"<\/span>, <span class=\"hljs-string\">\"Header 2\"<\/span>), \n        (<span class=\"hljs-string\">\"###\"<\/span>, <span class=\"hljs-string\">\"Header 3\"<\/span>), \n        (<span class=\"hljs-string\">\"####\"<\/span>, <span class=\"hljs-string\">\"Header 4\"<\/span>)]\n        text_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)\n        <span class=\"hljs-keyword\">for<\/span> doc in <span class=\"hljs-keyword\">self<\/span>.documents:\n            sections = text_splitter.split_text(doc.page_content)\n            <span class=\"hljs-keyword\">self<\/span>.all_sections.extend(sections)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-embedding-e-vector-store\"><strong>Embedding e Vector Store<\/strong><\/h3>\n\n\n\n<p>Dopo aver suddiviso i documenti in frammenti pi\u00f9 piccoli tramite il text splitting, il passo successivo consiste nel trasformare questi frammenti in una forma facilmente interrogabile e comparabile. \u00c8 qui che entrano in gioco gli embedding e i database vettoriali. Utilizzando OpenAIEmbeddings, convertiamo ciascun frammento di testo in un embedding vettoriale. Gli embedding sono rappresentazioni numeriche dense che catturano la semantica del testo; frammenti con significati simili risultano in vettori simili nello spazio degli embedding. Questo consente operazioni sofisticate come la ricerca semantica e il clustering tematico.<\/p>\n\n\n\n<p>Per memorizzare e gestire efficacemente questi embedding, utilizziamo Chroma, un database vettoriale open-source. Ho scelto Chroma per la sua semplicit\u00e0 di implementazione, permettendo la creazione di un vector store permanente direttamente nella cartella del progetto. Questo elimina la necessit\u00e0 di configurazioni complesse o dell&#8217;uso di <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/github-uncharted-alla-scoperta-dei-tesori-nascosti-di-docker-con-serena-sensini\/\" target=\"_blank\" rel=\"noreferrer noopener\">container Docker<\/a>.<\/p>\n\n\n\n<p>Con Chroma possiamo organizzare gli embedding in modo che siano rapidamente recuperabili attraverso query basate sulla similarit\u00e0. Questo approccio trasforma una collezione di testi in un database interrogabile, dove \u00e8 possibile trovare documenti o frammenti rilevanti per una determinata query confrontando gli embedding della query con quelli presenti nell&#8217;archivio.<\/p>\n\n\n\n<p>LangChain supporta vari vector store. Per una lista completa, consultate la documentazione ufficiale di LangChain.<\/p>\n\n\n\n<p>Importiamo OpenAIEmbeddings e Chroma in una classe EmbeddingManager cosi da automatizzare il processo di creazione e memorizzazione degli embedding. Inizializziamo EmbeddingManager con i frammenti di testo e un path per la persistenza dei dati. Invocando il metodo create_and_persist_embeddings, ogni frammento viene trasformato in un embedding attraverso OpenAIEmbeddings e memorizzato in Chroma.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">from langchain_openai import OpenAIEmbeddings\nfrom langchain_community.vectorstores import Chroma\n\nclass EmbeddingManager:\n    def __init__(self, all_sections, persist_directory='db'):\n        self.all_sections = all_sections\n        self.persist_directory = persist_directory\n        self.vectordb = None\n        \n    # Method to create and persist embeddings\n    def create_and_persist_embeddings(self):\n        # Creating an instance of OpenAIEmbeddings\n        embedding = OpenAIEmbeddings()\n        # Creating an instance of Chroma with the sections and the embeddings\n        self.vectordb = Chroma.from_documents(documents=self.all_sections, \n        embedding=embedding, \n        persist_directory=self.persist_directory)\n\n         # Persisting the embeddings\n        self.vectordb.persist()\n<\/code><\/span><\/pre>\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/seacom.it\/videos\/?aff=codemotion\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Rivivi-gli-eventi-1024x300.png\" alt=\"\" class=\"wp-image-29132\" style=\"width:1090px;height:auto\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Rivivi-gli-eventi-1024x300.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Rivivi-gli-eventi-300x88.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Rivivi-gli-eventi-768x225.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Rivivi-gli-eventi.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-retriever\"><strong>Retriever<\/strong><\/h3>\n\n\n\n<p>Il retriver rappresenta il nucleo del nostro RAG (Retrieval Augmented Generation). Questo strumento \u00e8 essenziale per individuare e recuperare i documenti pi\u00f9 rilevanti in risposta a una query specifica, sfruttando il vector store Chroma che contiene gli embedding dei documenti. La ricerca si basa sulla similarit\u00e0 degli embedding, confrontando quelli della query con quelli dei documenti per identificare i pi\u00f9 pertinenti al tema della domanda.<\/p>\n\n\n\n<p>Quando dobbiamo rispondere a domande basate sui nostri documenti, la sfida principale consiste spesso nel recuperare efficacemente le informazioni rilevanti. Un recupero inefficace pu\u00f2 facilmente portare a risposte inesatte o incomplete.<\/p>\n\n\n\n<p>Noi impiegheremo la Conversational Retrieval Chain. Questa catena non si limita a recuperare i documenti pi\u00f9 pertinenti rispetto all&#8217;ultima query, ma sfrutta anche il contesto della conversazione per migliorare la qualit\u00e0 delle risposte fornite. Il processo si articola in tre fasi principali:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Riformulazione della query<\/strong>: la catena modifica la query iniziale per includere il contesto della conversazione, consentendo al sistema di &#8220;ricordare&#8221; le richieste precedenti e di formulare risposte pi\u00f9 precise.<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Recupero dei documenti rilevanti<\/strong>: utilizzando un &#8216;retriever&#8217;, la catena cerca documenti pertinenti alla query riformulata. Questo recupero si basa sulla similarit\u00e0 degli embedding, identificando i documenti che meglio corrispondono al tema della domanda.<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Generazione della risposta<\/strong>: infine, la catena chiede a un Large Language Model (LLM) di generare una risposta basata sui documenti recuperati e sulla query riformulata. Questo passaggio combina il contesto dei documenti rilevanti con la domanda per produrre una risposta coerente e informativa.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">from langchain_openai import OpenAI\nfrom dotenv import load_dotenv\nfrom langchain.chains import ConversationalRetrievalChain\nimport os\nload_dotenv()\n\n# Set the OpenAI API key from the environment variable\nos.environ&#91;\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\")\n\n\nclass ConversationalRetrievalAgent:\n    # Initialize the ConversationalRetrievalAgent with a vector \n      database and a temperature for the OpenAI model\n    def __init__(self, vectordb, temperature=0.5):\n        self.vectordb = vectordb\n        self.llm = OpenAI(temperature=temperature)\n        self.chat_history = &#91;]\n    \n    # Method to get the chat history as a string    \n    def get_chat_history(self, inputs):\n        res = &#91;]\n        for human, ai in inputs:\n            res.append(f\"Human:{human}\\nAI:{ai}\")\n        return \"\\n\".join(res)\n    \n    # Method to set up the bot\n    def setup_bot(self):\n         # Create a retriever from the vector database\n        retriever = self.vectordb.as_retriever(search_kwargs={\"k\": 4})\n        # Create a ConversationalRetrievalChain from the OpenAI model and the retriever\n        self.bot = ConversationalRetrievalChain.from_llm(\n            self.llm, retriever, return_source_documents=True, \n            get_chat_history=self.get_chat_history\n        )<\/code><\/span><\/pre>\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-prompt-and-templates\"><strong>Prompt and templates<\/strong><\/h3>\n\n\n\n<p>Sebbene il nostro ConversationalRetrievalChain faccia gi\u00e0 uso della cronologia delle chat, ho scelto di implementare un ulteriore livello di personalizzazione attraverso un sistema di prompt e template personalizzabile. Questa decisione mira ad ottimizzare l\u2019interazione con il nostro modello e di migliorare ulteriormente la pertinenza e l\u2019accuratezza delle risposte fornite.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">    <span class=\"hljs-comment\"># Class ConversationalRetrievalAgent:<\/span>\n\n    def generate_prompt(<span class=\"hljs-keyword\">self<\/span>, question):\n        <span class=\"hljs-keyword\">if<\/span> not <span class=\"hljs-keyword\">self<\/span>.chat_history:\n            <span class=\"hljs-comment\"># If it is the first question, use a specific template without <\/span>\n            <span class=\"hljs-comment\"># previous conversation context<\/span>\n            prompt = f<span class=\"hljs-string\">\"You are an assistant for question-answering tasks. \nUse the following pieces of retrieved context to answer the question. \nIf you don't know the answer, just say that you don't know. \n\\nQuestion: {question}\\nContext: \\nAnswer:\"<\/span>\n        <span class=\"hljs-keyword\">else<\/span>:\n            <span class=\"hljs-comment\"># If it is the first question, use a specific template without <\/span>\n            <span class=\"hljs-comment\"># previous conversation context<\/span>\n\n            context_entries = &#91;f<span class=\"hljs-string\">\"Question: {q}\\nAnswer: {a}\"<\/span> <span class=\"hljs-keyword\">for<\/span> q, a in <span class=\"hljs-keyword\">self<\/span>.chat_history&#91;<span class=\"hljs-number\">-3<\/span>:]]\n            context = <span class=\"hljs-string\">\"\\n\\n\"<\/span>.join(context_entries)\n            prompt = f<span class=\"hljs-string\">\"Using the context provided by recent conversations, \nanswer the new question in a concise and informative. \nLimit your answer to a maximum of three sentences.\n\\n\\nContext of recent conversations:\\n{context}\\n\\nNew question: {question}\\n\\Answer:\"<\/span>\n        \n        <span class=\"hljs-keyword\">return<\/span> prompt\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-conversazione\">Conversazione<\/h3>\n\n\n\n<p>In fine implementeremo il metodo ask_question, all\u2019interno del nostro ConversationalRetrievalAgent. Questo metodo incapsula il processo attraverso il quale si riceve una domanda, si elabora la richiesta, e fornisce una risposta pertinente e informata.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Class ConversationalRetrievalAgent<\/span>\n   \n    def ask_question(<span class=\"hljs-keyword\">self<\/span>, query):\n        prompt = <span class=\"hljs-keyword\">self<\/span>.generate_prompt(query)\n\n        result = <span class=\"hljs-keyword\">self<\/span>.bot.invoke({<span class=\"hljs-string\">\"question\"<\/span>: prompt, <span class=\"hljs-string\">\"chat_history\"<\/span>: <span class=\"hljs-keyword\">self<\/span>.chat_history})\n\n        <span class=\"hljs-keyword\">self<\/span>.chat_history.append((query, result&#91;<span class=\"hljs-string\">\"answer\"<\/span>]))\n\n        <span class=\"hljs-keyword\">return<\/span> result&#91;<span class=\"hljs-string\">\"answer\"<\/span>]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3-1024x576.png\" alt=\"\" class=\"wp-image-28987\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3-1024x576.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3-300x169.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3-768x432.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3-1536x864.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3-896x504.png 896w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3-400x225.png 400w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/07\/LLM-3.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Grafica che mostra il flusso Domanda-Retriever-Risposta-Salvataggio<\/figcaption><\/figure>\n\n\n\n<div style=\"height:37px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-orchestrazione-del-sistema-rag\">Orchestrazione del sistema RAG<\/h3>\n\n\n\n<p>Ora creeremo un orchestratore con LangChain per il nostro sistema RAG personalizzato, collegando i componenti fondamentali in un flusso operativo coeso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Inizializzazione del DocumentManager: questo componente carica e suddivide i documenti Markdown presenti nella directory specificata.<\/li>\n\n\n\n<li>Utilizzo dell\u2019EmbeddingManager: questo modulo prende i frammenti di testo generati e crea rappresentazioni vettoriali (embeddings) per ciascuno, memorizzandole in un database vettoriale.<\/li>\n\n\n\n<li>Attivazione del ConversationalRetrievalAgent: questo agente utilizza gli embeddings per alimentare una catena di recupero conversazionale, consentendo di rispondere a domande specifiche sfruttando il contesto fornito dai documenti.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from DocumentManager import DocumentManager\nfrom EmbeddingManager import EmbeddingManager\nfrom ConversationalRetrievalAgent import ConversationalRetrievalAgent\n\ndef main():\n    <span class=\"hljs-comment\"># Initialising and loading documents<\/span>\n    doc_manager = DocumentManager(<span class=\"hljs-string\">'.\/marckdown_folder'<\/span>)\n    doc_manager.load_documents()\n    doc_manager.split_documents()\n\n    <span class=\"hljs-comment\"># Creation and persistence of embeddings<\/span>\n    embed_manager = EmbeddingManager(doc_manager.all_sections)\n    embed_manager.create_and_persist_embeddings()\n\n    <span class=\"hljs-comment\"># Setup and use of conversation bots<\/span>\n    bot = ConversationalRetrievalAgent(embed_manager.vectordb)\n    bot.setup_bot()\n    <span class=\"hljs-keyword\">print<\/span>(bot.ask_question(<span class=\"hljs-string\">\"Question one\"<\/span>))\n    <span class=\"hljs-keyword\">print<\/span>(bot.ask_question(<span class=\"hljs-string\">\"Question two\"<\/span>))\n    <span class=\"hljs-keyword\">print<\/span>(bot.ask_question(<span class=\"hljs-string\">\"Question three\"<\/span>))\n\n<span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">\"__main__\"<\/span>:\n    main()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-rag-e-langchain-conclusioni\">RAG e LangChain: <strong>Conclusioni<\/strong><\/h2>\n\n\n\n<p>Costruire agenti <strong>LLM per RAG<\/strong> \u00e8 un processo che va dall&#8217;implementazione di semplici pipeline di recupero e generazione alla creazione di sofisticati agenti multi-funzione. Utilizzando tecniche <strong>RAG con LangChain<\/strong>, \u00e8 possibile migliorare notevolmente l&#8217;accuratezza e la pertinenza delle risposte generate. L&#8217;approccio modulare consente di espandere e ottimizzare continuamente il sistema, adattandolo a esigenze sempre nuove e complesse. Con <strong>LangChain<\/strong>, possiamo <strong>creare RAG personalizzati<\/strong> per migliorare l&#8217;esplorazione della documentazione, fornendo risposte accurate e basate su fonti verificabili.<\/p>\n\n\n\n<div style=\"height:66px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"background-color:#f2f2f2;color:#32373c\" class=\"wp-block-genesis-blocks-gb-profile-box round gb-has-avatar gb-font-size-18 gb-block-profile gb-profile-columns\"><div class=\"gb-profile-column gb-profile-avatar-wrap\"><div class=\"gb-profile-image-wrap\"><figure class=\"gb-profile-image-square\"><img loading=\"lazy\" decoding=\"async\" width=\"1080\" height=\"1080\" class=\"gb-profile-avatar wp-image-29113\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5.png\" alt=\"\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5.png 1080w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5-300x300.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5-1024x1024.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5-150x150.png 150w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5-768x768.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5-100x100.png 100w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/logo-con-payoff-5-600x600.png 600w\" sizes=\"auto, (max-width: 1080px) 100vw, 1080px\" \/><\/figure><\/div><\/div><div class=\"gb-profile-column gb-profile-content-wrap\"><h2 class=\"gb-profile-name\" style=\"color:#32373c\">Andrea Nuzzo &#8211; Software Developer @<a href=\"https:\/\/www.linkedin.com\/company\/seacom\">Seac<\/a><a href=\"https:\/\/www.linkedin.com\/company\/seacom\" target=\"_blank\" rel=\"noreferrer noopener\">om<\/a><\/h2><p class=\"gb-profile-title\" style=\"color:#32373c\"><\/p><div class=\"gb-profile-text\">Sono un software developer con una passione sconfinata per l&#8217;intelligenza artificiale. Opero all&#8217;interno della Business Unit AI di Seacom su progetti AI e soluzioni innovative di livello Enterprise. In Seacom mi piace creare e condividere contenuti legati al mondo del coding e in particolare sull\u2019intelligenza artificiale.<\/div><ul class=\"gb-social-links\"><\/ul><\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div class=\"wp-block-media-text has-media-on-the-right is-stacked-on-mobile\" style=\"grid-template-columns:auto 29%\"><div class=\"wp-block-media-text__content\">\n<p class=\"has-text-align-left has-larger-font-size\"><a href=\"https:\/\/seacom.it\/?aff=codemotion\" target=\"_blank\" rel=\"noreferrer noopener\">Seacom<\/a> &#8211; Societ\u00e0 Benefit appartenente al gruppo ITWay e co &#8211; fondatore di RIOS (Rete Italiana Open Source), \u00e8 un&#8217;azienda specializzata in consulenza e formazione su prodotti open source per aziende di livello Enterprise, enti e pubbliche amministrazioni.<\/p>\n\n\n\n<p class=\"has-text-align-left has-larger-font-size\"><strong>Scopri di pi\u00f9 su Seacom su<\/strong>: <a href=\"https:\/\/seacom.it\/?aff=codemotion\">https:\/\/seacom.it<\/a><\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"927\" height=\"900\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Seacom-logo-ok1-1.png\" alt=\"seacom logo\" class=\"wp-image-29117 size-full\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Seacom-logo-ok1-1.png 927w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Seacom-logo-ok1-1-300x291.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Seacom-logo-ok1-1-768x746.png 768w\" sizes=\"auto, (max-width: 927px) 100vw, 927px\" \/><\/figure><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>I modelli linguistici di grandi dimensioni (LLM), come GPT-3 e GPT-4, sono potenti strumenti di generazione del linguaggio naturale. Tuttavia, uno dei loro principali limiti \u00e8 l&#8217;incapacit\u00e0 di accedere a informazioni aggiornate e accurate, il che pu\u00f2 portare a risposte imprecise o &#8220;allucinate&#8221;. La Retrieval-Augmented Generation (RAG) rappresenta una soluzione a questo problema, combinando la&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/\">Read more<\/a><\/p>\n","protected":false},"author":271,"featured_media":29053,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10444],"tags":[10317,12472],"collections":[12402],"class_list":{"0":"post-28969","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-open-source","8":"tag-ai-it","9":"tag-langchain-it","10":"collections-codemotion-guides-it","11":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Tecnica RAG e LangChain per l&#039;esplorazione dei documenti<\/title>\n<meta name=\"description\" content=\"In questo articolo, Andrea Nuzzo - Software Developer di Seacom, spiega come creare agenti LLM per RAG e come costruire un RAG personalizzato con LangChain per esplorare i documenti.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Recupero ed esplorazione di documenti: dalla creazione di agenti LLM a un RAG personalizzato con LangChain\" \/>\n<meta property=\"og:description\" content=\"In questo articolo, Andrea Nuzzo - Software Developer di Seacom, spiega come creare agenti LLM per RAG e come costruire un RAG personalizzato con LangChain per esplorare i documenti.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-06T13:17:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-10T15:11:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2304\" \/>\n\t<meta property=\"og:image:height\" content=\"1536\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"RIOS - Seacom\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"RIOS - Seacom\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/\"},\"author\":{\"name\":\"RIOS - Seacom\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/9c994dbb9530c09c8c63180d87c1cac7\"},\"headline\":\"Recupero ed esplorazione di documenti: dalla creazione di agenti LLM a un RAG personalizzato con LangChain\",\"datePublished\":\"2024-08-06T13:17:01+00:00\",\"dateModified\":\"2024-09-10T15:11:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/\"},\"wordCount\":1541,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png\",\"keywords\":[\"AI\",\"LAngChain\"],\"articleSection\":[\"Open source\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/\",\"name\":\"Tecnica RAG e LangChain per l'esplorazione dei documenti\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png\",\"datePublished\":\"2024-08-06T13:17:01+00:00\",\"dateModified\":\"2024-09-10T15:11:59+00:00\",\"description\":\"In questo articolo, Andrea Nuzzo - Software Developer di Seacom, spiega come creare agenti LLM per RAG e come costruire un RAG personalizzato con LangChain per esplorare i documenti.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png\",\"width\":2304,\"height\":1536,\"caption\":\"tecnica RAG per il recupero e l\u2019esplorazione di documenti\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/rag-langchain\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Open source\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/open-source\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Recupero ed esplorazione di documenti: dalla creazione di agenti LLM a un RAG personalizzato con LangChain\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Codemotion.Italy\\\/\",\"https:\\\/\\\/x.com\\\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/9c994dbb9530c09c8c63180d87c1cac7\",\"name\":\"RIOS - Seacom\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Seacom-logo-ok1-1-100x100.png\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Seacom-logo-ok1-1-100x100.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Seacom-logo-ok1-1-100x100.png\",\"caption\":\"RIOS - Seacom\"},\"sameAs\":[\"https:\\\/\\\/seacom.it\\\/\"],\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/author\\\/rios-seacom\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Tecnica RAG e LangChain per l'esplorazione dei documenti","description":"In questo articolo, Andrea Nuzzo - Software Developer di Seacom, spiega come creare agenti LLM per RAG e come costruire un RAG personalizzato con LangChain per esplorare i documenti.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/","og_locale":"en_US","og_type":"article","og_title":"Recupero ed esplorazione di documenti: dalla creazione di agenti LLM a un RAG personalizzato con LangChain","og_description":"In questo articolo, Andrea Nuzzo - Software Developer di Seacom, spiega come creare agenti LLM per RAG e come costruire un RAG personalizzato con LangChain per esplorare i documenti.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-08-06T13:17:01+00:00","article_modified_time":"2024-09-10T15:11:59+00:00","og_image":[{"width":2304,"height":1536,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png","type":"image\/png"}],"author":"RIOS - Seacom","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"RIOS - Seacom","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/"},"author":{"name":"RIOS - Seacom","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/9c994dbb9530c09c8c63180d87c1cac7"},"headline":"Recupero ed esplorazione di documenti: dalla creazione di agenti LLM a un RAG personalizzato con LangChain","datePublished":"2024-08-06T13:17:01+00:00","dateModified":"2024-09-10T15:11:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/"},"wordCount":1541,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png","keywords":["AI","LAngChain"],"articleSection":["Open source"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/","name":"Tecnica RAG e LangChain per l'esplorazione dei documenti","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png","datePublished":"2024-08-06T13:17:01+00:00","dateModified":"2024-09-10T15:11:59+00:00","description":"In questo articolo, Andrea Nuzzo - Software Developer di Seacom, spiega come creare agenti LLM per RAG e come costruire un RAG personalizzato con LangChain per esplorare i documenti.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png","width":2304,"height":1536,"caption":"tecnica RAG per il recupero e l\u2019esplorazione di documenti"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/rag-langchain\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Open source","item":"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/"},{"@type":"ListItem","position":3,"name":"Recupero ed esplorazione di documenti: dalla creazione di agenti LLM a un RAG personalizzato con LangChain"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/9c994dbb9530c09c8c63180d87c1cac7","name":"RIOS - Seacom","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Seacom-logo-ok1-1-100x100.png","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Seacom-logo-ok1-1-100x100.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Seacom-logo-ok1-1-100x100.png","caption":"RIOS - Seacom"},"sameAs":["https:\/\/seacom.it\/"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/rios-seacom\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-600x400.png","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-600x600.png","author_info":{"display_name":"RIOS - Seacom","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/rios-seacom\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min.png",2304,1536,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-150x150.png",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-300x200.png",300,200,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-768x512.png",768,512,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-1024x683.png",1024,683,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-1536x1024.png",1536,1024,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-2048x1365.png",2048,1365,true],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-100x100.png",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-180x128.png",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-896x504.png",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-400x225.png",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-600x400.png",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Brianhk98_documents_entering_and_leaving_a_laptop_professional__2b3c76ad-266d-4bc7-83a1-57d92b2591db-min-600x600.png",600,600,true]},"uagb_author_info":{"display_name":"RIOS - Seacom","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/rios-seacom\/"},"uagb_comment_info":0,"uagb_excerpt":"I modelli linguistici di grandi dimensioni (LLM), come GPT-3 e GPT-4, sono potenti strumenti di generazione del linguaggio naturale. Tuttavia, uno dei loro principali limiti \u00e8 l&#8217;incapacit\u00e0 di accedere a informazioni aggiornate e accurate, il che pu\u00f2 portare a risposte imprecise o &#8220;allucinate&#8221;. La Retrieval-Augmented Generation (RAG) rappresenta una soluzione a questo problema, combinando la&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/271"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=28969"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28969\/revisions"}],"predecessor-version":[{"id":29621,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28969\/revisions\/29621"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/29053"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=28969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=28969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=28969"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=28969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}