【勉強メモ】Langchainってなに?

大元の記事

大元の記事はこちらです。記事を元に自分が勉強しやすいようにまとめた記事になります。


自然言語処理:Langchainライブラリの紹介

近年、コンピュータが人間の言葉を理解するための技術が進んでいます。これを自然言語処理(Natural Language Processing)、略してNLPと呼びます。NLPの一種に大規模言語モデル(LLM)と呼ばれるものがあります。LLMの一例として、GPT-3というのがありますが、これは聞いたことがあるかもしれません。もう一つの例はChatGPTで、多くの人の仕事に役立っています。

LLMは、人間の言葉を理解し、質問に答えることができる実に大きなコンピュータ・プログラムです。しかし、実際の場面でLLMを使うには、いくつかの課題があります。今回は、その課題のいくつかと、それを克服するためのLangchainというライブラリーを紹介します。

課題1:機密データの扱い

LLMで処理する必要がある情報が機密情報である、つまり秘密にする必要がある場合があります。この場合、LLMは会社のセキュアな環境の外で情報にアクセスする必要がある場合があるため、課題となることがあります。これはセキュリティリスクを生む可能性があります。

ラングチェーンではこの課題を解決することはできませんので、企業は独自に機密データの扱い方を考える必要があります。

課題2:モデルの更新

LLMは膨大な量のテキストデータで学習されます。しかし、時にはモデルが特定のトピックに関する最新の情報や知識を持っていない場合があります。例えば、ChatGPTに「最新のポケモン」について質問した場合、少し古い答えを返してしまうかもしれません。この問題を解決するためには、新しいデータでLLMを再トレーニングする必要がありますが、それにはコストがかかります。

2つ目のハードルは、モデルの更新です。LLMは膨大なテキストデータで学習させるとはいえ、学習データに含まれない各業界や企業の最新情報やノウハウを提供できない可能性があります。例えば、2022年12月18日時点の「最新のポケモン」をChatGPTに尋ねた場合、「ポケモンの剣/盾」と回答する可能性があるなど、最新情報とは言い難い。新しいデータや専門知識を含むデータでモデルを再トレーニングするのは、非常にコストがかかります。OpenAIのようなサービスプロバイダーがモデルを更新し、業界特化型のモデルを提供してくれるかもしれませんが、自分たちでコントロールしたい場面も出てくるはずです。

ラングチェーンでは、LLMがGoogleや専門データベースなどの外部リソースにアクセスし、最新の情報を取得できるようにすることで、この課題を解決することができます。

課題3:誤った出力への対応

LLMは、たとえその情報が学習データにあったとしても、時には誤った答えを出すことがあります。これは、LLMが見たテキストに基づいて、あるべき答えを予測しようとするためですが、常に正しい答えが出るとは限りません。

3つ目のハードルは、誤った出力への対処です。LLMは、学習データに含まれているかどうかに関わらず、誤った情報をあたかも真実であるかのように出力してしまうことがあります。例えば、計算問題に答えるとき、誤った出力をすることがある。実際の業務に応用するためには、誤った出力を減らし、事実に基づいた回答ができるようにする必要がある。

Langchainは、LLMが他のリソースを使って答えを再確認したり、間違っている場合は修正したりすることで、この課題を解決します。

この2つ目、3つ目のハードルを越えるために、必要に応じて外部のリソースを活用することが考えられます。例えば、モデルが知らないことがあれば、Googleで検索したり、データベースに問い合わせたり、人に聞いたりする仕組みがあるとよいでしょう。また、数式に正しく答えたり、プログラムを実行したりする言語処理系を利用するのも有効だろう。複数のLLMを組み合わせて、それぞれの長所と短所を考慮することも考えられる。

そのためには、与えられた問題を小問題に分解し、それぞれの小問題に対してどのような解法をとるかを決定するLLMが必要になるだろう。そこで登場するのがlangchainです。langchainは、上記の2番目と3番目のハードルを乗り越えるためのライブラリです。問題解決に必要な外部リソースの選択とその結果の観測を繰り返し、最終的な結果を得ることができるのです。この仕組みは、Action-Driven LLMとして現在注目されています。

