👌

Langchainのメジャーアップがされていて困った話

に公開

参考書(やさしく学ぶLLMエージェント オーム社)の通りコードを動かそうとしたら以下のエラーが表示される

調べてみると参考書が動かしていたlangchainが0.2.5あたりで最新のlangchainは1.0系となっておりメジャーアップデートがあった模様。
それに関係し構造が変わってたり機能自体がなくなっているらしい。
langchainの公式ドキュメントにはAIによるアシスタント機能がある。
今回はこれを使ってv1.0への移行を図る。

まずはツールを作成するところだ。
v1.0では直接ツールを作成する方が推奨されているらしくご丁寧にも
専用ページもあるのでそちらを採用する。
https://docs.langchain.com/oss/python/langchain/tools

https://docs.langchain.com/oss/python/integrations/tools/searchapi
python from langchain_core.tools import Toolとpython from langchain_core.tools import tool
Toolは既存関数を後からツール化し、@toolは関数定義時にツール化するという違い。今回は、コミュニティのSerpAPIWrapper関数を使用するのでクラスのToolを採用する。

AgentExecutorはどうやらv.1.0で削除され、直接create_react_agentが直接実行可能なエージェントを返すようになったみたいだ。しかしこのcreate_react_agentも名前が変わりpython from langchain.agents import create_agentが現在の正しいimportらしい

https://docs.langchain.com/oss/python/migrate/langchain-v1

agent = create_agent(
    model=model,
    tools=tools,
    system_prompt=system_prompt
)

ここではまだTemplateもメモリも使えてない。
dynamic_promptを使用すると会話の状態に基づいてプロンプトを動的に変更できるらしい。ただあまり古いコードに比べ大量の変更を必要としているし、ドキュメントが少ない。
ここでアシスタントに相談すると以下のような回答を得る。

dynamic_promptを使用せず、テンプレートを扱う場合は、
system_promptにTemplateを渡してあげましょう。
Formatを使用することでTemplateに値を代入し文字列としてagentに渡せます。

今回、動的なものはmemoryぐらいでTemplateは静的なものなのでこれを採用する。

system_prompt = template.format(
    verbose=True,
    handle_parsing_errors=True,
    input=query_ja,
    tool_names=", ".join([tool.name for tool in tools]),
    tools=tools_desc,
    chat_history=str(memory)
)
agent = create_agent(
    model=model,
    tools=tools,
    system_prompt=system_prompt
)

無事、memoryを参照しながらv.1.0でも動作するようになった。

余談
メジャーアプデした際は日本語の資料が乏しいため、非常に困難を極める。
先駆者がある程度調べてくれているが、それ以上に古い書き方が検索に乗ってしまうことが多々ある。また一般的なAI自身も古い情報と新しい情報を混濁してしまうので安易に信じることができない。一番は、公式ドキュメントが充実していることを願うばかりだ

参考書レポジトリ
https://github.com/elith-co-jp/book-llm-agent/

Discussion