ホームページ >バックエンド開発 >Python チュートリアル >IRIS-RAG-Gen: IRIS Vector Search を利用した ChatGPT RAG アプリケーションのパーソナライズ

IRIS-RAG-Gen: IRIS Vector Search を利用した ChatGPT RAG アプリケーションのパーソナライズ

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-03 16:56:39270ブラウズ

IRIS-RAG-Gen: Personalizing ChatGPT RAG Application Powered by IRIS Vector Search

コミュニティの皆様、

この記事では、私のアプリケーション iris-RAG-Gen を紹介します。

Iris-RAG-Gen は、IRIS Vector Search の機能を利用して、Streamlit Web フレームワーク、LangChain、OpenAI を利用して ChatGPT をパーソナライズする生成 AI 検索拡張生成 (RAG) アプリケーションです。アプリケーションは IRIS をベクター ストアとして使用します。
IRIS-RAG-Gen: Personalizing ChatGPT RAG Application Powered by IRIS Vector Search

アプリケーションの機能

  • ドキュメント (PDF または TXT) を IRIS に取り込む
  • 選択した取り込まれたドキュメントとチャットします
  • 取り込んだドキュメントを削除
  • OpenAI ChatGPT

ドキュメント (PDF または TXT) を IRIS に取り込む

以下の手順に従ってドキュメントを取り込みます:

  • OpenAI キーを入力してください
  • ドキュメント (PDF または TXT) を選択
  • ドキュメントの説明を入力
  • 「ドキュメントの取り込み」ボタンをクリックします

IRIS-RAG-Gen: Personalizing ChatGPT RAG Application Powered by IRIS Vector Search

ドキュメントの取り込み機能は、ドキュメントの詳細を rag_documents テーブルに挿入し、「rag_document id」(rag_documents の ID)テーブルを作成してベクター データを保存します。

IRIS-RAG-Gen: Personalizing ChatGPT RAG Application Powered by IRIS Vector Search

以下の Python コードは、選択したドキュメントをベクターに保存します。

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

<span>class RagOpr:</span>
    #Ingest document. Parametres contains file path, description and file type  
    <span>def ingestDoc(self,filePath,fileDesc,fileType):</span>
        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
    <span>def get_collection_name(self,fileDesc,fileType):</span>
        # 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])

管理ポータルで以下の SQL コマンドを入力してベクター データを取得します

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

IRIS-RAG-Gen: Personalizing ChatGPT RAG Application Powered by IRIS Vector Search

選択した取り込まれたドキュメントとチャットします

チャット オプションの選択セクションからドキュメントを選択し、質問を入力します。 アプリケーションはベクター データを読み取り、関連する回答を返します
IRIS-RAG-Gen: Personalizing ChatGPT RAG Application Powered by IRIS Vector Search

以下の Python コードは、選択したドキュメントをベクターに保存します:

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


<span>class RagOpr:</span>
    <span>def ragSearch(self,prompt,id):</span>
        #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: <span>{prompt}
        Relevant Docuemnts: {relevant_docs}
        """</span>
        #Return the answer
        resp = conversation_sum(template)
        return resp['response']

    


詳細については、iris-RAG-Gen 交換申請ページをご覧ください。

ありがとう

以上がIRIS-RAG-Gen: IRIS Vector Search を利用した ChatGPT RAG アプリケーションのパーソナライズの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。