Langchainの仕組み
Langchainは、LLMが2番目と3番目の課題を克服するのを助けるライブラリです。LLMがGoogleやデータベースなどの外部リソースにアクセスできるようにし、LLMが自分の答えをダブルチェックしたり修正したりする方法を提供することで、これを実現するのです。

LLMのための図書館のようなものだと考えてください。ちょうど、あなたが図書館に行って自分の持っていない本や情報を探すように、LangchainはLLMが持っていない情報を探す手助けをするのです。

Langchainを使うことは、あなたの質問に対する答えを見つける手助けをしてくれる賢いアシスタントを持つようなものです。例えば、LLMに質問して答えが分からなかったら、Langchainはインターネットを検索したり、人に聞いたりして答えを探す手助けをします。

まとめ

LLMは、人間の言葉を理解し、質問に答えることを助けてくれる素晴らしい技術です。しかし、実際の場面で使うには、いくつかの課題があります。Langchainは、LLMが外部のリソースにアクセスし、自分の答えをダブルチェックできるようにすることで、これらの課題のいくつかを克服するためのライブラリです。これにより、LLMはさらに強力になり、問題解決に役立つようになります。

この2つ目、3つ目のハードルを越えるために、必要に応じて外部のリソースを活用することが考えられます。例えば、モデルが知らないことがあれば、Googleで検索したり、データベースに問い合わせたり、人に聞いたりする仕組みがあるとよいでしょう。また、数式に正しく答えたり、プログラムを実行したりする言語処理系を利用するのも有効だろう。複数のLLMを組み合わせて、それぞれの長所と短所を考慮することも考えられる。

そのためには、与えられた問題を小問題に分解し、それぞれの小問題に対してどのような解法をとるかを決定するLLMが必要になるだろう。そこで登場するのがlangchainです。langchainは、上記の2番目と3番目のハードルを乗り越えるためのライブラリです。問題解決に必要な外部リソースの選択とその結果の観測を繰り返し、最終的な結果を得ることができるのです。この仕組みは、Action-Driven LLMとして現在注目されています。

以上のように、LLMは自然言語処理において非常に強力なツールである。しかし、LLMを実際の業務に適用する際には、機密データの取り扱い、モデルの更新、誤った出力への対応など、克服しなければならない課題が数多く存在する。

これらのハードルを克服するために、外部リソースの活用やAction-Driven LLM、そしてlangchainの活用が考えられます。2つ目のハードルは、モデルの更新です。LLMは膨大なテキストデータで学習しているとはいえ、学習データに含まれない各業界や企業の最新情報やノウハウを提供できるとは限りません。

例えば、2022年12月18日時点の「最新のポケモン」をChatGPTに尋ねた場合、「ポケモンの剣/盾」と回答する可能性があるのです。新しいデータや専門知識を含むデータでモデルを再トレーニングするのは、非常にコストがかかります。

OpenAIのようなサービスプロバイダーがモデルを更新し、業界特化型のモデルを提供してくれるかもしれませんが、自分たちでコントロールしたい場面も出てくるはずです。

Chains

道具箱の中に様々な道具が入っていると想像してください。それぞれの道具には特定の目的があり、異なることをするのに役立ちます。同様に、チェーンは、特定の結果を得るために役立つ一連のツールまたは手順です。

例えば、新しい製品のアイデアを思いついたとしましょう。その際、一連のツールを使うことができます。まず、LLM(大規模言語モデル)を使って、新製品のターゲットを入力することができます。すると、LLMは入力されたターゲットに基づいて、新製品のアイデアをいくつか出してくれます。次に、別のLLMを使って、そのアイデアを経営者の視点から見直すことができます。こうすることで、そのアイデアが良いだけでなく、実現可能かどうか、利益が出るかどうかを確認することができます。

提供された例では、使用されるチェーンはLLMChainとSimpleSequentialChainと呼ばれるものです。LLMChainは、LLMとプロンプトテンプレートを使って、新製品のターゲットを入力し、アイデアを出力します。SimpleSequentialChainは、複数のチェーン(この場合はLLMChain)を組み合わせて、目的の結果を得ます。

