Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
LangChainキャッチアップ - LangChain Expression Languag...
Search
Masahiro Nishimi
January 10, 2024
Programming
12k
12
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LangChainキャッチアップ - LangChain Expression Languageを完全に理解する
第16回 LangChainもくもく会
https://langchain-jp.connpass.com/event/302663/
Masahiro Nishimi
January 10, 2024
More Decks by Masahiro Nishimi
See All by Masahiro Nishimi
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
7
2k
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
550
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
4
26k
Devinで実践する!AIエージェントと協働する開発組織の作り方
masahiro_nishimi
6
4.5k
【AIエージェント開発】LLMアプリ開発の1stステップと論文キャッチアップ - 論文を活用したAIエージェント開発の始め方
masahiro_nishimi
6
1.1k
日経電子版 x AIエージェントの可能性とAgentic RAGによって提案書生成を行う技術
masahiro_nishimi
2
1.8k
Azure OpenAI Service Dev Day / LLMでできる!使える!生成AIエージェント
masahiro_nishimi
4
3.8k
AIエージェントを現場に導入する目線とは
masahiro_nishimi
3
6k
AIエージェントが変えるソフトウェアのパラダイム
masahiro_nishimi
2
2k
Other Decks in Programming
See All in Programming
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
残高管理から台帳サービスへの進化
artoy
0
160
R8 の設定見直しでアプリサイズ削減
andpad
0
180
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
390
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
310
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
450
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
480
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
190
Jetpack Compose Mechanisms
skydoves
2
500
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
460
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
350
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Statistics for Hackers
jakevdp
799
230k
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Scaling GitHub
holman
464
140k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How to make the Groovebox
asonas
2
2.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
The Curious Case for Waylosing
cassininazir
1
550
Being A Developer After 40
akosma
91
590k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Transcript
LangChainキャッチアップ LangChain Expression Languageを完全に理解する @mah_lab / Masahiro Nishimi 2024/01/10
LangChain v0.1へのアップデート(★1/6リリース) インテグレーション系の コンポーネント (様々なデータフォーマッ トからのデータ取込など) LCELとLangChainのコア となる抽象化(Language Model、Document Loader、Embedding
Model、Retrieverなど) より高レベルな実装(特定 目的のためのチェーンや エージェント) FastAPIをラップして LangChainオブジェクトの エンドポイントを配備 LLMアプリデバッグのため の運用ツール LangChain、LangChain-Community、LangChain-Coreの3つの ライブラリにLangChainが分割されたのがv0.1の大きな特徴 LangChainやLangChain-Communityの機能実装を進めるため に、LLMアプリケーション実装の共通プロトコルの実装として LangChain-Coreが整備されていく。 その共通プロトコルとして大きな役割を果たすのがLangChain Expression Language(以下LCEL)。LangChainの理解、なら びにLLMアプリケーション開発に必要な抽象化を学ぶ手段とし て、LCELを学ぶ価値が出てくる。 また、LangSmithをフル活用して開発とデバッグを回していき たいときにも、LangChainと言うか、LCELを活用してコードを 書いていくことになるだろう。
ChatModelのインポート元が変更に 例えばChatOpenAIクラスであれば、これまで langchain.chat_models.openai もしくは langchain_community.chat_models.openai から 読み込んでいたと思うが、参照元が langchain_openai.chat_models など、モデル毎に別パッケージを読み込む形に変更になっている。
LangChain Expression Languageを完全に理解した概念図 Runnable Runnable Runnable Runnable Chain 入力 出力
中間データ 中間データ 中間データ RunnableMap Prompt ChatModel OutputParser 中間データ 中間データ 中間データ LCELとはRunnableプロトコルを実装したクラスのインスタンスをパイプで繋ぎ合わせてコンポーネント化するための仕組みである
Runnableプロトコルのインターフェース 同期 stream レスポンスをチャンク毎に出力 for s in chain.stream({"topic": "bears"}): print(s.content,
end="", flush=True) invoke レスポンス全体を出力 chain.invoke({"topic": "bears"}) #=> AIMessage(content="...") batch 複数インプットを一括実行 chain.batch([{"topic": "bears"}, {"topic": "cats"}]) #=> [AIMessage(content="..."), AIMessage(content="...")] 非同期 astream 非同期でチャンクを出力 async for s in chain.astream({"topic": "bears"}): print(s.content, end="", flush=True) ainvoke 非同期でレスポンス全体を出力 await chain.ainvoke({"topic": "bears"}) abatch 非同期で複数インプットを一括実行 await chain.abatch([{"topic": "bears"}, {"topic": "cats"}]) astream_log 最終的なレスポンスに加え、中間ステップも チャンク毎に出力する async for chunk in retrieval_chain.astream_log( "where did harrison work?", include_names=["Docs"], diff=False ): print("-" * 70) print(chunk) Runnableプロトコルを実装したクラスは以下のメソッドを呼び出すことができる
LCELウォークスルー Runnableを実装していないクラスのインスタンスはinvokeできない ChatPromptTemplateはRunnableを実装しているのでinvokeを実行できる ChatPromptTemplateはRunnableを実装しているのでinvokeを実行できる RunnablePassthroughで入力値をcontext変数に割り当てている ChatOpenAIはRunnableを実装しているのでinvokeを実行できる StrOutputParserはRunnableを実装しているのでinvokeを実行できる どのタイミングでもinvokeを呼べることが 分かっているとデバッグのときに役に立つ
RunnableLambda Runnableを実装しているクラスのインスタンスで あれば何でもパイプで繋げることができるので、 RunnableLambdaを利用して例のようなコードを書 くことができる。 (意味はないけど) LCELの理解のためには逆にLLMから離れたコード を書いてみると良い場合もある。
RunnableParallel / RunnablePassthrough
RunnableBranch
Runnableプロトコルのインプット/アウトプット形式 コンポーネントに応じてインプットとアウトプットの形式のペアが異なる コンポーネント インプット形式 アウトプット形式 Prompt 辞書型 PromptValue ChatModel 文字列、ChatMessageのリスト
かPromptValue ChatMessage LLM 文字列、ChatMessageのリスト かPromptValue 文字列 OutputParser LLMかChatModelのアウトプット パーサー毎に異なる Retriever 文字列 Documentのリスト Tool 文字列、辞書型、またはツール 毎の仕様 ツール毎に異なる 代表的なパーサー 説明 StrOutputParser 文字列に変換する CommaSeparatedListO utputParser カンマ区切りの文字列を配列に変換 JsonOutputParser JSON型の文字列を辞書型に変換 (Pydanticモデルを指定して、JSONの 型を指定することもできる) PydanticParser Pydanticモデルを指定し値を割り当てる OutputFixingParser ラップしたパーサーでエラーが発生した 場合、エラー情報を渡してLLMにリトラ イさせることができる RetryWithErrorOutpu tParser ラップしたパーサーでエラーが発生した 場合、元の同じ入力を渡してLLMにリト ライさせることができる ※ LCELのチェインの過程で現在どんな型になっているかが分かっていないと 予期せぬ不具合が埋め込まれてしまうことがある。注意する必要あり。
JsonOutputParserを利用した例 モデルがJSON文字列を返してくれないのでパー サーでエラーになっている。 単にパーサーだけJsonOutputParserを指定しても 良い感じにJSONにしてくれるわけではない。 JSONにするようプロンプトに含める必要がある。
JsonOutputParserを利用した例 JsonOutputParserにPydanticモデルを指定し、所定の形でJSON化するよう指 定している。 JsonOutputParserを指定するだけでなく、get_format_instructions()メソッド で得られるプロンプトを、指定するプロンプトに含めておく必要がある。 ちなみにここでlambdaを使用しているのは、辞書型のオブジェクトをチェイ ンに含める場合、各キーの値はRunnableである必要があるため。 プロンプトを確認すると、所定の形のJSONにするための指示が含まれている ことがわかる。
JsonOutputParserを利用した例 最終的に無事指定したJSONが出力されており、 パースにも成功していることがわかる。