
横浜国立大学理工学部建築都市環境系学科卒
一級鉄筋技能士
唎酒師
狂人のごとく特定の分野、中小企業を理解し、国の補助金を獲得します。最近は中小企業のM&Aにも挑戦中
Langchainを使用したLCEL(chainの概念)が一般的になってきました。
結論として、LangChainを使用すると、使わない場合と比較して、コードが簡潔になり、メッセージの管理やモデルの切り替えが容易になります。
この記事では、Langchainを使用した場合とLangchainを使用しない場合で比較してみようと思います。
目次
Langchainを使う場合と使わない場合でLangage modelを比べてみよう
まず、必要なライブラリをインストールします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import os from langchain_openai import ( AzureOpenAIEmbeddings, OpenAIEmbeddings, AzureChatOpenAI, ChatOpenAI ) from langchain_core.messages import ( HumanMessage, AIMessage, SystemMessage ) from dotenv import load_dotenv load_dotenv('../.env') |
環境変数を指定するenvファイルは別に設定します。
1 2 3 |
AZURE_OPENAI_API_KEY="" AZURE_OPENAI_ENDPOINT="" OPENAI_API_KEY="" |
Langchainを使わない場合のコード
LangChainを使用しない場合、OpenAI APIのリクエストを直接記述しなければならず、メッセージの管理や履歴の保存を自分で実装する必要があります。
そのため、コードの量が増え、管理が煩雑になりやすいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import os from openai import ( OpenAI, AzureOpenAI ) # Azureの場合 if os.getenv('AZURE_OPENAI_API_KEY') != "": client = AzureOpenAI(api_version="2024-06-01") model_name = "chat" # Azureでデプロイしたモデル名 # OpenAIの場合 elif os.getenv('OPENAI_API_KEY') != "": client = OpenAI() model_name = "gpt-4" # OpenAIのモデル名 else: print("APIKeyの設定を確認してください") |
ロールはsystem, user, assistantを指定します。
contentはユーザーが入力したテキストです。
1 2 3 4 5 6 7 8 9 10 11 12 |
response = client.chat.completions.create( model=model_name, # ロールはsystem, user, assistantを指定する。contentはユーザーが入力したテキストです。 messages=[ {"role": "system", "content": "あなたは役に立つアシスタントだ。"}, {"role": "user", "content": "Azure OpenAIはcustomer managed keysをサポートしていますか?"}, {"role": "assistant", "content": "はい、customer managed keysはAzure OpenAIでサポートされています。"}, {"role": "user", "content": "他のAzure AIサービスもこれをサポートしていますか?"} ] ) print(response.choices[0].message.content) |
Langchainを使う場合のコード
続いて、Langchainを使う場合のコードを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# LLMの定義 model = None # Azureの場合 if os.getenv('AZURE_OPENAI_API_KEY') != "": model = AzureChatOpenAI( azure_deployment="chat", openai_api_version="2024-06-01" ) # OpenAIの場合 elif os.getenv('OPENAI_API_KEY') != "": model = ChatOpenAI(model="gpt-4") else: print("APIKeyの設定を確認してください") |
LangChainでは、SystemMessage、HumanMessage、AIMessage の3種類のメッセージタイプを使用し、より自然に会話の流れを管理できます。
1 2 3 4 5 6 7 8 9 10 |
# langchainでは、SystemMessage, HumanMessage, AIMessageの3つのメッセージタイプを使用します。 messages = [ SystemMessage(content="あなたは役に立つアシスタントだ。"), HumanMessage(content="Azure OpenAIはcustomer managed keysをサポートしていますか?"), AIMessage(content="はい、customer managed keysはAzure OpenAIでサポートされています。"), HumanMessage(content="他のAzure AIサービスもこれをサポートしていますか?") ] result = model.invoke(messages) print(result) |
OutputParserを使って文字列で回答を得る
上記のコードで得られるのは、下記のようなdict型のものです。
1 2 3 4 5 6 7 8 9 |
content='はい、Azureの他のAIサービスもカスタマーマネージドキー(CMK)をサポートしています。 具体的には、Azure Machine Learning、Azure Cognitive Servicesなどのサービスが、ユーザーが管理する暗号化キーを使用してデータを保護する機能を提供しています。 これにより、データのセキュリティとプライバシーを強化することができます。具体的なサービスごとのサポート状況については、公式ドキュメントを確認することをお勧めします。 ' response_metadata={'token_usage': {'completion_tokens': 123, 'prompt_tokens': 74, 'total_tokens': 197, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_b705f0c291', 'prompt_filter_results': [{'prompt_index': 0, 'content_filter_results': {'hate': {'filtered': False, 'severity': 'safe'}, 'jailbreak': {'filtered': False, 'detected': False}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': False, 'severity': 'safe'}}}], 'finish_reason': 'stop', 'logprobs': None, 'content_filter_results': {'hate': {'filtered': False, 'severity': 'safe'}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': False, 'severity': 'safe'}}} id='run-c4e4817c-b509-4b0d-ba05-ecfd6db2bf56-0' usage_metadata={'input_tokens': 74, 'output_tokens': 123, 'total_tokens': 197} |
通常、dict型で取得できるものを、出力のフォーマットを指定して取得することもできます。
StrOutputParser を利用することで、出力を文字列として簡単に取得し、後処理の負担を軽減できます。
OutputParserを使用したコード
1 2 3 4 5 6 7 8 9 |
from langchain_core.output_parsers import StrOutputParser parser = StrOutputParser() parser.invoke(result) #回答 'はい、Azureの他のAIサービスもカスタマーマネージドキー(CMK)をサポートしています。 具体的には、Azure Machine Learning、Azure Cognitive Servicesなどのサービスが、ユーザーが管理する暗号化キーを使用してデータを保護する機能を提供しています。 これにより、データのセキュリティとプライバシーを強化することができます。具体的なサービスごとのサポート状況については、公式ドキュメントを確認することをお勧めします。' |
UDEMY講座大好評!
UDEMY講座ではLCEL(chainの概念)についても詳細に解説しています。
LangChainは、チャットボットの開発やFAQボット、カスタマーサポートの自動化に活用できます。
また、企業のナレッジベースをLLMと組み合わせ、ユーザーが簡単に情報を検索できるようにするドキュメント検索や要約機能にも適用できます。
さらに、AIによるデータ分析の前処理や結果の要約といった用途にも活用することが可能です。
さらに詳しい内容は、以下のUDEMY講座で学ぶことができますので、ぜひ参考にしてみてください!