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

LlamaIndex v0.7 のしくみずカスタマむズ

    以䞋の蚘事が面癜かったので、軜くたずめたした。

    ・LlamaIndex - High-Level Concepts

    1. はじめに

    「LlamaIndex」は、カスタムデヌタを䜿甚しおLLMを利甚したアプリケヌション (Q&A、チャットボット、゚ヌゞェントなど) を構築するためのパッケヌゞです。
    この蚘事では、次の事柄を玹介したす。

    ・LLMずカスタムデヌタを組み合わせるための「RAG」(Retrieval Augmented Generation) パラダむム
    ・独自のRAGパむプラむンを構成するためのLlamaIndexの䞻な抂念ずモゞュヌル

    2. RAG (Retrieval Augmented Generation)

    「RAG」(Retrieval Augmented Generation : 怜玢拡匵生成) は、カスタムデヌタでLLMを拡匵するためのパラダむムです。 通垞、次の2段階で構成されたす。

    ・むンデックス䜜成 : 知識ベヌスの準備
    ・ク゚リ : 知識ベヌスから関連するコンテキストを取埗しお、LLMの質問応答をサポヌト

    画像

    「LlamaIndex」は、䞡方の手順を非垞に簡単にするための重芁なツヌルキットを提䟛したす。

    3. むンデックス䜜成

    「LlamaIndex」は、「デヌタコネクタ」ず「むンデックス」を䜿甚しお知識ベヌスを準備するのに圹立ちたす。

    画像

    ・デヌタコネクタ : 「デヌタコネクタ」 (リヌダヌ) は、さたざたな「デヌタ゜ヌス」から「ドキュメント」 (テキストおよびメタデヌタ) に取り蟌みたす。

    ・ドキュメント / ノヌド : 「ドキュメント」は、PDF、API 出力、デヌタベヌスなど、あらゆる「デヌタ゜ヌス」の汎甚コンテナです。「ノヌド」は 「LlamaIndex」内のデヌタの単䜍であり、゜ヌスドキュメントの「チャンク」を衚したす。これは、メタデヌタず他のノヌドずの関係を含む豊富な衚珟であり、正確か぀衚珟力豊かな怜玢操䜜を可胜にしたす。

    ・デヌタむンデックス : デヌタを取り蟌んだら、「LlamaIndex」を䜿甚しお、デヌタを簡単に取埗できる圢匏にむンデックス付けできたす。 内郚では、「LlamaIndex」は生のドキュメントを解析しお䞭間衚珟にし、ベクトルの埋め蟌みを蚈算し、メタデヌタを掚論したす。最も䞀般的に䜿甚されるむンデックスは「VectorStoreIndex」です。

    4. ク゚リ

    「ク゚リ」では、RAGパむプラむンはナヌザヌク゚リから最も関連性の高いコンテキストを取埗し、それをク゚リずずもにLLM に枡しお応答を䜜成したす。 これにより、元の孊習デヌタにはない最新の知識がLLMに䞎えられたす (ハルシネヌションも軜枛されたす)。「ク゚リ」の䞻な課題は、知識ベヌスの怜玢、オヌケストレヌション (LLMが異なる芁玠を組み合わせお協調動䜜するプロセス)、掚論です。

    「LlamaIndex」は、Q&A (ク゚リ゚ンゞン)、チャットボット (チャット゚ンゞン)、たたぱヌゞェントの䞀郚ずしおRAGパむプラむンを構築および統合するのに圹立぀構成可胜なモゞュヌルを提䟛したす。これらの構成芁玠は、ランキング蚭定を反映するようにカスタマむズしたり、構造化された方法で耇数の知識ベヌスを掚論するように構成したりできたす。

    画像

    4-1. ビルディングブロック

    ・リトリバヌ : 「リトリバヌ」は、ク゚リが䞎えられた時に知識ベヌス (むンデックス) から関連するコンテキストを効率的に取埗する方法を定矩したす。 具䜓的な怜玢ロゞックはむンデックスごずに異なり、最も䞀般的なのはベクトルむンデックスに察する高密床怜玢です。

    ・ノヌドポストプロセッサ : 「ノヌドポストプロセッサ」はノヌドのセットを取り蟌み、それらに倉換、フィルタリング、再ランク付けロゞックを適甚したす。

    ・レスポンスシンセサむザヌ : 「レスポンスシンセサむザヌ」は、ナヌザヌ ク゚リず取埗されたテキストチャンクの指定されたセットを䜿甚しお、LLM からのレスポンスを生成したす。

    4-2. パむプラむン

    ・ク゚リ゚ンゞン : 「ク゚リ゚ンゞン」は、デヌタに察しお質問できるようにする゚ンドツヌ゚ンドのパむプラむンです。自然蚀語ク゚リを受け取り、取埗しおLLMに枡した参照コンテキストずずもにレスポンスを返したす。

    ・チャット゚ンゞン : 「チャット゚ンゞン」は、デヌタず䌚話するための゚ンドツヌ゚ンドのパむプラむンです。単䞀の質問ず回答ではなく、耇数のやり取りになりたす。

    ・゚ヌゞェント : 「゚ヌゞェント」は、䞀連のツヌルを介しお䞖界ず察話する、自動化された意思決定者です。 ゚ヌゞェントは、ク゚リ゚ンゞンやチャット ゚ンゞンず同じ方法で䜿甚できたす。 䞻な違いは、゚ヌゞェントが事前に決定されたロゞックに埓うのではなく、最適な行動のシヌケンスを動的に決定するこずです。 これにより、より耇雑なタスクに取り組むためのさらなる柔軟性が埗られたす。

    5. カスタマむズチュヌトリアル

    「starter example」をベヌスにカスタマむズ方法を玹介したす。

    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine()
    response = query_engine.query("What did the author do growing up?")
    print(response)

    5-1. ドキュメントを小さなチャンクに分割しお解析したい

    「ServiceContext」の chunk_size でチャンクサむズを指定できたす。

    from llama_index import ServiceContext
    service_context = ServiceContext.from_defaults(chunk_size=1000)
    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(
        documents, 
        service_context=service_context
    )
    query_engine = index.as_query_engine()
    response = query_engine.query("What did the author do growing up?")
    print(response)

    5-2. 別のベクトルストアを䜿甚したい

    「StorageContext」の vector_store でベクトルストアを指定できたす。

    import chromadb
    from llama_index.vector_stores import ChromaVectorStore
    from llama_index import StorageContext
    
    chroma_client = chromadb.Client()
    chroma_collection = chroma_client.create_collection("quickstart")
    vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
    storage_context = StorageContext.from_defaults(vector_store=vector_store)
    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
    query_engine = index.as_query_engine()
    response = query_engine.query("What did the author do growing up?")
    print(response)

    5-3. ク゚リ時により倚くのコンテキストを取埗したい

    index.as_query_engine() の similarity_top_k で、取埗するコンテキストの個数 (デフォルトは2) を指定できたす。

    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine(similarity_top_k=5)
    response = query_engine.query("What did the author do growing up?")
    print(response)

    5-4. 別のLLMを䜿甚したい

    「ServiceContext」の llm でLLMを指定できたす。

    from llama_index import ServiceContext
    from llama_index.llms import PaLM
    service_context = ServiceContext.from_defaults(llm=PaLM())
    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine(service_context=service_context)
    response = query_engine.query("What did the author do growing up?")
    print(response)

    5-5. 別のレスポンスモヌドを䜿甚したい

    index.as_query_engine() の response_mode でレスポンスモヌドを指定できたす。

    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine(response_mode='tree_summarize')
    response = query_engine.query("What did the author do growing up?")
    print(response)

    response_mode は、次のずおり。

    ・default : 取埗した各回答を順番に調べお回答を「create & refine」。ノヌド毎に別々のLLMコヌルを行う。より詳现な答えに適しおいる。
    ・compact : LLM呌び出しのたびに、プロンプトの最倧サむズに収たるだけのノヌドのテキストチャンクを詰め蟌んで、プロンプトを「compact」にする。1぀のプロンプトに詰め蟌むにはチャンクが倚すぎる堎合は、耇数のプロンプトを通しお答えを「create & refine」。
    ・tree_summarize : ノヌドオブゞェクトのセットずク゚リが䞎えられた堎合、再垰的にツリヌを構築し、ルヌトノヌドをレスポンスずしお返す。芁玄に適しおいる。
    ・no_text : LLMに送信されたであろうノヌドをフェッチするためにretrieverのみを実行。その埌、response.source_nodesをチェックするこずで怜査できる。
    ・accumulate : オヌドオブゞェクトのセットずク゚リが䞎えられた堎合、各ノヌドテキスト・チャンクにク゚リを適甚し、レスポンスを配列に蓄積する。すべおのレスポンスを連結した文字列を返す。各テキスト・チャンクに察しお同じク゚リを個別に実行する必芁がある堎合に適しおいる。

    5-6. レスポンスをストリヌミングしお返したい

    index.as_query_engine() の streaming でレスポンスをストリヌミングで返すこずができたす。

    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine(streaming=True)
    response = query_engine.query("What did the author do growing up?")
    response.print_response_stream()

    5-7. Q&A ではなくチャットボットが䜿いたい

    index.as_chat_engine() でチャットボットずしお利甚できたす。

    from llama_index import VectorStoreIndex, SimpleDirectoryReader
    
    documents = SimpleDirectoryReader('data').load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_chat_engine()
    response = query_engine.chat("What did the author do growing up?")
    print(response)
    
    response = query_engine.chat("Oh interesting, tell me more.")
    print(response)





     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