はじめに
『かがみの孤城』円盤発売まであと3️⃣日、今日はアキちゃん!
アキちゃんのパラレルワールドでは、6/25は火曜日1。nikkieです。
ChatGPTをはじめとするLLMsがトレンドですね2。
そんな状況の中で、気になっていたけれどずっと触れていないライブラリLangChainがありました。
最近の休日は「平日にできないことをやる」がテーマになっており3、その一環で今回はLangChainの情報収集をしました。
目次
- はじめに
- 目次
- 2023/04/20開催 プロンプトエンジニアリングから始めるLangChain入門
- 感想
- メモ:LangChain 6つのコンポーネントを押さえる
- 終わりに
- P.S. StudyCoさんの次回は6/29「LangChainソースコードリーディング」
2023/04/20開催 プロンプトエンジニアリングから始めるLangChain入門
StudyCoさんによる勉強会シリーズの1つ!4
定期的に開催、かつ、毎回トレンドを押さえた題材で、たいへん助かっています。
資料やアーカイブ公開もありがたく、積ん読たくさん🙌
今回は、LLMを使ったアプリケーション開発にとっても役立つLangChainに入門する回でした。
そんな中、LLMを使ったアプリケーションを開発するためのツールとして、「LangChain」が注目を集めています。
LangChainをキャッチアップするには、LLMに狙い通りの動きをさせるために内部で使われている「プロンプトエンジニアリング」から学ぶとスムーズです。
そこでこの勉強会では、プロンプトエンジニアリングから始めてLangChainに入門していきます。
アーカイブ
発表資料
ソースコード
簡単なコード例でのデモを交えながらの発表でした(簡単なコードで済むようにLangChainがめっちゃ頑張ってくれています)。
コードも示していただいたことで、LangChainのイメージは結構つかめました。
感想
これまでOpenAIのAPIを直接叩いて、LLMを使ったアプリケーションを趣味レベルで開発していた身5からすると、LangChainが開発の中でどう使えそうか、どのあたりが楽になりそうかが結構イメージできました。
プロンプトエンジニアリングも経験がある6ので、LangChainがどのようにラップしてくれているか(=プロンプトエンジニアリングをサポートしてくれているか)が分かった気がします。
コードは手元で動かせていないので、時間を見つけて試していこうと思います。
説明を分かりやすくするためにモデルはtext-davinci-003
指定7だと思うのですが、gpt-3.5-turbo
に変えると結果がどう変わるのか、そしてコードをどう書き換えるかが気になるところです。
LangChainのバージョンは発表時点ではv0.0.144ですが、リポジトリを覗いたら最新はv0.0.2148。
手を動かしたら体感すると思うんですが、どれくらい破壊的変更入ってるんだろう、ワクワク
メモ:LangChain 6つのコンポーネントを押さえる
早速破壊的変更入ってない?👀
- Modelsに変えてModel I/O👀
- Data connectionってやつがあるぞ!
- あとCallbacksもある!
Models
機械学習モデルをLangChainのインターフェースにラップ!
https://github.com/os1ma/learning-langchain/blob/051bb1ad461f475840b68a7ab084e9b0be973ab0/learning_langchain/1.models.py
llm("プロンプト")
と__call__
でcompletionをさせています。
Prompts
(紹介いただいたPrompt Templatesの範囲では)文字列操作という理解です。
プロンプトをテンプレート化して、動的に生成できるようにする
https://github.com/os1ma/learning-langchain/blob/051bb1ad461f475840b68a7ab084e9b0be973ab0/learning_langchain/2.prompts.py
prompt.format(command="echo")
でテンプレート内のcommandをechoで埋めています。
Chains
モジュールを連結!
6つのコンポーネントをChainでつなげる(レゴブロックのイメージ)。
さらにChainどうしも(再帰的に)つなげられる!(レゴブロックで複雑な作品が作れるように!)9
これは設計としてもうまいと思います。
紹介いただいた例は2つ
- ModelとPromptをChainでつなげる
- https://github.com/os1ma/learning-langchain/blob/051bb1ad461f475840b68a7ab084e9b0be973ab0/learning_langchain/3.chain.py
LLMChain(llm=llm, prompt=prompt)
- このChainはrunメソッドで実行
- 2つのLLMChainをつなげる!
- https://github.com/os1ma/learning-langchain/blob/051bb1ad461f475840b68a7ab084e9b0be973ab0/learning_langchain/3.chain2.py
SimpleSequentialChain(chains=[cot_chain, summarize_chain])
- (履歴保存するわけでなく)2回LLMを呼び出して、ステップバイステップで考えた結果を要約して出力しています
このあたりlangchain.verbose = True
で何をやっているかが見えるというのはブラックボックスすぎなくていいなと思いました。
Indexes
私がLangChainで唯一知っていたのがこの部分!10
LLMが知識を持たない領域であっても、手元の文書の中から関連するものを取り出し、プロンプトに文脈として加えて送ることで回答できるようにするやつですね。
示されたソースコードは13行!
https://github.com/os1ma/learning-langchain/blob/051bb1ad461f475840b68a7ab084e9b0be973ab0/learning_langchain/4.indexes.py
これはガッツリ手を動かしたいですね。
VectorstoreIndexCreator
はどういう動きをしている?- 特に、どうやってEmbeddingsを得ている?
- スクリプトを動かすたびに、Vector Storeのインデックスも作られそうですが、手元の文書が変わらない限りはVector Storeは毎回更新しなくてもいいという理解で合っているかな
Memory
Chatbotのようなユースケースで会話履歴を覚えさせるためのコンポーネント。
まさに記憶!
ConversationChain
にModel(LLM)とMemory(ConversationBufferMemory
)を渡す実装ConversationChain
はpredict
メソッドなのか11
Agents
プロンプトとして与えた課題をLLMがツールを使って解くという世界観!
LLMが「ツールを使う」というアクションをすることを可能にします。
先日公開された「Function calling12」と同様という印象です。
例は「現在のディレクトリにあるファイルの一覧を教えてください。」にLLMが回答するというもの。
ツールを使うことで実際のファイル一覧をLLMが返している!
https://github.com/os1ma/learning-langchain/blob/051bb1ad461f475840b68a7ab084e9b0be973ab0/learning_langchain/6.agents.py
load_tools(["terminal"], llm=llm)
し、ツールも含めてinitialize_agent
。
agentのrun
メソッドを実行しています。
- LLMへの最初のプロンプトでは使用できるツールの情報もLLMに伝える
- terminalはコマンドを実行できるツール
- LLMのレスポンス「lsコマンド実行したい」
- ここFunction callingですよね? ね!
- LangChainのAgentsが
ls
を実行する ls
実行結果をプロンプトに加えてLLMを再度呼び出す- LLMがFinal Answerを埋めたレスポンスを返す
- LangChain側でFinal Answerだけを抜き出して、ユーザに示すそうです
ツールには人間を使うツールもあるとのことで、私としては「ですよね〜」という感想でした(Function callingのエントリの中で私も言及しています)
終わりに
text-davinci-003
(Completions API)をLangChain v0.0.144から利用してアプリケーション開発をするイメージはかなりはっきりと持てました!
v0.0.144時点での6つのコンポーネントの概念も結構つかめ、Indexes=LangChainだと思っていましたが、LLMを使ったアプリ開発をサポートしてくれるライブラリなんだな〜と認識しました。
ソースコードにはプロンプトが含まれるので、プロンプトエンジニアリングを学ぶ上でもLangChainは有用だと思います。
勉強会開催、また、資料公開、ありがとうございました。
余談ですが、この週末「Azure OpenAI Service On Your Data」をまず触ってみようとしたんですよ。
LangChain(のIndexes)を使えば実現できそうですが、コード不要でできるならゲームチェンジャーだなーと思い、興味を持ちました。
ですが、On Your Dataは個人利用は厳しそうと分かり、すごすごと引き下がります(申請フォームを見たところ、Azureのenterpriseアカウントが必須そうでした)。
で、ずっと気になっていたLangChainの情報収集に至ります。
少しは理解できたので、On Your Data相当のアプリケーションを自力で作ってみるということに興味が出てきています。
P.S. StudyCoさんの次回は6/29「LangChainソースコードリーディング」
GPTを使ったアプリケーション開発では、OpenAIの「Chat API」を使うのが定番ですが、実はLangChainでOpenAIのChat APIを「ちゃんと」使うには、LangChainのソースコードを読み解くことが役立ちます。
そこでこの勉強会では、LangChainでOpenAI Chat APIを「ちゃんと」使うことをテーマとして、ソースコードリーディングを実施していきます。
LangChainの基礎知識については、4/20に開催した勉強会「プロンプトエンジニアリングから始めるLangChain入門」の資料/アーカイブ動画を事前にご覧いただくのがおすすめです。
アーカイブを見たのは6/29の準備でもありました〜