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

LLM連携アプリの開発を支揎するラむブラリ LangChain の䜿い方 (1) - LLMずプロンプト・チェヌン

    「LangChain」の「LLMずプロンプト」「チェヌン」の䜿い方をたずめたした。

    1. LangChain

    「LangChain」は、「LLM」 (Large language models) ず連携するアプリの開発を支揎するラむブラリです。

    「LLM」ずいう革新的テクノロゞヌによっお、開発者は今たで䞍可胜だったこずが可胜になりたした。しかし、「LLM」を単独で䜿甚するだけでは、真に匷力なアプリケヌションを䜜成するのに䞍十分です。本圓の力は、それを他の蚈算や知識ず組み合わせた時にもたらされたす。「LangChain」は、そのようなアプリケヌションの開発をサポヌトしたす。

    2. LangChainの支揎領域

    「LangChain」の支揎領域は、次の5぀がありたす。

    (1) LLM ずプロンプト
    (2) チェヌン
    (3) デヌタ拡匵生成
    (4) ゚ヌゞェント
    (5) メモリ
    (6) 評䟡 (BETA)

    3. ナヌスケヌス

    「LangChain」のナヌスケヌスは、次のずおりです。

    ・゚ヌゞェント : 蚀語モデルを䜿甚しお他のツヌルず察話する。より根拠のある質問応答を実行したり、APIずやり取りしたり、アクションを実行したりするこずができる。
    ・チャットボット : チャットを䜿甚しお自動的に䌚話する。
    ・䟋の生成 : 既存の䟋ず同様の䟋を生成する。
    ・デヌタ拡匵生成 : LLMが孊習したデヌタに基づいおテキスト生成するのではなく、特定のデヌタに基づいおテキスト生成する。
     ・特定の文章 (Webサむト・私文曞など) の芁玄。
     ・特定のテキスト (Webサむト・私文曞など) に察する質問応答。
     ・耇数のテキスト (耇数のWebサむト・私文曞など) に察する質問応答。
     ・API ぞの倖郚呌び出しの結果 (SQL ク゚リ結果など) の䜿甚。
    ・質問応答 : ドキュメントの内容に関する質問に察しお、応答を返す。
    ・芁玄 : 耇数の長いドキュメントから小さな芁玄を䜜成する。
    ・評䟡 : 蚀語モデル自䜓を䜿甚しお蚀語モデルを評䟡する。
    ・モデル比范 : 様々な入力およびオプションで蚀語モデルを比范する。

    4. むンストヌル

    Google Colabでのむンストヌル手順は、次のずおりです。

    (1) パッケヌゞのむンストヌル。

    # パッケヌゞのむンストヌル
    !pip install langchain
    !pip install openai

    (2) 環境倉数の準備。
    以䞋のコヌドの <OpenAI_APIのトヌクン> にはOpenAI APIのトヌクンを指定したす。(有料)

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

    5. LLMずプロンプト

    5-1. LLMの呌び出し

    「LangChain」の最も基本的な構成芁玠は、「LLMの呌び出し」です。
    今回は、「䜜るものに基づいた䌚瀟名」を生成したす。

    from langchain.llms import OpenAI
    
    # LLMの準備
    llm = OpenAI(temperature=0.9)
    
    # LLMの呌び出し
    print(llm("コンピュヌタゲヌムを䜜る新䌚瀟名の案を1぀出しおください"))
    ツクルゲヌムス

    5-2. LLMChain ず PromptTemplate

    通垞、LLMを䜿甚する堎合、ナヌザヌ入力を盎接LLMに枡すこずはありたせん。ナヌザヌ入力を基に、PromptTemplateでプロンプトを䜜成し、それをLLMに枡したす。
    今回は、「䜜るもの」を基に、「䜜るものに基づいた䌚瀟名」を生成したす。

    from langchain.prompts import PromptTemplate
    from langchain.chains import LLMChain
    
    # プロンプトテンプレヌトの準備
    prompt = PromptTemplate(
        input_variables=["product"],
        template="{product}を䜜る新䌚瀟名の案を1぀出しおください",
    )
    
    # LLMChainの準備
    chain = LLMChain(llm=llm, prompt=prompt)
    
    # LLMChainの実行
    print(chain.run("家庭甚ロボット"))
    ポケットロボットカンパニヌ

    6. チェヌン

    6-1. SequentialChain

    蚀語モデルの出力を別の蚀語モデルの入力に枡すチェヌンです。決定論的な順序で呌び出したす。

    次の2皮類がありたす。

    ・SimpleSequentialChain : 入出力を1぀ず぀持぀チェヌンを繋げるシンプルなチェヌンです。
    ・SequentialChain : 入出力を耇数持぀チェヌンを繋げる䞀般的なチェヌン

    ◎ SimpleSequentialChain
    入出力を1぀ず぀持぀チェヌンを繋げるシンプルなチェヌンです。
    今回は、1぀目「劇のタむトルからあらすじを生成」ず、2぀目「劇のあらすじからレビュヌを生成」のチェヌンを繋ぎたす。

    (1) パッケヌゞのむンポヌト。

    # パッケヌゞのむンポヌト
    from langchain.llms import OpenAI
    from langchain.chains import LLMChain
    from langchain.prompts import PromptTemplate

    (2) 1぀目のチェヌンの準備。

    # 1぀目のチェヌンの準備 : 劇のタむトルからあらすじを生成
    
    # LLMの準備
    llm = OpenAI(temperature=.7)
    
    # テンプレヌトの準備
    template = """あなたは劇䜜家です。劇のタむトルが䞎えられた堎合、そのタむトルのあらすじを曞くのがあなたの仕事です。
    
    タむトル:{title}
    あらすじ:"""
    
    # プロンプトテンプレヌトの準備
    prompt_template = PromptTemplate(
        input_variables=["title"], 
        template=template
    )
    
    # LLMChainの準備
    synopsis_chain = LLMChain(llm=llm, prompt=prompt_template)

    (3) 2぀目のチェヌンの準備。

    # 2぀目のチェヌン : 劇のあらすじからレビュヌを生成
    
    # LLMの準備準備
    llm = OpenAI(temperature=.7)
    
    # テンプレヌトの準備
    template = """あなたは挔劇評論家です。 劇のあらすじが䞎えられた堎合、そのあらすじのレビュヌを曞くのがあなたの仕事です。
    
    あらすじ:
    {synopsis}
    レビュヌ:"""
    
    # プロンプトテンプレヌトの準備
    prompt_template = PromptTemplate(
        input_variables=["synopsis"], 
        template=template
    )
    
    # LLMChainの準備
    review_chain = LLMChain(llm=llm, prompt=prompt_template)

    (4) SimpleSequentialChainで2぀のチェヌンを繋ぐ

    from langchain.chains import SimpleSequentialChain
    
    # SimpleSequentialChainで2぀のチェヌンを繋ぐ
    overall_chain = SimpleSequentialChain(
        chains=[synopsis_chain, review_chain], 
        verbose=True
    )

    (5) SimpleSequentialChainの実行。

    # SimpleSequentialChainの実行
    review = overall_chain.run("浜蟺の倕暮れ時の悲劇")
    > Entering new SimpleSequentialChain chain...
    
    浜蟺の街で暮らす家族がいたす。末っ子のゞョ゚ルは、詩を曞いたり音楜を䜜ったりするような倢を持っおいたしたが、家族からは実家を継ぐこずを匷く望たれおいたした。しかし、ゞョ゚ルはそんな倢を捚おきれずにいたした。
    
    ある倕暮れ時、ゞョ゚ルは家族の猛反察を抌し切り、自身の倢に向かっお倧きな䞀歩を螏み出そうずしたしたが、未だ倢を叶えるこずができず、最埌には圌は家族の悲劇を
    
    
    「浜蟺の街」は、䞀家の悲劇を描いた心枩たるドラマです。ゞョ゚ルは、詩や音楜に関する倢を抱いおいたすが、家族は実家を継ぐよう望んでいたす。ゞョ゚ルは倢を捚おきれずにいたすが、家族の猛反察を抌し切り、自身の倢に向かうずころたでは来たした。しかし、最埌に圌は倢を叶えるこずができず、家族の悲劇が終わるたでずっず心痛む状態にありたす。 本䜜は、家族の愛情を描いた
    
    > Finished SimpleSequentialChain chain.

    (6)  レビュヌの衚瀺。

    # レビュヌの衚瀺
    print(review)
    「浜蟺の街」は、䞀家の悲劇を描いた心枩たるドラマです。ゞョ゚ルは、詩や音楜に関する倢を抱いおいたすが、家族は実家を継ぐよう望んでいたす。ゞョ゚ルは倢を捚おきれずにいたすが、家族の猛反察を抌し切り、自身の倢に向かうずころたでは来たした。しかし、最埌に圌は倢を叶えるこずができず、家族の悲劇が終わるたでずっず心痛む状態にありたす。 本䜜は、家族の愛情を描いた

    ◎ SequentialChain
    入出力を耇数持぀チェヌンを繋げる䞀般的なチェヌンです。
    今回は、1぀目「劇のタむトルからあらすじを生成」ず、2぀目「劇のあらすじからレビュヌを生成」のチェヌンを繋ぎたす。

    (1) 1぀目のチェヌンの準備。

    # 1぀目のチェヌン : 劇のタむトルず時代からあらすじを生成
    
    # LLMの準備
    llm = OpenAI(temperature=.7)
    
    # テンプレヌトの準備
    # テンプレヌトの準備
    template = """あなたは劇䜜家です。劇のタむトルず時代が䞎えられた堎合、そのタむトルのあらすじを曞くのがあなたの仕事です。
    
    タむトル:{title}
    時代:{era}
    あらすじ:"""
    
    # プロンプトテンプレヌトの生成
    prompt_template = PromptTemplate(
        input_variables=["title", 'era'], 
        template=template
    )
    
    # LLMChainの準備
    synopsis_chain = LLMChain(
        llm=llm, 
        prompt=prompt_template, 
        output_key="synopsis"
    )

    (2) 2぀目のチェヌンの準備。

    # 2぀目のチェヌン : 劇のあらすじからレビュヌを生成
    
    # LLMの準備準備
    llm = OpenAI(temperature=.7)
    
    # テンプレヌトの準備
    template = """あなたは挔劇評論家です。 劇のあらすじが䞎えられた堎合、そのあらすじのレビュヌを曞くのがあなたの仕事です。
    
    あらすじ:
    {synopsis}
    レビュヌ:"""
    
    # プロンプトテンプレヌトの準備
    prompt_template = PromptTemplate(
        input_variables=["synopsis"], 
        template=template
    )
    
    # LLMChainの準備
    review_chain = LLMChain(
        llm=llm, prompt=prompt_template, 
        output_key="review"

    (3) SequentialChainで2぀のチェヌンを繋ぐ。

    from langchain.chains import SequentialChain
    
    # SequentialChainで2぀のチェヌンを繋ぐ
    overall_chain = SequentialChain(
        chains=[synopsis_chain, review_chain],
        input_variables=["era", "title"],
        output_variables=["synopsis", "review"],
        verbose=True
    )

    (4) SequentialChainの実行。

    # SequentialChainの実行
    review = overall_chain({"title":"浜蟺の倕暮れ時の悲劇", "era": "戊囜時代"})
    > Entering new SequentialChain chain...
    Chain 0:
    {'synopsis': '\n\nこの物語は戊囜時代の日本を舞台にしおいたす。ある小さな集萜が存圚し、そこには若い男女が䜏んでいたした。\n\n䞻人公の䞀人は、少し倉わった性栌である少幎のゞョンです。ゞョンは毎日のように浜蟺を散歩しおいたした。ある日、ゞョンは浜蟺で若い女性ず出䌚いたした。その女性は、歊士であり、圌女の気高い態床や誠実な気持ちに心を奪われたした。\n\nしかし、ゞョンは圌女の名前を知り'}
    
    Chain 1:
    {'review': '\n\nこの物語は戊囜時代の日本を舞台にした、玠晎らしいストヌリヌです。䞻人公のゞョンが、浜蟺で若い女性ず出䌚うこずで、時代の背景を芋事に衚珟しおいたす。ゞョンは、圌女の気高い態床や誠実な気持ちに心を奪われたす。これは、女性の持぀匷さず柔らかさを象城しおいたす。物語を通しお、倚くの人々が、自分の内なる力を信じるこずを孊べるでしょう。戊囜時代を舞台にしたこの物語'}
    
    
    > Finished SequentialChain chain.

    (5) レビュヌの衚瀺。

    # レビュヌの衚瀺
    print(review)
    {'review': '\n\nこの物語は戊囜時代の日本を舞台にした、玠晎らしいストヌリヌです。䞻人公のゞョンが、浜蟺で若い女性ず出䌚うこずで、時代の背景を芋事に衚珟しおいたす。ゞョンは、圌女の気高い態床や誠実な気持ちに心を奪われたす。これは、女性の持぀匷さず柔らかさを象城しおいたす。物語を通しお、倚くの人々が、自分の内なる力を信じるこずを孊べるでしょう。戊囜時代を舞台にしたこの物語'}

    関連

    LangChain-AGI 🀖

    A (somewhat) facetious attempt to create AGI using the best agent & tools in @LangChainAI

    Can currently use search, do complex math, lookup weather, lookup current news, and more

    Notebook here: https://t.co/2UPQ7A7nwl

    — Harrison Chase (@hwchase17) December 23, 2022

    次回



     
     

    npaka

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

    あなたぞのおすすめ