⛓️

LangChainをGoogle Colabで使ってみる(Model I/Oモジュール)

2023/08/23に公開

LLMを利用したアプリ開発におけるフレームワーク「LangChain」について調べてみました。

LangChainとは?

公式DocsのイントロダクションをDeepLに突っ込みました。

LangChainは言語モデルを利用したアプリケーション開発のためのフレームワークです。以下のようなアプリケーションを可能にします:

・データアウェア: 言語モデルを他のデータソースに接続する。
・エージェント型:言語モデルが環境と相互作用することを可能にします。

LangChainの主な価値は以下の通りです:

1.コンポーネント : 言語モデルを扱うための抽象化と、各抽象化のための実装のコレクション。コンポーネントはモジュール化されており、LangChainフレームワークの他の部分を使うかどうかに関わらず、簡単に使うことができます。
2.既製のチェーン :特定の高レベルタスクを達成するためのコンポーネントの構造化されたアセンブリ。

既製のチェーンで簡単に始めることができます。より複雑なアプリケーションや微妙なユースケースの場合、コンポーネントを使えば、既存のチェーンのカスタマイズや新しいチェーンの構築が簡単にできます。

いくつかブログ記事も読んでみたところ、OpenAIや各種LLMを利用したアプリケーションを開発する際に、全てコーディングして実装するのではなく、LangChainのパッケージ化された機能を使うことでより短時間でシンプルに実装ができる 、というもののようです。

モジュールは、公式Docsのカテゴリでは以下に分類されています。

  • Model I/O
  • Retrieval
  • Chains
  • Memory
  • Agents
  • Callbacks

本日は「Model I/O」のPrompt Template, LLMsを利用していきたいと思います。

使ってみた

Google Colaboratoryで実装してみました。

準備(Colab利用向け)

OpenAI APIキーの設定をしておきます。
APIキーは.envファイルに保存し、Colabの「セッションストレージにアップロード」からアップロードしておきます。

.env
OPENAI_API_KEY="自身のOpenAI APIキー"
#Driveのマウント
from google.colab import drive
drive.mount('/content/drive')
#envファイル読み込み
!pip install python-dotenv==1.0.0
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())

実装

いよいよ実装していきます。LLMとChatモデルの2種類で回答を受け取っています。
なお、LLMとChatモデルの違いは以下となります。

  • LLM: テキスト文字列を入力として受け取り、テキスト文字列を返すモデル
  • チャットモデル: 言語モデルによってサポートされるが、入力としてチャット・メッセージのリストを受け取り、チャット・メッセージを返すモデル。

LLMによる応答

prompt = PromptTemplate(
    input_variables=["place", "activity"],
    template="北海道の {place} で、{activity} ためにはどうしたらよいですか?簡潔に教えてください。",
)
llm = OpenAI(temperature=0.4)
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run({
    'place': "帯広",
    'activity': "豚丼を食べる"
    }))

帯広には、豚丼を楽しめるレストランがたくさんあります。また、地元のスーパーや食料品店などで、豚丼の調理済み食品を購入することもできます。

上記の形で、「PromptTemplate」でプロンプトを定義し、OpenAIのLLMを呼び出しています。

Chatモデルによる応答

まずは、Prompt Templateを使わずにChatモデルによる応答を得てみます。

from langchain.chat_models import ChatOpenAI
from langchain.schema import (HumanMessage,SystemMessage)

chat = ChatOpenAI(temperature=0.5)

messages = [
    SystemMessage(content="あなたは医者です。"),
    HumanMessage(content="熱中症の対策について簡単に教えてください。"),
    ]

result = chat(messages)
print(result.content)

熱中症の対策には以下のことに注意する必要があります。

  1. 水分補給:熱中症の予防には適切な水分補給が重要です。こまめに水を飲むことで体温を下げ、脱水症状を防ぐことができます。
  2. 適切な服装:暑い環境では、通気性の良い服装を選びましょう。薄着で涼しい素材の服を着ることで、体温調節がしやすくなります。
  3. 適度な休憩:暑い環境での活動や運動は熱中症のリスクを高めます。適度な休憩をとり、体を休めることが大切です。
  4. 日陰での活動:直射日光を避け、日陰で過ごすことで体温上昇を防ぐことができます。特に昼間の熱い時間帯は、屋内や木陰などで過ごすようにしましょう。
  5. エアコンの使用:室内で過ごす場合は、エアコンを使って室温を適切に調整しましょう。室内の涼しい環境を保つことで、熱中症のリスクを軽減することができます。

熱中症の症状が現れた場合は、直ちに涼しい場所に移動し、水分補給を行い、医療機関を受診するようにしましょう。

messages内で、SystemMessageHumanMessageを定義します。

これをTemplateを利用して記載すると以下のようになります。

from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

chat = ChatOpenAI(temperature=0.5)

# SystemMessage 用のテンプレート
template="あなたは{role}です。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)

# HumanMessage 用のテンプレート
human_template="{text}について簡単に教えてください。"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

# Message のテンプレート
messages_template = [
    system_message_prompt, #SystemMessage用のテンプレート
    human_message_prompt  #HumanMessage用のテンプレート
]

# チャットプロンプト用のテンプレート
chat_prompt_template = ChatPromptTemplate.from_messages(messages_template)
chat_prompt = chat_prompt_template.format_prompt(role="医者", text="熱中症の対策").to_messages()

completion = chat(chat_prompt)
print(completion.content)

熱中症の対策には以下のポイントがあります:

  1. 水分補給を十分に行う:暑い日や運動をする際には、こまめに水分を摂ることが重要です。水やスポーツドリンクを飲み、脱水症状を防ぎましょう。
  2. 適切な服装をする:涼しい素材の服を着用し、薄着にすることで体温調節を助けます。また、帽子や日傘を使って直射日光を避けることも重要です。
  3. 適度な休息を取る:長時間の屋外活動や激しい運動は避け、定期的な休憩を取りましょう。涼しい場所で体を休めることで、体温上昇を防ぎます。
  4. 熱中症の症状に注意する:頭痛、めまい、吐き気、倦怠感などの症状が現れた場合は、すぐに涼しい場所に移動し休息を取りましょう。症状が重い場合は、医療機関を受診することも検討してください。
  5. 熱中症のリスクを高める要素に注意する:高齢者や乳幼児、慢性疾患を持つ人、薬物治療を受けている人などは、熱中症になりやすいため、特に注意が必要です。

以上が簡単な熱中症の対策です。暑い季節や運動の際にはこれらのポイントを守り、熱中症を予防しましょう。

先ほど直に書いていた内容を、変数として入力することができるようになります。


今回はModel I/Oのモジュールを使ってみました。
他のモジュールも今後動かしてみたいと思います。

参考記事

https://python.langchain.com/docs/get_started/introduction.html
https://laboratory.kazuuu.net/using-langchain-with-google-colab/
https://book.st-hakky.com/docs/introduction/
https://zenn.dev/umi_mori/books/prompt-engineer

GitHubで編集を提案

Discussion