ChatGPT

LangChainって何?: 次世代AIアプリケーション構築 その1

こんにちは、エクスチュアの石原です。

近年、大規模言語モデル(LLM)を利用したアプリケーション開発が急速に進展しています。その中で、特にLangChain(ラングチェーン)は注目を集めているキーワードの一つとなっています。LangChainは、大規模言語モデルを活用してアプリケーションを効率的に開発するためのライブラリです。

この記事では、LangChainの基本的な機能を紹介し、Pythonを使用したLangChainのクイックスタートガイドを提供します。

それでは、LangChainの基本的な概要について見ていきましょう

LangChainの概要

LangChainは、生成AIを用いたアプリケーション開発に必要な機能を集約したOSSライブラリです。Python及びTypeScriptに対応しており、現時点ではPython専用の機能も存在するため、本記事ではPython版を使用しています。

LangChainを使用する際の重要なポイントは、利用する生成AIを自由に選択できることです。例えば、OpenAIのGPT-4やGoogleのGeminiなど、公開されているモデルから選ぶことが可能です。さらに、LLMを変更する際にはコード全体に大規模な変更を加えることなく修正が可能です。また、コードの作成が容易なため、LLMの試用も簡単に行うことができます。

LangChainのメリットとして特筆すべきは、生成AIアプリケーション開発で採用されているアプローチが実装されている点です。Few-shot LearningやReAct、RAGなどのアプローチについては、ドキュメントを参照するだけでアプリケーション開発に活用できます。GitHubでのコミットも頻繁に行われており、新機能の追加も進んでいます。

ただし、LangChainの機能を十分に理解せずに開発を始めると、次々と未知の機能に直面し、実装に困難を感じる方も少なくないでしょう。この記事が学習の一助となれば幸いです。

今回の記事では、Google Colabを用いてLangChainのクイックスタートを日本語訳し、Google Colab上でも解説を追加しています。是非、実際に動作を確認してみてください!

Langchianクイックスタート

今回の記事ではOpenAI社のChatGPTを利用します。APIキーの取得方法については、以前にアップロードしたこちらの記事をご参照ください。

pip install langchain langchain-openai

OpenAIのAPIキーが必要となります。ノートブックではsecret変数としてAPIキーを入力しています。

環境変数にAPIキーを登録している場合は、別途APIキーを指定する必要はありません。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI()

これで生成AIを活用したアプリケーション開発の準備が整いました。

それでは、質問を入力してみましょう。invoke関数を呼び出すことで実行できます。

AI_answer = llm.invoke("Langsmithはテストでどのようなヘルプができますか?")

print(AI_answer.content)
Langsmithはテストのさまざまな側面でヘルプを提供することができます。以下はその例です:

1. 質問の解答:テストに関する疑問や問題がある場合、Langsmithはそれに対する解答や説明を提供することができます。例えば、「なぜこの問題の答えがBなのか?」や「この問題の解法を教えてください」といった質問に対して、適切な回答を提供します。

2. テストの準備:Langsmithはテストの準備に役立つ情報やテクニックを提供することができます。例えば、効果的な学習方法やメモリの改善に関するアドバイス、テスト前の適切な睡眠や栄養の重要性についての情報などを提供します。

3. 模擬試験の提供:Langsmithはテストの練習として模擬試験を提供することができます。これにより、実際のテストに向けて自分の実力を評価することができます。また、模擬試験の結果に基づいて、弱点や改善すべき点を特定するためのフィードバックも提供します。

4. テストの戦略と時間管理:Langsmithはテストの戦略と時間管理についてのアドバイスを提供することができます。例えば、どのように問題を解くか、どの問題にどれくらいの時間を割くか、解答をチェックするための余裕を持つ方法などについてアドバイスします。

5. テスト不安の克服:テスト不安は多くの人にとって問題ですが、Langsmithはテスト不安を克服するためのアドバイスやリラクゼーションのテクニックを提供することができます。また、自信を持ってテストに臨むためのポジティブな思考パターンやアフィメーションも提供します。

これらはLangsmithが提供できるヘルプの例ですが、具体的な要件やニーズに合わせてカスタマイズされたヘルプを提供することも可能です。

ChatGPTの応答はAIMessageという形式で返ってきます。content属性を参照することで、出力されたテキストを確認することができます。

PromptTemplate

この方法では、LLM(Large Language Model)への入力文(プロンプトと呼ばれる)の一部を変更する際にコードの編集が必要です。

