メインコンテンツへスキップ
見出し画像

LLM連携アプリの開発を支援するライブラリ LangChain の使い方 (2) - データ拡張生成

    「LangChain」の「データ拡張生成」の使い方をまとめました。

    前回

    1. データ拡張生成

    「データ生成拡張」は、特定のデータに基づいて言語モデルでテキスト生成する手法です。

    言語モデルは、大量の非構造化データで学習しているため、汎用のテキスト生成に最適ですが、特定のデータに基づいてテキスト生成したい場合も多くあります。

    データ生成拡張が必要になる場合は、次のとおりです。

    ・特定のテキストの要約 (Webサイト、プライベートな文書など)
    ・特定のテキストに対する質問応答 (Webサイト、プライベートな文書など)
    ・複数のテキストに対する質問応答 (複数のWebサイト・プライベートな文書など)
    ・APIの外部呼び出しの結果の使用 (SQLクエリ結果など)

    2. インストール

    Google Colabでのインストール手順は、次のとおりです。

    (1) パッケージのインストール。
    データ拡張生成のために「faiss」もインストールします。

    # パッケージのインストール
    !pip install langchain
    !pip install openai
    !pip install faiss-gpu

    (2) 環境変数の準備。
    以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)

    # 環境変数の準備
    import os
    os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"

    3. Colabでの実行

    Google Colabで「データ拡張生成」の実行手順は、次のとおりです。

    (1) メニュー「編集→ノートブックの設定」の「ハードウェアアクセラレータ」で「GPU」を選択。

    (2) パッケージのインポート。

    # パッケージのインポート
    from langchain.embeddings.openai import OpenAIEmbeddings
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.vectorstores.elastic_vector_search import ElasticVectorSearch
    from langchain.vectorstores.faiss import FAISS

    (3) 大きなテキスト「dragonball.txt」の準備し、Colabにアップロード。
    今回は、Wikipediaのドラゴンボールのあらすじを記述したテキストを用意します。

    ・dragonball.txt (9KBほど)

    孫悟空少年編
    
    地球の人里離れた山奥に住む尻尾の生えた少年・孫悟空はある日、西の都からやって来た少女・ブルマと出会う。そこで、7つ集めると神龍(シェンロン)が現れ、どんな願いでも一つだけ叶えてくれるというドラゴンボールの存在を、さらに育ての親である孫悟飯の形見として大切に持っていた球がその1つ「四星球(スーシンチュウ)」であることを知り、ブルマと共に残りのドラゴンボールを探す旅に出る。人さらいのウーロンや盗賊のヤムチャらを巻き込んだボール探しの末、世界征服を企むピラフ一味にボールを奪われ神龍を呼び出されるが、ウーロンがとっさに言い放った下らない願いを叶えてもらうことで一味の野望を阻止する。
    その後、悟空は旅の途中に知り合った武術の達人・亀仙人の下で、後に親友となるクリリンと共に8か月間にわたる修行を積み、その成果を確かめるために世界一の武術の達人を決める天下一武道会に出場し、変装して出場していた亀仙人に敗れるも準優勝を果たす。悟空は再び修行の旅へと出発し、ドラゴンボールの悪用を企むレッドリボン軍との闘いや、孫悟飯との再会などを経てさらに強さを増していく。さらに3年後の天下一武道会では、亀仙流のライバルである鶴仙流の天津飯(てんしんはん)と闘うが、あと一歩のところで敗れ、前回と同じく準優勝に終わる。
    
    ピッコロ大魔王編
    
    天下一武道会終了後、
        :

    (4) テキストの読み込み

    # テキストの読み込み
    with open("dragonball.txt") as f:
        dragonball_txt = f.read()

    (5) テキストを小さなテキストに分割。

    # テキストを小さなテキストに分割
    text_splitter = CharacterTextSplitter(
        chunk_size=500, 
        chunk_overlap=0
    )
    texts = text_splitter.split_text(dragonball_txt)

    (6) 関連するテキストを抽出。
    今回は、「トランクスの両親は誰?」のクエリを投げてみました。正しく「人造人間編」のテキストが選ばれていることがわかります。

    query = "トランクスの両親は誰?"
    
    # 関連するテキストの抽出
    embeddings = OpenAIEmbeddings()
    docsearch = FAISS.from_texts(texts, embeddings)
    docs = docsearch.similarity_search(query)
    
    # 確認
    print(len(texts))
    print(len(docs))
    print(docs[0].page_content)
    9
    4
    ナメック星での闘いから約1年後、密かに生き延びていたフリーザとその一味が地球を襲撃するが、謎の超サイヤ人によって撃退される。トランクスと名乗るその青年は、自分は未来からやってきたブルマとベジータの息子であることを悟空にだけ明かすと同時に、...

    次回



     
     

    npaka

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

    あなたへのおすすめ