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
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.8k
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
510
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
4
25k
Devinで実践する!AIエージェントと協働する開発組織の作り方
masahiro_nishimi
6
4.4k
【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.7k
AIエージェントを現場に導入する目線とは
masahiro_nishimi
3
5.8k
AIエージェントが変えるソフトウェアのパラダイム
masahiro_nishimi
2
1.9k
Other Decks in Programming
See All in Programming
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.7k
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
220
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
220
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.6k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
230
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
180
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
330
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
950
Oxlintのカスタムルールの現況
syumai
6
1.2k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.1k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
420
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
A Soul's Torment
seathinner
6
3k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Designing Powerful Visuals for Engaging Learning
tmiket
1
430
BBQ
matthewcrist
89
10k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Being A Developer After 40
akosma
91
590k
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が出力されており、 パースにも成功していることがわかる。