Langchainでは、プロンプトの作成を効率化する仕組みとしてPromptTemplateが用意されています。

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは世界トップクラスの技術文書ライターだ。"),
    ("user", "{input}")
])

これでテンプレートを使用する準備ができました。

今回のような短いテキストではその効果を十分に発揮することはありませんが、教師データを入力文字数に応じて自動的に増減し選択するFewShotPromptTemplateなども存在します。

今回クイックスタートで使用されているのはチャットモデル専用のテンプレートです。オリジナルのテンプレートの作成も可能ですし、さまざまな種類のPromptTemplateが存在するため、それらを確認することをお勧めします。

PromptTemplate:https://python.langchain.com/docs/modules/model_io/prompts/

LLM Chain

プロンプトテンプレートを使用する際には、LLM chainと呼ばれる仕組みを利用します。これにより、プロンプトからLLMへの入力と出力を効率的に処理できます。

下記のコードは、プロンプトとLLMをパイプ演算子で接続し、一連の処理を実行する方法を示しています。

chain = prompt | llm 
AI_answer = chain.invoke({"input": "Langsmithはテストでどのようなヘルプができますか?"})
print(AI_answer.content)

このコードにより、入力からLLMの出力までを一貫したコードで実装することができました。この仕組みは、LLMの機能を活用した複雑なシステム開発においても非常に役立ちます。

それでは、早速上記のコードを実行してみましょう。

Langsmithは、さまざまなテストに関する技術文書の作成や編集をサポートすることができます。以下にいくつかの具体的な例を挙げます。

1. テスト計画書の作成: テスト計画書は、テストの目的、範囲、タイムライン、リソース要件などを詳細に文書化します。Langsmithは、必要な情報を収集し、テスト計画書を作成するのに役立ちます。

2. テストケースの作成: テストケースは、テストのステップや予想される結果を定義する文書です。Langsmithは、テスト対象の機能や要件に基づいてテストケースを作成するのに役立ちます。

3. テスト手順書の作成: テスト手順書は、テストの実施方法や環境の設定などを記述します。Langsmithは、テスト手順書を作成し、明確な手順を提供するのに役立ちます。

4. テスト結果の文書化: テスト結果は、テストの実行結果や問題の報告をまとめたものです。Langsmithは、テスト結果を文書化し、問題の特定や解決策の提案に役立ちます。

また、Langsmithはテストに関連する用語や概念の解説や、読みやすく明確な文書の作成にも助けになります。テストのプロセスやベストプラクティスについての情報も提供できます。

生成AIの出力にわずかな変化が見られることにお気づきでしょうか。

システムメッセージでPromptTemplateに与える役割を変更することにより、さまざまな応答を確認できます。これによって、文体を変更したり、より適切な応答を得たりすることが可能です。

OutputParser

最後に紹介するのがOutputParserです。

これは生成AIからの出力を解析し、任意の形に修正してくれる仕組みです。今回は文字列への変換を行うStrOutputParserを使用します。

from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()

chain = prompt | llm | output_parser

それでは出力を確認してみましょう。

AI_answer = chain.invoke({"input": "Langsmithはテストでどのようなヘルプができますか?"})

print(type(AI_answer)) # <class 'str'>
print(AI_answer)

出力が文字列に変換されていることが確認できました!このようにOutputParserを利用することで、生成AIの出力を柔軟に扱うことが可能になります。

Langsmithはテストに関連する様々なヘルプを提供することができます。以下はいくつかの例です。

1. テスト計画の作成: Langsmithは、プロジェクトの目標と要件に基づいて、効果的なテスト計画を作成することができます。これには、テストの範囲、スケジュール、リソースの割り当て、テストケースの作成方法などが含まれます。

2. テストケースの作成: Langsmithは、要件仕様書や設計文書に基づいて、正確で網羅的なテストケースを作成することができます。これには、入力値、予想される出力、事前条件、事後条件などの詳細な情報が含まれます。

3. テスト実行と結果の評価: Langsmithは、テストケースを使用してソフトウェアのテストを実行し、結果を評価することができます。これには、バグの特定、優先順位付け、報告の作成などが含まれます。

4. テストドキュメントの作成: Langsmithは、テスト計画、テストケース、テスト結果など、テストに関連するドキュメントの作成をサポートすることができます。これにより、将来の参照や他のチームメンバーへの共有が容易になります。

5. テスト自動化のサポート: Langsmithは、テスト自動化に関するガイダンスやテンプレートを提供することができます。これにより、効率的で一貫性のあるテストの実行が可能になります。

