はじめに
Sky Survive🎵 nikkieです。
LangChainでは初歩的なことだと思うのですが、ここ最近気になっていたことに解を得ました。
目次
- はじめに
- 目次
- 同じプロンプトを複数のLLMのAPIに送りたい
- みんなのPython勉強会#109 池内さんの発表より
- 素振り:同じプロンプトをGPTとGeminiに送る
- 同じプロンプトをGPTにもGeminiにも送る
- 終わりに
- P.S. LangChain以外の例
同じプロンプトを複数のLLMのAPIに送りたい
世はまさに大LLM時代。
OpenAI(GPT)、Google(Gemini)、Anthropic(Claude)などなど、クローズドな高性能LLMがWeb APIとして提供されています(この記事のスコープはクローズドなLLMのWeb APIです1)。
ひょんなことから私は思ったのです。
「同じプロンプトを複数のLLMのAPIに送るにはどうするんだろう」と。
複数のLLMの出力を比較したり、候補のLLMを簡単に増減させたり、使うLLMを簡単に切り替えたりしたいのですが、方法がパッと分かりませんでした。
「一つの方法としてLangChainを使うんだろうな〜」と思ったのですが、具体的なコードまではイメージできずという感じです。
みんなのPython勉強会#109 池内さんの発表より
ヒントを得たのが、先日のみんなのPython勉強会の池内さんの発表
みんなのPython勉強会#109 - connpass
LangChain、Dify、LiteLLM... 最新のAIツールは何を解決しようとしているのか - Python エンジニアが取り組むべき "越境" とは
LangChainを利用すると、異なるLLMであっても、統一的なインターフェースで扱えることが特徴です。
こちらを元に、LangChainを素振りしました。
素振り:同じプロンプトをGPTとGeminiに送る
動作環境
ライブラリのバージョン(
pip freeze)
annotated-types==0.7.0 anyio==4.6.2.post1 cachetools==5.5.0 certifi==2024.8.30 charset-normalizer==3.4.0 distro==1.9.0 google-ai-generativelanguage==0.6.10 google-api-core==2.21.0 google-api-python-client==2.149.0 google-auth==2.35.0 google-auth-httplib2==0.2.0 google-generativeai==0.8.3 googleapis-common-protos==1.65.0 grpcio==1.67.0 grpcio-status==1.67.0 h11==0.14.0 httpcore==1.0.6 httplib2==0.22.0 httpx==0.27.2 idna==3.10 jiter==0.6.1 jsonpatch==1.33 jsonpointer==3.0.0 langchain-core==0.3.12 langchain-google-genai==2.0.1 langchain-openai==0.2.3 langsmith==0.1.136 openai==1.52.0 orjson==3.10.9 packaging==24.1 proto-plus==1.24.0 protobuf==5.28.2 pyasn1==0.6.1 pyasn1_modules==0.4.1 pydantic==2.9.2 pydantic_core==2.23.4 pyparsing==3.2.0 PyYAML==6.0.2 regex==2024.9.11 requests==2.32.3 requests-toolbelt==1.0.0 rsa==4.9 sniffio==1.3.1 tenacity==9.0.0 tiktoken==0.8.0 tqdm==4.66.5 typing_extensions==4.12.2 uritemplate==4.1.1 urllib3==2.2.3
2つの環境変数を設定しています。
OPENAI_API_KEYGOOGLE_API_KEY2
OpenAIのGPTに送る
from langchain_openai import ChatOpenAI messages = [ ("system", "ユーザーの入力する日本語のテキストを英語に翻訳してください"), ("human", "プロデューサーの同僚の皆さん、みりっほー! 仕掛け人モード にっPです"), ] gpt = ChatOpenAI(model="gpt-4o-mini", temperature=0) response = gpt.invoke(messages) print(response.content) # Hello, fellow producers! It's Nipp with the mastermind mode!
GoogleのGeminiに送る
from langchain_google_genai import ChatGoogleGenerativeAI messages = [ ("system", "ユーザーの入力する日本語のテキストを英語に翻訳してください"), ("human", "プロデューサーの同僚の皆さん、みりっほー! 仕掛け人モード にっPです"), ] gemini = ChatGoogleGenerativeAI(model="gemini-1.5-pro", temperature=0) response = gemini.invoke(messages) print(response.content) # Hey fellow producers, Milli-ho! It's your scheming producer, Nip! #
インスタンス化してinvoke()するだけでいいのか〜〜!!
LangChainってLCELから最初の学習コストがさらに高くなった感があるのですが、ドキュメントの例によるとタプルの配列で済むの、めっちゃ手軽〜!!
同じプロンプトをGPTにもGeminiにも送る
インターフェースが揃っているの、ありがたや〜🙏
---------- gpt-4o-mini ---------- Hello, fellow producers! It's Nikkun in Schemer Mode! ---------- models/gemini-1.5-pro ---------- Hey fellow producers, Milli-ho! It's your scheming producer, Ni-P!
終わりに
同じプロンプトを複数のLLMのWeb APIに送る方法として、LangChainを使う方法を知りました。
必要なLangChainのパッケージをインストールして、LLMをインスタンス化してinvoke()するだけ!
1つのプロンプトは要素2のタプル ("ロール", "プロンプト本文") で表し、リストに並べます。
簡単に提供してくれるという点でLangChainには感謝です。
なお、今回はプロンプトが単純な例です。
複数のLLMの呼び出しや、RAGといったことは今後の探究の地となります。
P.S. LangChain以外の例
私が知らないだけでたくさんあると思います。
先日の松尾研の勉強会で見かけた自作例3
松尾研 LLM コミュニティ "Paper & Hacks Vol.21" - connpass
- 宿題なのですが、OpenAI互換のAPIを用意できるローカルLLMにも拡張できるのでは、と期待しています ↩
- LangChainのドキュメントに取得方法があります。私は過去の記事で作ったと思しきキーを使いました ↩
- https://github.com/kenoharada/language-model-from-scratch/blob/44342b1c896013f5654d87f91bbf965d96d1b97e/notebooks/Ja/Prompting.ipynb で使っています↩