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.8k
AIエージェントを現場に導入する目線とは
masahiro_nishimi
3
5.8k
AIエージェントが変えるソフトウェアのパラダイム
masahiro_nishimi
2
1.9k
Other Decks in Programming
See All in Programming
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.1k
自作OSでスライド発表する
uyuki234
1
3.8k
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.7k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
110
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
330
yield再入門 #phpcon
o0h
PRO
0
450
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.5k
初めてのKubernetes 本番運用でハマった話
oku053
0
130
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
5分で問診!Composer セキュリティ健康診断
codmoninc
0
280
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
390
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
How to build a perfect <img>
jonoalderson
1
5.8k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
230
Marketing to machines
jonoalderson
1
5.6k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
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が出力されており、 パースにも成功していることがわかる。