LangChainによるAIの変革:テキストデータのゲームチェンジャー
LangChainによるAIの変革
過去数年間、Large Language Models(LLMs)は人工知能の世界を席巻してきました。
2020年にOpenAIのGPT-3が画期的にリリースされて以来、LLMsの人気は着実に高まっており、最近の進展によりさらに盛り上がりを見せています。
これらの強力なAIモデルは、自然言語処理アプリケーションの新たな可能性を開拓し、開発者がより洗練された人間らしい対話を作成することを可能にしました。
- 最適なテクノロジー/ベンダーを選ぶための体系的なアプローチ:MLOpsバージョン
- 「Pythonを使った合成データの生成」
- 「ディープラーニングの謎を解明する:CIFAR-10データセットを用いたCNNアーキテクチャの秘密の解明」
しかし、このAI技術に取り組む際には、スケーリングや信頼性のあるアルゴリズムの生成が困難です。
この急速に変化する環境の中で、LangChainはLLMsのフルポテンシャルを様々なアプリケーションに活用するために設計された多目的なフレームワークとして登場しました。その中でも最も重要なユースケースの一つは、大量のテキストデータを取り扱うことです。
さあ、今日からLLMsの力を最大限に活用しましょう!
LangChainはチャットボット、質問応答システム、要約ツールなどで利用することができます。ただし、LangChainの最も有用で使用されるアプリケーションの一つはテキストの取り扱いです。
今日の世界はデータで溢れています。その中でも特に有名なのがテキストデータです。
すべてのウェブサイトやアプリケーションは、毎日膨大な量の単語によって爆撃されています。この情報量を処理することは人間には不可能ですが、コンピュータはできるのでしょうか?
LLM技術とLangChainを組み合わせることで、メッセージの最も重要な部分を維持しながらテキストの量を減らすことができます。そのため、本日はテキストの取り扱いにLangChainの基本的で非常に有用な2つのユースケースについて解説します。
- 要約:テキストやチャットの対話の最も重要な事実を表現します。データの量を減らしながら、最も重要な部分を維持することができます。
- 抽出:テキストやユーザーのクエリから構造化されたデータを抽出します。テキスト内のキーワードを検出して抽出することができます。
LLMsの世界に初めて触れる方や言語生成プロジェクトを次のレベルに進めたい方々にとって、このガイドはテキストの取り扱いにLangChainのフルポテンシャルを引き出すための貴重な知見と実践的な例を提供します。
⚠️ 基本的な理解を得たい場合は、こちらをチェックしてください 👇🏻
LangChain 101: Build Your Own GPT-Powered Applications — VoAGI
常にOpenAIとGPTモデルと一緒に作業するためには、ローカルコンピュータにOpenAIのライブラリをインストールして、有効なOpenAIキーを持っている必要があります。それがどのように行われるか分からない場合は、こちらをチェックしてください。
1. 要約
ChatGPTとLangChainを組み合わせると、情報を迅速かつ非常に信頼性の高い方法で要約することができます。
LLMの要約技術は、メッセージの最も重要な部分を維持しながらテキストの量を減らす素晴らしい方法です。そのため、テキストデータの大量処理と分析が必要なデジタル企業にとって、LLMsは最良の味方となるでしょう。
以下の例を実行するには、次のライブラリが必要です:
# LangChain & LLM
from langchain.llms import OpenAI
from langchain import PromptTemplate
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Wikipedia API
import wikipediaapi
1.1. 短文要約
短文の要約には、実際には特別なことはせず、単純な指示に従ってプロンプトを生成するだけです。
つまり、入力変数を使用したテンプレートを生成することです。
あなたはもしかしたら疑問に思っているかもしれません… 正確にはプロンプトテンプレートとは何ですか?
プロンプトテンプレートは、プロンプトを生成する再現可能な方法を指します。それは、エンドユーザーから一連のパラメータを受け取り、プロンプトを生成するテキスト文字列であるテンプレートを含んでいます。
プロンプトテンプレートには以下が含まれます:
- 言語モデルへの指示 – 私たちのLLMのいくつかの手順を標準化するための指示です。
- 入力変数 – 以前の指示を任意の入力テキストに適用するための変数です。
簡単な例で確認しましょう。特定の製品を生産するブランドの名前を生成する標準化されたプロンプトを作成できます。
前の例で観察できるように、LangChainの魔法は、変数を持つ標準化されたプロンプトを定義できることです。
- ブランドの名前を生成するための指示は常に同じです。
- 製品変数は変更可能な入力変数として機能します。
これにより、さまざまなシナリオで使用できる柔軟なプロンプトを定義することができます。
では、プロンプトテンプレートが何であるかを理解したので…
どのようにして、簡単な理解しやすい語彙を使って任意のテキストを要約するプロンプトを定義するかを考えてみましょう。特定の指示と入力変数に応じて変わるテキスト変数を持つプロンプトテンプレートを定義できます。
# プロンプト文字列を作成します。
template = """
%INSTRUCTIONS:
以下のテキストを要約してください。
小学生でも理解できるように常に簡単な語彙を使用してください。
%TEXT:
{input_text}
"""
今、私たちが使用したいLLM(私の場合はOpenAIのGPT)とプロンプトテンプレートを定義します。
# デフォルトのモデルは既に'text-davinci-003'ですが、変更することもできます。
llm = OpenAI(temperature=0, model_name='text-davinci-003', openai_api_key=openai_api_key)
# 後で値を挿入できるLangChainのプロンプトテンプレートを作成します
prompt = PromptTemplate(
input_variables=["input_text"],
template=template,
)
では、このプロンプトテンプレートを試してみましょう。Wikipedia APIを使用して、USAの国の要約を取得し、非常に理解しやすいトーンでさらに要約します。
短いテキストを要約する方法を知ったので…少しスパイスを加えることはできますか?
もちろんできます…
1.2. 長いテキストの要約
長いテキストを扱う際の主な問題は、トークンがあまりにも多いため、プロンプトを介してAIモデルに直接伝えることができないことです。
では、トークンとは何でしょうか?
トークンは、モデルが入力を見る方法です – 個々の文字、単語、単語の一部、またはテキストのセグメントです。定義は非常に厳密ではなく、モデルによって異なります。例えば、OpenAIのGPT 1000トークンはおおよそ750単語です。
しかし、最も重要なことは、コストがトークンの数に依存すること、そして一度のプロンプトで送信できるトークンの数には制限があることです。より長いテキストを持つために、前と同じ例を使ってWikipediaのページ全体のテキストを使用します。
長さを確認すると… 約17Kのトークンです。
これはAPIに直接送信するにはかなり多いです。
では、今はどうするか?
まず、それを分割する必要があります。このプロセスはチャンキングまたはテキストの分割と呼ばれます。私は通常、コントロールしやすいRecursiveCharacterTextSplitterを使用しますが、試してみることができる他の方法もあります。
使った後では、単一のテキストではなく、GPTモデルの作業を容易にする23個の部分が得られます。
次に、連続的にLLMへの呼び出しを行うためのチェーンをロードする必要があります。
LangChainは、このような連鎖されたアプリケーションのためのChainインターフェースを提供します。チェーンは、他のチェーンを含めることができるコンポーネントへの呼び出しのシーケンスとして一般的に定義されます。基本的なインターフェースは以下の通りです。
class Chain(BaseModel, ABC):
"""すべてのチェーンが実装するための基本インターフェースです。"""
memory: BaseMemory
callbacks: Callbacks
def __call__(
self,
inputs: Any,
return_only_outputs: bool = False,
callbacks: Callbacks = None,
) -> Dict[str, Any]:
...
もしチェーンについてもっと学びたい場合は、LangChainのドキュメントを直接チェックしてください。
ですから、同じ手順を分割されたテキスト(docsと呼ばれる)で繰り返すと、LLMは簡単にページ全体の要約を生成できます。
便利ですね?
では、テキストの要約の方法がわかったので、2番目のユースケースに移りましょう!
2. 抽出
抽出は、テキストからデータを解析するプロセスです。これは、出力の解析と組み合わせてデータを構造化するために一般的に使用されます。
キーデータの抽出は、テキスト内の主要なキーワードを特定して解析するために非常に有用です。一般的な使用例は、文から構造化された行をデータベースに挿入したり、長いドキュメントから複数の行をデータベースに挿入したりすることです。
例えば、私たちがデジタルコマース会社を運営しており、ウェブサイト上に記載されているすべてのレビューを処理する必要があるとします。
それぞれを一つずつ読むこともできますが…それは狂気です。
それか、それぞれから必要な情報を抽出してデータを分析できます。
簡単そうですね。
まずは、以下のライブラリをインポートする必要があります。
# チャットメッセージを構築するためのヘルパー
from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
# チャットモデルを使用します(デフォルトはgpt-3.5-turbo)
from langchain.chat_models import ChatOpenAI
# 出力を解析して構造化データを取得するためのライブラリ
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)
2.1. 特定の単語の抽出
特定のテキスト内の単語を検索してみることができます。この場合、テキスト内に含まれるすべての果物を解析したいとします。以前と同様に、非常に簡単です。明確な指示を含むプロンプトを定義し、LLMに果物を特定し、その果物とそれに対応する色を含むJSONのような構造を返すように指示することができます。
そして、先ほど見たように、完璧に機能します!
では、これをもう少し遊んでみましょう。今回はうまくいったものの、より高度なユースケースでは長期的に信頼できるメソッドではありません。ここで、素晴らしいLangChainのコンセプトが登場します…
2.2. LangChainのレスポンススキーマの使用
LangChainのレスポンススキーマは、私たちのために2つの主な機能を果たします:
- 正式なフォーマットの指示を含むプロンプトを生成します。 これは素晴らしいことです。プロンプトエンジニアリングの面倒を見る必要がないため、LangChainにお任せします!
- LLMからの出力を読み取り、それを私にとって適切なPythonオブジェクトに変換します。 つまり、常に有用で、私のシステムが解析できる指定された構造を生成します。
そして、それを行うために、モデルから期待する応答を定義する必要があります。
では、ユーザーがコメントで述べている製品やブランドを特定したいとしましょう。以前のように単純なプロンプトで実行することもできますが、より信頼性の高い方法を生成するためにLangChainを利用することもできます。
まず、名前と説明で解析したいキーワードをすべて定義するresponse_schemaを定義する必要があります。
# 応答スキーマ
response_schemas = [
ResponseSchema(name="product", description="購入する商品の名前"),
ResponseSchema(name="brand", description= "商品のブランド")
]
そして、response_schemaを入力として受け取るoutput_parserオブジェクトを生成します。
# スキーマ内のLLM出力を検索し、それを返すパーサー
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
パーサーを定義した後、LangChainの.get_format_instructions()コマンドを使用して、命令の形式を生成し、ChatPromptTemplateを使用して最終的なプロンプトを定義します。そして、これで思いつくすべての入力クエリにこのoutput_parserオブジェクトを使用するだけで、自動的に所望のキーワードを含む出力が生成されます。
以下の例では、「ヨーグルトダノンがなくなった、ノーブランドのオートミルク、ヘウラが作ったビーガンバーガーが欲しい」という入力で、LLMから次の出力が得られます:
Jupyter Notebookのスクリーンショット。
メインのポイント
LangChainは、特に大量のテキストデータを扱う際に、開発者がLLMのフルポテンシャルを引き出すのを助ける汎用的なPythonライブラリです。テキストを扱う際の2つの主要なユースケースで優れた性能を発揮します。LLMにより、自然言語処理アプリケーションにおいてより洗練された人間らしいインタラクションを作成することができます。
- 要約: LangChainは情報を迅速かつ信頼性の高い方法で要約することができます。メッセージの最も重要な部分を保持しながら、テキストの量を減らすことができます。
- 抽出: このライブラリはテキストからデータを解析し、構造化された出力を可能にします。これにより、データベースにデータを挿入したり、抽出されたパラメータに基づいてAPI呼び出しを行ったりするなどのタスクが可能になります。
- LangChainはプロンプトエンジニアリングを容易にし、ChatGPTなどのAIモデルのパフォーマンスを最大化するための重要な技術です。プロンプトエンジニアリングにより、開発者は異なるユースケースで再利用できる標準化されたプロンプトを設計することができます。これにより、AIアプリケーションの柔軟性と効果を向上させることができます。
全体的に、LangChainはテキストデータを扱う際に特にAIの利用を向上させるための強力なツールとして機能し、プロンプトエンジニアリングはさまざまなアプリケーションでChatGPTなどのAIモデルを効果的に活用するための重要なスキルです。Josep Ferrerはバルセロナ出身の分析エンジニアです。物理工学を専攻し、人間の移動に応用されるデータサイエンスの分野で働いています。彼はデータサイエンスとテクノロジーに焦点を当てたパートタイムのコンテンツクリエイターです。LinkedIn、Twitter、またはVoAGIで彼と連絡を取ることができます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「LangChain、Activeloop、およびDeepInfraを使用したTwitterアルゴリズムのリバースエンジニアリングのためのプレーンな英語ガイド」
- 「ゴミを入れればゴミが出る:AIにおけるデータ品質の重要な役割」
- 「パート1:ステップバイステップでWindowsベースのシステム上でデータパイプラインを実行するための仮想環境の作成」
- ChatGPTにおけるCSVファイルのクエリパフォーマンス向上
- 「AWSを基にしたカスケーディングデータパイプラインの構築方法」
- 「Pythonのタイピングに関するデータサイエンティストのガイド:コードの明瞭さを向上させるための手引き」
- 「データサイエンスプロジェクトを変革する:YAMLファイルに変数を保存する利点を見つけよう」