Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LangChainキャッチアップ - LangChain Expression Languag...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
1.9k
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
520
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
4
26k
Devinで実践する!AIエージェントと協働する開発組織の作り方
masahiro_nishimi
6
4.5k
【AIエージェント開発】LLMアプリ開発の1stステップと論文キャッチアップ - 論文を活用したAIエージェント開発の始め方
masahiro_nishimi
6
1k
日経電子版 x AIエージェントの可能性とAgentic RAGによって提案書生成を行う技術
masahiro_nishimi
2
1.7k
Azure OpenAI Service Dev Day / LLMでできる!使える!生成AIエージェント
masahiro_nishimi
4
3.8k
AIエージェントを現場に導入する目線とは
masahiro_nishimi
3
5.9k
AIエージェントが変えるソフトウェアのパラダイム
masahiro_nishimi
2
2k
Other Decks in Programming
See All in Programming
その節約、円になってますか?
isamumumu
1
700
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
470
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
140
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.7k
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
310
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
数百円から始めるRuby電子工作
tarosay
0
140
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
860
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
730
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
130
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Building the Perfect Custom Keyboard
takai
2
830
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Navigating Team Friction
lara
192
16k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
The Spectacular Lies of Maps
axbom
PRO
1
890
Code Review Best Practice
trishagee
74
20k
Designing Experiences People Love
moore
143
24k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
360
Raft: Consensus for Rubyists
vanstee
141
7.6k
The untapped power of vector embeddings
frankvandijk
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が出力されており、 パースにも成功していることがわかる。