チェーンの働きをよりよく理解するために、実際の例を使って説明しましょう。ケーキを作りたいが、作り方がわからないとする。このとき、道具の連鎖が役に立ちます。まず、レシピが必要です。料理本、ウェブサイト、ビデオチュートリアルなどを使って、レシピを入手することができます。これは、あなたの連鎖の最初のツールです。

次に、ケーキを作るために必要なすべての材料を集める必要があります。買い物リストを使って、忘れ物がないようにしましょう。これが2つ目の道具です。

次に、材料を正しく計量する必要があります。計量カップやスプーンを使うとよいでしょう。これが3つ目の道具です。

その後、材料を混ぜ合わせる必要があります。ミキシングボウルと泡立て器を使うとよいでしょう。これは4番目の道具です。

最後に、ケーキを焼く必要があります。オーブンを使って焼きます。これが最後の道具です。

これらのステップを順番にこなしていけば、最後にはおいしいケーキができあがります。これが鎖の仕組みです。大きな仕事を、より小さく、より管理しやすいステップに分解することで、より簡単に目標を達成することができるのです。

Agents

プログラミングでは、特定の作業を行うためにツールを使用することがよくあります。これらのツールは、特定の順序で連鎖的に実行される。しかし、時には、得られた入力に基づいて、どのツールを使うかを選択する必要があります。そこで登場するのがエージェントです。

エージェントは、私たちが与えたインプットをもとに、その仕事に適したツールを選択するヘルパーのようなものです。エージェントには様々な種類があり、それぞれ違った働きをします。いくつかの例を見てみましょう。

ある種のエージェントは、"zero-shot-react-description "と呼ばれるものです。このエージェントは、それぞれのツールの説明を読み、最適と思われるものからどれを使うかを決定します。例えば、エージェントに「日本で一番高い山の高さは?その高さの5乗根を求めよ」という問いに対して、このエージェントは、検索ツールを使って山の名前を探し、電卓ツールを使って答えを計算することを決定するかもしれない。

もう一つのタイプのエージェントは、"react-docstore "と呼ばれるものです。このエージェントは、異なるセクションを調べて情報を見つけなければならない紙のような働きをします。エージェントに2つのツールを与えます。1つは文書を検索するツール、もう1つは検索結果の中から特定の用語を探すツールです。そして、エージェントはさまざまなドキュメントを検索して答えを探します。

最後に、"self-ask-with-search "と呼ばれるエージェントがあります。このエージェントは、Googleのような検索エンジンを使って、質問と答えを探すことを繰り返す。例えば、"フランスの首都は?"と質問すると、エージェントはGoogleを使って答えを検索し、見つけた答えを教えてくれるかもしれません。

このように、エージェントは、私たちが入力した内容に基づいて、その仕事に適したツールを選んでくれる助っ人のような存在です。それぞれの仕事に適したツールを選択するプロセスを自動化することで、プログラミングをより簡単に、より効率的にしてくれるのです。

電卓や検索エンジンのようなツールがたくさんあって、それらを使って問題を解決したいと想像してください。でも、どのツールを最初に使えばいいのか、次に使うのはどれなのかわからないことがあります。そこでエージェントの出番です。

エージェントは、どのツールをどのような順番で使えばいいかを考えてくれる助っ人のようなものです。例えば、日本で一番高い山の高さを求めて、その山の五大根を計算したいとします。そんなとき、エージェントを使えばいいんです。

エージェントは、LLM(Language Modelの略)というものを使って、どのツールを最初に使うかを決めます。この場合、日本で一番高い山が何かを調べるために、検索ツールを使うかもしれない。富士山とわかったら、電卓ツールで富士山の高さをフィートからメートルに変換するかもしれない。最後に、再び電卓ツールで高さの5乗根を計算する。

以下は、このようなコードの例である。

from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain import LLMMathChain, SerpAPIWrapper

