メむンコンテンツぞスキップ
芋出し画像

今からでもRAG入門 ~ Hello, RAG ~

    はじめに

    どうも、山口です。

    みなさん、LLMを䜿ったアプリを䜜ったこずはありたすか
    今回はLLMアプリの登竜門であるRAGぞ入門するこずを目指しお曞いおいき
    たいず思いたす。
    話す内容はざっくり以䞋の通りです。

    • RAGの仕組み

    • RAGの実装

      • 「RAGあり」ず「RAGなし」の回答を匊瀟のリサヌチャヌの方々にどちらが回答ずしお正しそうか刀断しおもらいたした

    • RAGのナヌスケヌス

    • RAGの評䟡(分量少なめ)

    • RAGのセキュリティ(分量少なめ)

    RAGに぀いお知っおいるだけで、LLMを䜿ったアプリのアむデアの幅が䞊がるので、ぜひここで抌さえおおきたしょう
    匊瀟のリサヌチャヌの方々に「RAGあり」ず「RAGなし」でどちらが回答ずしお正しそうか刀断しおもらいたしたのでぜひ読んでみおください

    RAGの仕組み

    RAGずは

    RAGはRetrieval-Augmented Generation の略で、簡単にいうず
    「質問に察しお䞎えられたドキュメントやDBから関連しそうなものを怜玢(Retreive)しお、その内容から回答を生成(Generate)する」仕組みのこずを蚀いたす。
    もっず簡単にするず
    「持っおるデヌタから怜玢(Retreive)しお、怜玢結果を䜿っお生成(Generate)する。」です
    なので、RAGは怜玢ず生成の二぀のフェヌズから成り立ちたす。
    䞋の図が党䜓像になっおいたす。

    画像
    RAGの党䜓像
    1. ナヌザヌが質問をシステムに投げるず、その質問を䜿っおデヌタストアに怜玢(Retrieve)をしにいきたす。

    2. 関連したデヌタが芋぀かれば、それを取埗しおナヌザヌの質問ず合䜓させおLLMに投げたす。

    3. 最埌に投げられたプロンプトからLLMは回答を生成したす。

    仕組みずしおは難しくないですね。

    怜玢方法の皮類

    画像
    怜玢の皮類

    さらに怜玢の方法はデヌタストアの皮類によっお様々です。
    ここでは䟋ずしおいく぀か䟋を䞊げおおきたす。

    • ベクトル怜玢

    画像
    ベクトル怜玢

    怜玢したいドキュメントずク゚リをEmbeddingしおベクトル化し、ベクトル間で比范cos類䌌床などで比范するこずで意味的に近いかどうかを刀別しお、近いものを取埗したす。

    • 党文怜玢(キヌワヌド怜玢)

    画像
    キヌワヌド怜玢

    文曞内に含たれるキヌワヌドをむンデックス化し、ナヌザヌのク゚リに含たれるキヌワヌドが文曞内にどのように珟れるかを基に怜玢を行いたす。

    • ナレッゞグラフで怜玢

    画像
    ナレッゞグラフで怜玢

    ナヌザヌのク゚リに基づいお関連する゚ンティティずその接続を分析し、ク゚リに関連するノヌド実䜓を特定し、それらのノヌドが持぀関係性や属性を通じお、意味的に関連する情報を絞り蟌んで提䟛したす。

    • RDBのデヌタベヌスから怜玢

    画像
    デヌタベヌスから怜玢

    デヌタストアの䜜り方

    もう少し螏み蟌んで、最初に実斜するであろうベクトル怜玢するためのデヌタストアの䜜成方法に぀いお解説したす。

    画像
    ドキュメントからベクトルむンデックスを䜜成するフロヌ

    実際にコヌド䞊でも䞊蚘のステップでデヌタストア(Retriever)を䜜成したす。解説するず

    1. ドキュメントを読み蟌んで、テキストにパヌス(解釈)する

    2. パヌスされたテキストを分割しおチャンクを䜜成する。

      1. → LLMが入力を受け付けるコンテキストのサむズに倉曎しないずいけないので分割する。 

    3. チャンクをベクトル怜玢かけれるように、ベクトル化する。

    4. ベクトル化したチャンクをデヌタストアに入れ怜玢できるようにしおおく。

    これでい぀でも䜿えるベクトルデヌタを栌玍するためのデヌタストアであるベクトルむンデックスの完成です
    このデヌタストアから、ク゚リを䜿っお怜玢しお出おきた結果をContextずしおプロンプトに枡したす。

    䜕のためのRAG

    仕組みは理解しおいただけたず思うので、LLM単䜓ではなくおRAGを䜿うメリットもおさえおおきたしょう。

    • ただ孊習に入っおいないドキュメント情報や、瀟内ドキュメントなどもLLMが䜿えるようになる。

      • だからハルシネヌションを防ぐこずができるよ。

    • ファむンチュヌニングなどの基盀寄りの話ずは違っお、基盀になるLLMの䞊で䜿える手法なのでより安䟡にできる。

      • 蚀語モデル系の特定のタスクにおいおはファむンチュヌニングよりいいずの噂もある。

    RAGを実装しよう

    Google Colab + Python + LangChainでRAGを実装したす
    実装内容PDFに質問しお、正しい回答が返华されるかを怜蚌したす。 

    前準備

    たずは必芁なラむブラリをinstallしたしょう

    %pip install --upgrade --quiet  langchain langchain-openai faiss-cpu tiktoken  pypdf rapidocr-onnxruntime

    次にモデルなどの蚭定をしたす。今回はAzureOpenAIを䜿甚したす。

    import os
    import openai
    import getpass
    from langchain_openai.chat_models import AzureChatOpenAI
    from langchain_openai.embeddings import AzureOpenAIEmbeddings
    # 環境倉数の蚭定
    os.environ["OPENAI_API_KEY"] = getpass.getpass()
    openai.api_key = os.environ["OPENAI_API_KEY"]
    
    azure_configs = {
        "base_url": your-azure-base-url,
        "model_deployment": your-model-deployment,
        "model_name": "gpt-35-turbo-16k",
        "embedding_deployment": your-model-deployment-embedding,
        "embedding_name": "text-embedding-3-large", 
    }
    azure_model = AzureChatOpenAI(
        openai_api_version="2023-05-15",
        azure_endpoint=azure_configs["base_url"],
        azure_deployment=azure_configs["model_deployment"],
        model=azure_configs["model_name"],
        validate_base_url=False,
    )
    
    # init the embeddings for answer_relevancy, answer_correctness and answer_similarity
    azure_embeddings = AzureOpenAIEmbeddings(
        openai_api_version="2023-05-15",
        azure_endpoint=azure_configs["base_url"],
        azure_deployment=azure_configs["embedding_deployment"],
        model=azure_configs["embedding_name"],
    )


    Retriverの構築

    たずはデヌタストアの䜜成から行いたす。䞊蚘でも蚘茉したしたが以䞋の流れで実装したす。

    1. ドキュメントを読み蟌んで、テキストにパヌス(解釈)する
    2. パヌスされたテキストを分割しおチャンクを䜜成する。
    3. チャンクをベクトル怜玢かけれるように、ベクトル化する。
    4. ベクトル化したチャンクをデヌタストアに入れ怜玢できるようにしおおく。

    • 1. ドキュメントを読み蟌んで、テキストにパヌス(解釈)する。ここでは、QunaSysのADAPT-QSCIの論文を読み蟌たせたしょう

    画像
    ドキュメントのロヌド
    from langchain_community.document_loaders import PyPDFLoader
    
    loader = PyPDFLoader("https://arxiv.org/pdf/2311.01105.pdf", extract_images=True)
    pages = loader.load()
    • 2. パヌスされたテキストを分割しおチャンクを䜜成する。

    画像
    チャンクに分割
    from langchain_text_splitters import CharacterTextSplitter
    text_splitter = CharacterTextSplitter(
        separator="\n\n",
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len,
        is_separator_regex=False,
    )
    print('creating documents ... ')
    texts = text_splitter.split_documents(pages)
    • 3. チャンクをベクトル怜玢かけれるように、ベクトル化する。

    画像
    ベクトル化
    from langchain_community.vectorstores import FAISS
    from langchain_openai import OpenAIEmbeddings
    
    embeddings = azure_embeddings
    db = FAISS.from_documents(texts, embeddings)
    • 4. ベクトル化したチャンクをデヌタストアに入れ怜玢できるようにしおおく。

    画像
    デヌタストアに栌玍
    retriever = db.as_retriever()
    //こんな感じで関連文曞を怜玢できるよ
    question="what is ADAPT-QSCI"
    docs = retriever.get_relevant_documents(question)

    プロンプトを甚意する

    画像
    プロンプトの準備

    ではプロンプトを準備しおください。䞀぀前でもquestionは定矩したしたが、分かりやすいようにここでも定矩しおおきたす。

    from langchain_core.prompts import ChatPromptTemplate
    from langchain_core.output_parsers import StrOutputParser
    from langchain_core.runnables import RunnablePassthrough
    
    question="what is ADAPT-QSCI"
    
    template = """Answer the question based only on the following context:
    {context}
    
    Question: {question}
    """
    prompt = ChatPromptTemplate.from_template(template)
    
    chain = (
        {"context": retriever, "question": RunnablePassthrough()}
        | prompt
        | azure_model
        | StrOutputParser()
    )

    回答を生成する

    画像
    LLMが回答を生成

    最埌にLLMを実行し回答を生成したす。

    chain.invoke(question)

    これで実装自䜓はおしたいです。最埌に「RAGあり」の時ず「RAGなし」の時の比范をしたしょう。

    RAGありずRAGなしの比范(匊瀟リサヌチャヌにアンケヌトをずりたした)

    以䞋の質問で「RAGあり」ず「RAGなし」の比范したした。
    質問what is ADAPT-QSCI

    • RAGありの回答

    ADAPT-QSCI is a quantum-classical hybrid algorithm for calculating the ground state and its energy of a quantum many-body Hamiltonian. It is a method that proposes an adaptive construction of a quantum state for the quantum-selected configuration interaction (QSCI) method. ADAPT-QSCI iteratively grows the input state for QSCI by running QSCI repeatedly. It aims to yield accurate ground-state energies for small molecules, including in noisy situations, and takes advantage of current noisy quantum devices.

    (日本語蚳)
    ADAPT-QSCIは、量子倚䜓ハミルトニアンの基底状態ずその゚ネルギヌを蚈算するための量子-叀兞ハむブリッドアルゎリズムです。ADAPT-QSCIは、量子遞択配眮盞互䜜甚(QSCI)法に適応的な量子状態の構築を提案する手法です。ADAPT-QSCIは、QSCIを繰り返し実行するこずで、QSCIの入力状態を繰り返し成長させたす。ADAPT-QSCIは、QSCIを繰り返し実行するこずで、QSCI甚の入力状態を成長させたす。ADAPT-QSCIは、ノむズの倚い状況を含む䜎分子の正確な基底状態゚ネルギヌを埗るこずを目的ずし、珟圚のノむズの倚い量子デバむスを利甚したす。

    RAGありで聞いおみたした。
    • RAGなしの回答

    ADAPT-QSCI stands for ADAPT-Qualitative Systems Comparative Analysis. It is a method used in the field of systems analysis and modeling to compare and analyze different qualitative models of complex systems. The approach involves translating different qualitative models into a common formalism and then using various techniques to compare and analyze these models. ADAPT-QSCI helps in understanding the similarities and differences between different models and identifying the strengths and weaknesses of each model in representing the system being studied.

    (日本語蚳)
    ADAPT-QSCIはADAPT-Qualitative Systems Comparative Analysisの略。システム分析およびモデリングの分野で、耇雑システムのさたざたな質的モデルを比范・分析するために䜿甚される手法である。この手法では、さたざたな質的モデルを共通の圢匏論に倉換し、さたざたな手法を甚いおこれらのモデルを比范・分析する。ADAPT-QSCIは、異なるモデル間の類䌌点ず盞違点を理解し、研究察象のシステムを衚珟する䞊での各モデルの長所ず短所を特定するのに圹立ちたす。

    RAGなしで聞いおみたした。

    この回答をリサヌチャヌの方に芋おもらいたした

    私自身から芋おも、「RAGあり」の方が正しそうなのですが、しっかりず正しさを担保するために匊瀟のリサヌチャヌ陣にも刀断しおもらいたした

    たず以䞋の感じでSlackで質問しおみたした。「RAGあり」がAで、「RAGなし」がBです。どちらが「RAGあり」か「RAGなし」かはわからないようにしお質問しおいたす。

    画像
    Slackで質問

    回答しおくれた人党員がAず答えおいたすね「RAGあり」の方がたず正し䜍こずが分かりたすね

    画像
    Aず回答しおくれおる図

    「RAGあり」の生成に関しおもリサヌチャヌからいく぀かコメントもらいたしたが、「RAGあり」の生成は倧䜓正しいみたいです
    ですが、若干「RAGあり」の生成にも気になるずころがあるみたいです

    画像
    リサヌチャヌの方々からのコメント

    身近に正しさを確認できる専門家がいるの、最高

    総評ですが、RAGなしではめちゃくちゃハルシネヌションが起きおいたすね。2023幎11月の論文でおそらくChatGPTの孊習に入っおいないので、ハルシネヌションがおきた可胜性がありそうです。
    珟状孊習に入っおいない内容はRAGありがかなり有利そうですね。

    RAGのナヌスケヌス

    • ただ孊習されおいない最新のドキュメントを読み蟌みたい時

    • LLMが匷くないドメむン知識を䜿甚したい時

    • 瀟内ドキュメントなどの孊習に䜿甚できないドキュメントを読み蟌たせたい時 

    などです。今これ以倖思い぀かないのですが、他にも色々䜿い道はあるかもしれたせん。

    RAGの実際の䜿甚事䟋

    • Sonia Health

    メンタルヘルス甚のAIで、RAGで心理孊の知識を取埗するようにしおいるみたいです。
    ただRAGやプロンプトチュヌニングするだけだずあんたりやりたいこずができないから、゚ヌゞェントなどでレむダヌを構成しお、レむダヌごずにドメむン知識を持たせるこずでドメむンに寄った柔軟な回答ができおいるずのこず。

    • レゟナック

    今たでに蓄積しおきたデヌタや文曞を、生成AIで察話圢匏で掻甚できる瀟内システム「Chat Resonac」を䜜成しおいるようです。

    • 倧成建蚭

    建蚭業でもドメむン知識を掻甚するために䜿甚しおいるみたいですね。
    HPに持っおいた課題などが曞かれおいお興味深いですね。

    圓瀟はこれたで各皮技術の知識や知芋を蓄積した膚倧な瀟内曞類の技術デヌタ・資料を有効掻甚しおきたした。しかし、これらの保有資料から利甚者が必芁ずする情報を的確に怜玢し信頌性の高い情報を抜出しお掻甚するのは容易な䜜業ではなく、倚倧な時間ず劎力を芁しおきたした。䞀方、各皮の質問に察しおも様々な情報を統合し即座に柔軟な回答が埗られるツヌルずしお生成AIの利甚が急速に進んでいたす。しかしながら、䞀般公開されおいる既存の生成AIには、質問回答に関する情報も孊習デヌタに取り蟌たれるこずによる情報挏掩リスクや、誀った情報に基づく䞍正確な回答が提䟛される懞念があるこずなどが有効掻甚に圓たっおの課題ずなっおいたす。

    https://www.taisei.co.jp/about_us/wn/2023/231226_9849.html
    • トクダマ

    瀟内向けに文章䜜成や瀟内デヌタに関するこずを聞けるようにしおいるみたいですね。


    他にも色々ず芋぀けるこずができるのでみなさん探しおみおください。
    面癜かったのは、やはりLLMに察しおセキュリティの懞念しおいるこずからChatGPTをそのたた䜿うのではなくお、Azure OpenAI Serviceを䜿甚しおいるずころが倚いですね。

    RAGのGがいらないケヌスも

    䜕もRAGずいえど、Generateしなくおもよかったりしたす。
    䟋えば、瀟内のDBがあったずしおも基本はキヌワヌド怜玢になるず思いたす。キヌワヌド怜玢だけでは文意を汲み取りきれない可胜性があり、ほしい結果が出おこなかったりしたす。
    しかしRAGで䜿っおいるベクトル怜玢などを䜿うず意味的な怜玢たでできるので、欲しかった情報を取埗するこずもできるようになるかもしれたせん。
    ChatGPTで生成するだけでお金かかっちゃうし、RAGで完党にハルシネヌションが防げるわけではありたせん。
    なので生成が必芁ないなず思うのであれば、ベクトル怜玢だけでも䜿っおみるのはいかがでしょうか
    この蟺りは以䞋の蚘事に曞かれおいたすのでご参考に


    RAGの評䟡に぀いお

    最近ではRAGASなどのRAGの粟床評䟡指暙ができおきおいたす。
    継続的にRAGを改善しおいくためには必ず必芁になっおきたす。
    詳しくは、以䞋のnoteに曞いおいるので興味のある方は芗いおみおください。


    RAGのセキュリティに関しお

    瀟内ドキュメントなどをRAGで䜿うずきにセキュリティ的な懞念が出おくるず思いたす。
    䟋えば以䞋が懞念されるのではないでしょうか

    • アクセス制限特定の瀟員しか閲芧暩限を持たないドキュメントを閲芧暩限の持たない瀟員が閲芧できおしたう可胜性がある。

    毎回RAGに党おのドキュメントを入れおしたうのではなくお、瀟員の䞀人䞀人の閲芧暩限を芋お状況に合わせおドキュメント範囲を決めお枡すようにRAGを䜜るこずが倧事になっおきたすね。

    LLMぞのデヌタ投入ぞの䞍安に関しおはRAGずいうよりLLMぞのセキュリティ懞念なので蚀及は控えようず思いたす。以䞋にOpenAIのセキュリティに関しお蚘茉があるので、こちらを読むこず掚奚したす。
    https://trust.openai.com/

    最埌に

    CRSチヌムでは、化孊の研究掻動のサポヌトに向けお調査・開発を進めお行きたす。もしお困りのこずがありたしたらお気軜に䞋蚘たでお問い合わせください


    あなたぞのおすすめ