Artículo
· 16 ago, 2024 Lectura de 5 min

IRIS-RAG-Gen: Personalización de la aplicación ChatGPT RAG mediante la búsqueda vectorial IRIS

image

Hola Comunidad,

En este artículo, voy a presentar mi aplicación iris-RAG-Gen .

Iris-RAG-Gen es una aplicación generativa AI Retrieval-Augmented Generation (RAG) que aprovecha la funcionalidad de IRIS Vector Search para personalizar ChatGPT con la ayuda del framework web Streamlit, LangChain, y OpenAI. La aplicación utiliza IRIS como almacén de vectores.

image

Características de la aplicación

  • Ingesta de documentos (PDF o TXT) en IRIS
  • Chatear con el documento ingerido seleccionado
  • Borrar Documentos ingerido
  • OpenAI ChatGPT

Ingesta de documentos (PDF o TXT) en IRI

Seguid los siguientes pasos para ingerir el documento:

  • Introducid a clave OpenAI
  • Seleccionad el documento (PDF o TXT)
  • Introducid la descripción del documento
  • Haced clic en el botón Ingerir documento

image
 

La funcionalidad Ingest Document inserta los detalles del documento en la tabla rag_documents y crea la tabla 'rag_document + id' (id del rag_documents) para guardar los datos vectoriales.

El siguiente código Python guardará el documento seleccionado en vectores:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain_iris import IRISVector
from langchain_openai import OpenAIEmbeddings
from sqlalchemy import create_engine,text

class RagOpr:
    #Ingest document. Parametres contains file path, description and file type  
    def ingestDoc(self,filePath,fileDesc,fileType):
        embeddings = OpenAIEmbeddings()	
        #Load the document based on the file type
        if fileType == "text/plain":
            loader = TextLoader(filePath)       
        elif fileType == "application/pdf":
            loader = PyPDFLoader(filePath)       
        
        #load data into documents
        documents = loader.load()        
        
        text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=0)
        #Split text into chunks
        texts = text_splitter.split_documents(documents)
        
        #Get collection Name from rag_doucments table. 
        COLLECTION_NAME = self.get_collection_name(fileDesc,fileType)
               
        # function to create collection_name table and store vector data in it.
        db = IRISVector.from_documents(
            embedding=embeddings,
            documents=texts,
            collection_name = COLLECTION_NAME,
            connection_string=self.CONNECTION_STRING,
        )

    #Get collection name
    def get_collection_name(self,fileDesc,fileType):
        # check if rag_documents table exists, if not then create it 
        with self.engine.connect() as conn:
            with conn.begin():     
                sql = text("""
                    SELECT *
                    FROM INFORMATION_SCHEMA.TABLES
                    WHERE TABLE_SCHEMA = 'SQLUser'
                    AND TABLE_NAME = 'rag_documents';
                    """)
                result = []
                try:
                    result = conn.execute(sql).fetchall()
                except Exception as err:
                    print("An exception occurred:", err)               
                    return ''
                #if table is not created, then create rag_documents table first
                if len(result) == 0:
                    sql = text("""
                        CREATE TABLE rag_documents (
                        description VARCHAR(255),
                        docType VARCHAR(50) )
                        """)
                    try:    
                        result = conn.execute(sql) 
                    except Exception as err:
                        print("An exception occurred:", err)                
                        return ''
        #Insert description value 
        with self.engine.connect() as conn:
            with conn.begin():     
                sql = text("""
                    INSERT INTO rag_documents 
                    (description,docType) 
                    VALUES (:desc,:ftype)
                    """)
                try:    
                    result = conn.execute(sql, {'desc':fileDesc,'ftype':fileType})
                except Exception as err:
                    print("An exception occurred:", err)                
                    return ''
                #select ID of last inserted record
                sql = text("""
                    SELECT LAST_IDENTITY()
                """)
                try:
                    result = conn.execute(sql).fetchall()
                except Exception as err:
                    print("An exception occurred:", err)
                    return ''
        return "rag_document"+str(result[0][0])

 

Escribid el siguiente comando SQL en el portal de gestión para recuperar los datos vectoriales

SELECT top 5
id, embedding, document, metadata
FROM SQLUser.rag_document2

image

 

Chatear con el documento ingerido seleccionado

Seleccionad el Documento en la sección de opciones de chat y escribid la pregunta. La aplicación leerá los datos del vector y devolverá la respuesta correspondiente.
image

El siguiente código Python guardará el documento seleccionado en vectores:

from langchain_iris import IRISVector
from langchain_openai import OpenAIEmbeddings,ChatOpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationSummaryMemory
from langchain.chat_models import ChatOpenAI


class RagOpr:
    def ragSearch(self,prompt,id):
        #Concat document id with rag_doucment to get the collection name
        COLLECTION_NAME = "rag_document"+str(id)
        embeddings = OpenAIEmbeddings()	
        #Get vector store reference
        db2 = IRISVector (
            embedding_function=embeddings,    
            collection_name=COLLECTION_NAME,
            connection_string=self.CONNECTION_STRING,
        )
        #Similarity search
        docs_with_score = db2.similarity_search_with_score(prompt)
        #Prepair the retrieved documents to pass to LLM
        relevant_docs = ["".join(str(doc.page_content)) + " " for doc, _ in docs_with_score]
        #init LLM
        llm = ChatOpenAI(
            temperature=0,    
            model_name="gpt-3.5-turbo"
        )
        #manage and handle LangChain multi-turn conversations
        conversation_sum = ConversationChain(
            llm=llm,
            memory= ConversationSummaryMemory(llm=llm),
            verbose=False
        )
        #Create prompt
        template = f"""
        Prompt: {prompt}
        Relevant Docuemnts: {relevant_docs}
        """
        #Return the answer
        resp = conversation_sum(template)
        return resp['response']

    

Para más detalles, visitad la página de solicitud de intercambio abierto iris-RAG-Gen.

Gracias

Comentarios (0)1
Inicie sesión o regístrese para continuar