llm = OpenAI(temperature=0)
search = SerpAPIWrapper()
llm_math_chain = LLMMMathChain(llm=llm, verbose=True)
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events"
    ),
    Tool(
        name="Calculator",
        func=llm_math_chain.run,
        description="useful for when you need to answer questions about math"), Tool(
    )
]

llm = OpenAI(temperature=0)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
agent.run("What is the height of the highest mountain in Japan? Find the 5th power root of its height.")

このコードでは、まず、検索ツールと電卓ツールを作成します。次に、initialize_agent 関数を用いてエージェントを作成し、zero-shot-react-description エージェントを使用するように指示します。最後に、答えたい質問でエージェントを実行します。「日本で一番高い山の高さは何メートルですか?その高さの5乗根を求めよ"。

するとエージェントは、先ほど説明した手順で、検索ツールを使って富士山を探し、電卓ツールを使ってその高さをフィートからメートルに変換し、再び電卓ツールを使ってその高さの5乗根を求めます。そして、最後に答えが表示されます。"日本一高い山の高さは3760.544mで、その5乗根は5.188599325914775"。

つまりエージェントは、問題を解決するためにどの道具をどのような順番で使えばいいのかを考えてくれる助っ人のような存在なのです。これによって、私たちは問題を解決しやすくなり、正しい答えを導き出すことができるのです

Memory

メモリは、学生が物を持ち運ぶのに使うリュックのようなものです。学生がクラスからクラスへ本や備品を持ち運ぶ必要があるように、チャットボットも会話の内容を記録し、適切に対応できるように、会話の中で何が話されたかを記憶しておく必要があります。

チャットボットが使用できるメモリには、ConversationBufferMemory、ConversationalBufferWindowMemory、ConversationSummaryMemoryなど、さまざまな種類のメモリがあります。バックパックのポケットやコンパートメントが異なるように、それぞれのタイプのメモリは異なる情報を格納します。

例えば、ConversationBufferMemoryは、入れたものを整理せずにすべて保存するリュックのようなものです。ConversationalBufferWindowMemoryは、1週間や1カ月など一定期間のものだけを保存するリュックサックのようなものです。そしてConversationSummaryMemoryは、テストのために覚えておくべき重要な概念のリストのように、学んだ重要なことを要約するバックパックのようなものです。

ChatGPT Cloneは、Memoryを使ったチャットボットの一例です。それは、コンパートメントがたくさんある本当に大きなバックパックを持っている学生のようなもので、そこには学校で知る必要のあるすべてのものが入っています。しかし、ChatGPTクローンは、学校の科目の代わりに、バックパックの中に仮想世界を持ち、そこで世界に関することを学び、記憶することができます。

まとめ

ケーキを作るとき、小麦粉、砂糖、卵など、さまざまな材料を使うことを想像してください。ケーキを作るのに材料が必要なように、コンピュータのプログラムを作るときにも、データベースや検索システムなど、さまざまなリソースを使う必要があることが多い。しかし、ケーキに使う材料が美味しくて病気にならないように、プログラムに使う外部リソースが信頼できて問題が起きないことを確認する必要があるのです。

もう一つの課題は、時には仕事に適した材料を選ぶ必要があることです。例えば、ケーキを作るときに砂糖の代わりに塩を使うことはないでしょう。それと同じように、コンピュータ・プログラムを作るときには、その作業に適した外部リソースを使うようにしなければならないのです。

最後に、ケーキのレシピを作るときに温度や調理時間を調整してちょうど良い味に仕上げるように、コンピュータのプログラムも微調整してより良く動作させる必要がある場合があります。しかし、その過程で、新しいバージョンになると動かなくなるなど、コンピュータ・プログラムに何らかの問題が生じることがあります。しかし、時間が経てば、これらの問題は解決されることが期待されます。

課題はあるにせよ、ラングチェーンは実にクールなシステムで、いろいろなことに使えると思います。本当にクールなおもちゃを持っているようなもので、いろいろな使い方ができるのです。説明書に従う限り、誰でも使ってみることができますよ。

この記事が気に入ったらサポートをしてみませんか?