AzureからGPTを使ってみる | LangSmith編(ログの収集:その2)
LangSmithを使うと、GPTとの会話ログを確認できることがわかりました。
今回は、Agentを使用した場合の会話履歴を確認してみようと思います。
Agentの使い方は、以前記事にしているので参考にしてみてください。
toolsにllm-mathを設定して、ログを確認してみようと思います。
#langchain-openai=0.1.15
#langchain=0.2.7
#langsmith=0.1.84
from langchain.agents import load_tools
from langchain.agents import initialize_agent, AgentType
from langchain_openai import AzureChatOpenAI
from dotenv import load_dotenv
import os
# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)
OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
os.environ["AZURE_OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["AZURE_OPENAI_ENDPOINT"] = OPENAI_API_BASE
LANGCHAIN_TRACING_V2=os.getenv('LANGCHAIN_TRACING_V2')
LANGCHAIN_ENDPOINT=os.getenv('LANGCHAIN_ENDPOINT')
LANGCHAIN_API_KEY=os.getenv('LANGCHAIN_API_KEY')
LANGCHAIN_PROJECT=os.getenv('LANGCHAIN_PROJEC')#任意のproject名を設定する
llm = AzureChatOpenAI(
api_version=OPENAI_API_VERSION,
azure_deployment="gpt4o" # azure_deployment = "deployment_name"
)
# 使用するツールをツール名の文字列のリストとして指定します
tool_names = ["llm-math"]
# ツールをロードします
tools = load_tools(tool_names, llm=llm)
# initialize the agent
agent_chain = initialize_agent(
tools,
llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
)
# run the agent
agent_chain.invoke(
"PON吉は、現在、20才です。去年のPON吉の年齢を2乗するといくつになりますか?",
)
> Entering new AgentExecutor chain...
Thought: To find PON吉's age last year, we subtract one year from the current age. Then, we need to square that age to get the final result.
Action:
```
{
"action": "Calculator",
"action_input": "19 * 19"
}
```
Observation: Answer: 361
Thought:Thought: I will confirm the calculation and provide the final answer.
Action:
```
{
"action": "Final Answer",
"action_input": "去年のPON吉の年齢を2乗すると361になります。"
}
```
> Finished chain.
{'input': 'PON吉は、現在、20才です。去年のPON吉の年齢を2乗するといくつになりますか?',
'output': '去年のPON吉の年齢を2乗すると361になります。'}
正解です。
LangSmith側を確認してみます。
それぞれのステップでどのような出力がされているかを、詳細に確認できます。
Agentに、TavilySerch APIを使ってwebから最新の情報に基づいて回答してもらいます。
#langchain-openai=0.1.15
#langchain=0.2.7
#tavily-python=0.3.3
from langchain_openai import AzureChatOpenAI
from langchain.retrievers.tavily_search_api import TavilySearchAPIRetriever
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
import os
# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)
OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
TAVILY_API_KEY = os.getenv('TAVILY_API_KEY')
os.environ["AZURE_OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["AZURE_OPENAI_ENDPOINT"] = OPENAI_API_BASE
LANGCHAIN_TRACING_V2=os.getenv('LANGCHAIN_TRACING_V2')
LANGCHAIN_ENDPOINT=os.getenv('LANGCHAIN_ENDPOINT')
LANGCHAIN_API_KEY=os.getenv('LANGCHAIN_API_KEY')
LANGCHAIN_PROJECT=os.getenv('LANGCHAIN_PROJEC')#任意のproject名を設定する
template = """You are a helpful assistant.
context:
{context}
user input:{question}
AI:
"""
prompt_template = PromptTemplate(
template=template,
input_variables=["context", "question"]
)
llm = AzureChatOpenAI(
api_version=OPENAI_API_VERSION,
azure_deployment="gpt4o",# azure_deployment = "deployment_name"
verbose=True
)
# Kで取得するドキュメントの数を指定できます。
retriever = TavilySearchAPIRetriever(k=3)
chain = (
RunnablePassthrough.assign(context=(lambda x: x["question"]) | retriever)
| prompt_template
| llm
| StrOutputParser()
)
chain.invoke({"question":"日本は、2024パリオリンピックで何個金メダルを取得しているか検索して教えてください。"})
'日本は、2024年のパリオリンピックで金メダルを20個獲得しています。\n\n参考文献:\n1. [メダル・入賞者一覧 - 日本オリンピック委員会(Joc)](https://www.joc.or.jp/games/olympic/paris/japan/winnerslist/index.html)\n2. [パリオリンピック 日本選手団が会見 詳細 選手の声 メダル45個 海外大会で過去最多 | Nhk](https://www3.nhk.or.jp/news/html/20240814/k10014548571000.html)\n3. [【全リスト】パリ五輪 日本のメダル獲得数は45個 金20・銀12・銅13 金メダル数20とメダル総数は海外開催大会で最多に](https://www.fnn.jp/articles/-/742295)'
LangSmithの中身はというと・・
もとになっているドキュメントを確認できました。
これをもとにプロンプトが作成されているがわかります。
You are a helpful assistant.
context:
[Document(metadata={'title': 'メダル・入賞者一覧 - 日本オリンピック委員会(Joc)', 'source': 'https://www.joc.or.jp/games/olympic/paris/japan/winnerslist/index.html', 'score': 0.9993687, 'images': []}, page_content='メダル・入賞者一覧,パリ2024,2020年7月24日に開幕する東京オリンピックの特集ページです。競技日程や実施種目などを紹介します。 ... 競技日程や実施種目などを紹介します。 日本オリンピック委員会(JOC)公式サイト ... パリ2024オリンピックTEAM JAPAN選手等 ...'), Document(metadata={'title': 'パリオリンピック 日本選手団が会見 詳細 選手の声 メダル45個 海外大会で過去最多 | Nhk | #パリオリンピック', 'source': 'https://www3.nhk.or.jp/news/html/20240814/k10014548571000.html', 'score': 0.99855626, 'images': []}, page_content='17日間にわたって行われたパリオリンピックで日本は金メダル20個、銀メダル12個、銅メダル13個のあわせて45個を獲得し、金メダルの数とメダル ...'), Document(metadata={'title': '【全リスト】パリ五輪 日本のメダル獲得数は45個 金20・銀12・銅13 金メダル数20とメダル総数は海外開催大会で最多に', 'source': 'https://www.fnn.jp/articles/-/742295', 'score': 0.9975751, 'images': []}, page_content='パリオリンピック(11日)パリオリンピックで日本選手団は全競技を終了し、メダルの獲得数は金20・銀12・銅13の総数45で確定した。日本勢の金メダル数とメダル総数は、海外開催のオリンピックでの歴代最多となった。〇金メダル 20【柔道】 7月27日:女子48kg級 角田夏実(つのだ・なつみ) 7月 ...')]
user input:日本は、2024パリオリンピックで何個金メダルを取得しているか検索して教えてください。
AI:
LangSmithを使うことで、回答が生成されるまでの流れを理解しやすくなりました。