2️⃣

LangChain Academy: module-2(stateとmemory編)

に公開

LangCainAcademy

今回はmodule-2(stateとmemory編)です

これまでの内容は以下の記事を参考にしてください。

module-2

https://github.com/shirochan/langchain-academy/tree/main/module-2

全文英語 + 説明動画も英語のLnagChain Academyですので、ノートブックの英文を日本語訳しそれを見ながら学習をしていくことにしました。
LLMに翻訳してもらいましたので少し読みにくい文があるかもしれませんがご了承ください。

State Schema

https://github.com/shirochan/langchain-academy/blob/main/module-2/state-schema.md

state schema(状態スキーマ)を定義する方法の紹介
langchainというよりはpythonの型定義の機能の紹介がメイン
TypeDictDataclassがあるがでもこれらは型のヒントを出すだけで強制はされません。
なので想定外の型が定義されてもエラーが出たりはしません。
Pydanticを利用すれば強制することが可能です。
エラーになります。

State Reducers

https://github.com/shirochan/langchain-academy/blob/main/module-2/state-reducers.md

state schemaの特定のキー/チャネルにおける状態の更新方法を指定するreducerについての紹介

ノードが分岐するケースではノードが並列に実行されエラーになります。

InvalidUpdateError occurred: At key 'foo': Can receive only one value per step. Use an Annotated key to handle multiple values.
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/INVALID_CONCURRENT_GRAPH_UPDATE

Annotated型のreducer関数を使用することでこの問題が解決します
各ノードから返された値を上書きするのではなく追加すればいいよ

class State(TypedDict):
    foo: Annotated[list[int], add]

IDを指定したら上書きもできるよ

Multiple Schemas

https://github.com/shirochan/langchain-academy/blob/main/module-2/multiple-schemas.md

ノード間におけるprivate stateの利用方法

明示的に入出力のschemaを定義する方法
以下のように指定するとoutputスキーマが出力をanswerキーのみに制限していることがわかります。

class InputState(TypedDict):
    question: str

class OutputState(TypedDict):
    answer: str

class OverallState(TypedDict):
    question: str
    answer: str
    notes: str


Filtering and trimming messages

https://github.com/shirochan/langchain-academy/blob/main/module-2/trim-filter-messages.md

これまでの学習内容の復習
stateの更新や追加フィルターなどの話
会話が長く続いた場合にtokenの使用率とレイテンシーが高くなるのでその対応方法について
ここからようやく少しだけlangchainの話になってきます。

messages.append(output['messages'][-1])
messages.append(HumanMessage("家族でゆっくりと過ごすにはどれがいちばんよいでしょうか?", name="Lance"))

全文はこちら
================================== Ai Message ==================================
Name: Bot

おげんきですか?
================================ Human Message =================================
Name: Lance

はい!元気です!
================================== Ai Message ==================================
Name: Bot

クリスマスの予定はなにかありますか?
================================ Human Message =================================
Name: Lance

はい、クリスマスは家族で出かけようと考えています。どこか良い場所はありますか?
================================== Ai Message ==================================

クリスマスに家族で楽しむための素敵な場所はいくつかありますね。日本国内で考えると、以下のような場所がおすすめです:

1. **東京ディズニーリゾート**: クリスマスシーズンには特別な装飾やショーが行われ、子供から大人まで楽しめます。

2. **ユニバーサル・スタジオ・ジャパン**: 大阪にあるテーマパークで、クリスマスには特別なイベントやパレードが開催されます。

3. **箱根**: 温泉や美しい自然を楽しみながら、クリスマスをゆったりと過ごすことができます。クリスマスディナーを提供するホテルも多いです。

4. **軽井沢**: 冬の軽井沢はロマンチックな雰囲気があり、ショッピングやスケート、温泉など多彩なアクティビティがあります。

5. **札幌**: 冬の札幌は雪景色が美しく、クリスマスマーケットやイルミネーションも楽しめます。

6. **神戸ルミナリエ**: 神戸で開催される光のイベントで、美しいイルミネーションが街を彩ります。

これらの場所はそれぞれ異なる魅力があるので、家族の好みに合わせて選んでみてください。また、クリスマスシーズンは混雑することが多いので、早めの計画をおすすめします。
================================ Human Message =================================
Name: Lance

家族でゆっくりと過ごすにはどれがいちばんよいでしょうか?
================================== Ai Message ==================================

家族でゆっくりと過ごすためには、以下のような選択肢があります。家族の好みや年齢層に合わせて選んでみてください。

1. **自然の中でのピクニック**: 公園や山、湖のほとりなどでピクニックを楽しむのはリラックスできます。自然の中でのんびり過ごすことで、リフレッシュできるでしょう。

2. **温泉旅行**: 温泉地に行って、温泉に浸かりながらリラックスするのも良い選択です。美味しい食事や地元の観光も楽しめます。

3. **家での映画鑑賞やゲーム**: 家族みんなで映画を見たり、ボードゲームやテレビゲームを楽しんだりするのもよいでしょう。家で過ごすことでリラックスできます。

4. **キャンプ**: 自然の中でキャンプをすることで、普段とは違った体験ができ、家族の絆を深めることができます。

5. **料理やお菓子作り**: 家族で一緒に料理やお菓子作りをするのも楽しいアクティビティです。作ったものを一緒に食べる時間も楽しめます。

6. **アートやクラフトの時間**: 絵を描いたり、手作りのクラフトを作ったりするのも、クリエイティブでリラックスできる時間になります。

どの選択肢も、家族全員が楽しめるようにプランを立てると、素敵な時間を過ごせるでしょう。

langsmithでみてみるとしっかりとLLMに投げているinputが直近の1つだけになっています。

trim_messagesを利用しても同様のことができます。

https://api.python.langchain.com/en/latest/core/messages/langchain_core.messages.utils.trim_messages.html

Chatbot with message summarization

https://github.com/shirochan/langchain-academy/blob/main/module-2/chatbot-summarization.md

メッセージのトリミングやフィルタリングではなく、LLMを使って会話の継続的な要約を生成する方法

# If there are more than six messages, then we summarize the conversation
if len(messages) > 6:
    return "summarize_conversation"


messageの長さが6未満なのでサマリは作られていません。

会話を追加しmessagesの長さが6を超えるとサマリが作成されました

Chatbot with message summarization & external DB memory

https://github.com/shirochan/langchain-academy/blob/main/module-2/chatbot-external-memory.md
外部データベースをサポートするより高度なチェックポインターの紹介
sqliteの使い方とか設定の方法とかの説明
簡単に書くとこんな感じで利用可能

from langgraph.checkpoint.sqlite import SqliteSaver
db_path = "state_db/example.db"
conn = sqlite3.connect(db_path, check_same_thread=False)
memory = SqliteSaver(conn)

まとめ

全体的にlangchainのはなしというよりもpythonやsqliteの基礎のお話がメインだった。
すでにそのあたりの知見が深い人であればサラッと学習を終えることができるだろう。
一方でそのあたりの知識に触れるのが初見の場合は良い機会となるとおもう。
次の章のタイトルは UX and Human-in-the-Loop となっておりUXとHITL(ヒューマン・インザループ)の話のようだ。
HITLとは人工知能などによって自動化・自律化が進んだ機械やシステムにおいて、一部の判断や制御にあえて人間を介在させることである

Discussion