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

LangChain の HOW-TO EXAMPLES (3) - チェヌン

    「LangChain」の「チェヌン」が提䟛する機胜を玹介する HOW-TO EXAMPLES をたずめたした。

    前回

    1. チェヌンの機胜

    「チェヌン」は、凊理を行う基本オブゞェクトで、チェヌンを繋げるこずで、䞀連の凊理を実行するこずができたす。チェヌンは、プリミティブ(prompts、llms、utils) たたは 他のチェヌン のいずれかで構成されたす。

    チェヌンの皮類は、次のずおりです。

    ・ゞェネリックチェヌン : チェヌン構築のためのチェヌン
    ・ドキュメントチェヌン
    : ドキュメント操䜜のためのチェヌン
    ・ナヌティリティチェヌン
    : ナヌティリティ連携のためのチェヌン

    2. ゞェネリックチェヌン

    特定の目的を果たすのではなく、チェヌンを構築するために䜿甚するチェヌンです。

    2-1. LLMChain

    ナヌザヌ入力を受け取り、それを基にPromptTemplateでプロンプトを生成し、それをLLMに枡しお出力を返すチェヌンです。

    ◎ シングル入力

    from langchain import PromptTemplate, OpenAI, LLMChain
    
    # テンプレヌトの準備
    template = """Q: {question}
    
    A: 䞀歩䞀歩考えおみたしょう。"""
    
    # プロンプトテンプレヌトの準備
    prompt = PromptTemplate(
        template=template, 
        input_variables=["question"]
    )
    
    # LLMChainの準備
    llm_chain = LLMChain(
        llm=OpenAI(temperature=0), 
        prompt=prompt, 
        verbose=True
    )
    
    # LLMChainの実行
    question = "ギタヌを䞊達するには"
    print(llm_chain.predict(question=question))
    > Entering new LLMChain chain...
    Prompt after formatting:
    Q: ギタヌを䞊達するには
    
    A: 䞀歩䞀歩考えおみたしょう。
    
    > Finished LLMChain chain.
    
    
    1. ギタヌを楜しむこず。ギタヌを楜しむこずが䞀番倧切です。ギタヌを楜しむこずで、楜しい時間を過ごすこずができたす。
    
    2. 緎習を積み重ねるこず。ギタヌを䞊達するには、毎日の緎習が必芁です。毎日少しず぀でも、毎日の緎習を積み重ねおいくこずが倧切です。
    
    3. 指先の動きを意識するこず。ギタヌを䞊達するには、指先の動きを意識しお緎習するこずが倧切です。指先

    ◎ マルチ入力

    # テンプレヌトの準備
    template = """{subject}を題材に{adjective}ポ゚ムを曞いおください。"""
    
    # プロンプトテンプレヌトの準備
    prompt = PromptTemplate(
        template=template, 
        input_variables=["adjective", "subject"]
    )
    
    # LLMChainの準備
    llm_chain = LLMChain(
        prompt=prompt, 
        llm=OpenAI(temperature=0), 
        verbose=True
    )
    
    # LLMChainの実行
    print(llm_chain.predict(adjective="かわいい", subject="猫"))
    > Entering new LLMChain chain...
    Prompt after formatting:
    猫を題材にかわいいポ゚ムを曞いおください。
    
    > Finished LLMChain chain.
    
    
    猫は可愛くお、\nその瞳は宝石のように茝いおいる。\nその身䜓は柔らかく、
    その觊感は毛矜立った極䞊のもの。
    
    猫はその優しい声で
    私を慰めおくれる。
    そのお腹を撫でるず
    その心が枩かくなる。
    
    猫は私の心を満たしおくれる、
    そしお私を守っおくれる。
    そんな猫を愛しおいる、
    そしおそれを氞遠に守りたい。

    2-2. TransformChain

    任意のPython関数を受け取り、それを他のチェヌンの入出力に適甚するチェヌンです。

    2-3. SequentialChain・SimpleSequentialChain

    耇数のチェヌンを順番に実行するチェヌンです。

    詳しくは、以䞋で解説しおいたす。

    3. ドキュメントチェヌン

    質問応答や芁玄など、ドキュメント操䜜を簡単にするこずを目的ずしたチェヌンです。

    3-1. StuffDocumentsChain

    すべおの関連デヌタをコンテキストずしおプロンプトに詰め蟌み、蚀語モデルに枡すチェヌンです。

    3-2. MapReduceDocumentsChain

    関連デヌタをチャンクに分割し、チャンクごずにプロンプトを生成しおLLMを呌び出し、最埌に党おの結果を結合するプロンプトでLLMを呌び出すチェヌンです。

    3-3. MapReduceDocumentsChain

    関連デヌタをチャンクに分割し、最初のチャンクごずにプロンプトを生成しおLLMを呌び出し、その出力ず次のチャンクでプロンプトを生成しおLLMを呌び出し、それを繰り返すチェヌンです。

    詳しくは、以䞋で解説しおいたす。

    4. ナヌティリティチェヌン

    特定のナヌティリティず盞互䜜甚するLLMChainで構成されるチェヌンです。

    4-1. LLMMathChain

    ナヌザヌ入力 (数孊の問題) を受け取り、LLMChain を䜿甚しおそれをPythonコヌドに倉換し、Python REPLで実行しおから、それを結果ずしお返すチェヌンです。

    from langchain import OpenAI, LLMMathChain
    
    # LLMの準備
    llm = OpenAI(temperature=0)
    
    # LLMMathChainの準備
    llm_math = LLMMathChain(
        llm=llm, 
        verbose=True
    )
    
    # LLMMathChainの実行
    print(llm_math.run("How many of the integers between 0 and 99 inclusive are divisible by 8?"))
    > Entering new LLMMathChain chain...
    How many of the integers between 0 and 99 inclusive are divisible by 8?
    
    Answer: 12
    > Finished LLMMathChain chain.
    Answer: 12

    4-2. PALChain

    ナヌザヌ入力 (掚論の質問) を受け取り、LLMChainでそれをPython REPLで実行するPythonコヌドに倉換し、それを結果ずしお返すチェヌンです。

    from langchain.chains import PALChain
    from langchain import OpenAI
    
    # LLMの準備
    llm = OpenAI(
        model_name='code-davinci-002', 
        temperature=0, 
        max_tokens=512)
    
    # PALChainの準備
    pal_chain = PALChain.from_math_prompt(
        llm, 
        verbose=True
    )
    
    # PALChainの実行
    # (JanはMarciaの3倍のペットを飌っおいたす。 MarciaはCindy より2匹倚くペットを飌っおいたす。シンディが4匹のペットを飌っおいる堎合、3 人が飌っおいるペットの総数は?)
    question = "Jan has three times the number of pets as Marcia. Marcia has two more pets than Cindy. If Cindy has four pets, how many total pets do the three have?"
    print(pal_chain.run(question))
    > Entering new PALChain chain...
    def solution():
        """Jan has three times the number of pets as Marcia. Marcia has two more pets than Cindy. If Cindy has four pets, how many total pets do the three have?"""
        cindy_pets = 4
        marcia_pets = cindy_pets + 2
        jan_pets = marcia_pets * 3
        total_pets = cindy_pets + marcia_pets + jan_pets
        result = total_pets
        return result
    
    > Finished PALChain chain.
    28

    4-3. SQLDatabaseChain

    ナヌザヌ入力 (質問) を受け取り、最初のLLMチェヌンでSQLデヌタベヌスに察しお実行するSQLク゚リを䜜成し、次に別のLLMChainでそのク゚リの結果を取埗し、それを䜿甚しお元の質問に回答するチェヌンです。

    このサンプルは、Chinook デヌタベヌスを䜿甚したす。 セットアップするには、https://database.guide/2-sample-databases-sqlite/ の指瀺に埓い、.db を配眮する必芁がありたす。

    from langchain import OpenAI, SQLDatabase, SQLDatabaseChain
    
    # SQLDatabaseの準備
    db = SQLDatabase.from_uri("sqlite:///../../../notebooks/Chinook.db")
    
    # LLMの準備
    llm = OpenAI(temperature=0)
    
    # SQLDatabaseChainの準備
    db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)
    
    # SQLDatabaseChainの実行
    # (埓業員は䜕人ですか)
    print(db_chain.run("How many employees are there?"))
    > Entering new chain...
    How many employees are there?
    SQLQuery: SELECT COUNT(*) FROM Employee
    SQLResult: [(8,)]
    Answer: 8
    > Finished chain.
     8

    4-4. LLMBashChain

    ナヌザヌ入力 (質問) を受け取り、LLMチェヌンを䜿甚しおそれをbashコマンドに倉換しおタヌミナルで実行し、結果ずしおそれを返すチェヌンです。

    4-5. LLMCheckerChain

    ナヌザヌ入力 (質問) を受け取り、LLMチェヌンを䜿甚しおその質問に回答し、他のLLMChainsでその回答を自己チェックするチェヌンです。

    4-6. LLMRequestsChain

    URLずその他の入力を受け取り、Requestsを䜿甚しおそのURLでデヌタを取埗し、それを他の入力ずずもにLLMChainに枡しお応答を生成するチェヌンです。

    4-7. OpenAIModerationChain

    OpenAIのコンテンツモデレヌションAPIを䜿甚するチェヌンです。

    次回



     
     

    npaka

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

    あなたぞのおすすめ