これらのヘルプにより、Langsmithはテストの品質を向上させ、ソフトウェア開発プロセス全体の効率を高めることができます

JSON形式とCSV形式のOutputParserは、LLMの出力を扱う上で便利です。これらのパーサーは、生成AIからの出力をJSONやCSVなどの構造化されたデータ形式に変換するために使用されます。

例えば、JsonOutputParser を使用することで、生成AIの出力をPythonの辞書型(ディクショナリ)に変換し、JSON形式で扱うことができます。同様に、CsvOutputParser は出力をリスト形式に変換する際に役立ちます。

最適なテンプレート選びは、AIをより効果的に扱う上で非常に重要なポイントです。

公式ドキュメントでは、OutputParserについての詳細な説明や使用方法が提供されています。新しい種類のパーサーやテンプレートが追加される可能性もあるため、特定の形式での応答が必要になった場合は公式ドキュメントを確認し、最新の情報を入手することをお勧めします。

OutputParser:https://python.langchain.com/docs/modules/model_io/output_parsers/

LCEL

今回ご紹介したLLM Chainの記載方法はLangChain Expression Language(LCEL)といいます。

LLM ChainのLCELを用いた記述方法は、ストリーミング実行をサポートしている点が大きなメリットです。この機能により、AIが生成した内容を逐次的に受け取ることができ、最終的な出力が完成するまでの待ち時間を削減し、ユーザ体験の向上に寄与します。

以下のコードでは、生成される回答をストリームとしてリアルタイムに受け取り、表示しています。

これにより、一つの長い回答を待つ代わりに、生成される各部分を即座に確認することが可能です。

for AI_answer in chain.stream({"input": "Langsmithはテストでどのようなヘルプができますか?"}):
    print(AI_answer)

このように、LCEL記法を使用することで、高度な応答速度の最適化が自動的に行われるため、複雑なシステムを構築した場合でも、ユーザーがスムーズな対話を享受できるようになります。

実際に使用する場合、以下のように実装することができます。LCEL記法を用いることで、たとえ複雑なシステムを構築した場合でも、応答速度が自動的に最適化されます。

for AI_answer in chain.stream({"input": "Langsmithはテストでどのようなヘルプができますか?"}):
    print(AI_answer, end='', flush=True)

おわりに

ここまで紹介してきたLangChainの機能は、ごく一部に過ぎない基本的なものです。

今後もLangChainの機能を継続してご紹介していく予定ですので、どうぞご注目ください。

エクスチュアはマーケティングテクノロジーを実践的に利用することで企業のマーケティング活動を支援しています。
ツールの活用にお困りの方はお気軽にお問い合わせください。

ピックアップ記事

  1. 最速で理解したい人のためのIT用語集

関連記事

  1. Python

    Streamlit in SnowflakeによるStreamlitアプリケーション作成

    こんにちは、エクスチュアの石原です。前回に引き続き、Pyth…

  2. Python

    【完全版】MacでSeleniumを環境構築から実行まで 〜Python&Chrome〜

    Seleniumって何?Selenium(セレニウム)とは、Webア…

  3. ChatGPT

    LangChainって何?: 次世代AIアプリケーション構築 その2

    こんにちは、エクスチュアの石原です。こちらは第2回の記事にな…

  4. ExBlogCrawler

    ChatGPT

    GPTs使ってみた

    こんにちは、小郷です。標題の通りGPT Builderを使ってみたの…

  5. Google Cloud Platform

    Vertex AIのベクトル検索によってブログの検索エンジンを作成してみた

    はじめにこんにちは、石原と申します。こちらの記事は前…

  6. Python

    その分析、やり方あってる?記述統計と推測統計の違い

    こんにちは、小郷です。閲覧数のために挑発的なタイトルでイキりました(…

最近の記事

  1. 回帰分析はかく語りき Part3 ロジスティック回帰
  2. GCSへのSnowflake Open Catalogによる…
  3. VPC Service Controlsで「NO_MATCH…
  4. モダンデータスタックなワークフローオーケストレーションツール…
  5. Streamlit in Snowflakeによるダッシュボ…
  1. Tableau

    【図解】Tableau Desktop 2020.2の新機能をはじめから丁寧に(…
  2. Databricks

    Databricksを始める前に覚えておきたいScalaプログラミングの基本
  3. Tableau

    Tableau Tips〜WINDOW関数〜
  4. Google Tag Manager

    Google Tag Manager: 離脱リンクのクリックをトリガーにする
  5. Python

    わかりやすいPyTorch入門⑤(CNNとデータの拡張)
PAGE TOP