以下の内容はhttps://nikkie-ftnext.hatenablog.com/entry/practice-call-gpt-and-gemini-web-apis-with-langchainより取得しました。


LangChainを使って、同じプロンプトを複数のLLMのWeb APIに送る(GPTとGeminiを例に)

はじめに

Sky Survive🎵 nikkieです。

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に送る

動作環境

  • Python 3.11.8
  • langchain-openai 0.2.3
  • langchain-google-genai 2.0.1

ライブラリのバージョン(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_KEY
  • GOOGLE_API_KEY2

OpenAIのGPTに送る

python.langchain.com

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に送る

python.langchain.com

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


  1. 宿題なのですが、OpenAI互換のAPIを用意できるローカルLLMにも拡張できるのでは、と期待しています
  2. LangChainのドキュメントに取得方法があります。私は過去の記事で作ったと思しきキーを使いました
  3. https://github.com/kenoharada/language-model-from-scratch/blob/44342b1c896013f5654d87f91bbf965d96d1b97e/notebooks/Ja/Prompting.ipynb で使っています



以上の内容はhttps://nikkie-ftnext.hatenablog.com/entry/practice-call-gpt-and-gemini-web-apis-with-langchainより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14