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
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
260
Are APIs Still Relevant in the AI Era?
soyuka
0
400
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.1k
Agents on Rails - Rails at Scale 2026
irinanazarova
0
310
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
300
iOSDC2026登壇資料.pdf
riofujimon
0
200
Simple Storage Service(S3) is not simple
iwatsukayura
0
120
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.6k
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
470
Java 27新機能 / Java 27 new features
kishida
2
190
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
560
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
510
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
First, design no harm
axbom
PRO
2
1.3k
Odyssey Design
rkendrick25
PRO
2
850
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
The Curious Case for Waylosing
cassininazir
1
550
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Music & Morning Musume
bryan
48
7.4k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
520
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
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が出力されており、 パースにも成功していることがわかる。