その1からの続き
前回その1で目標を設定したところで、実際にはagentにやらせるものがどう動くかを理解する必要があるかと思うので、
その前段としていくつかAIを使ったアプリを作っていこうと思います。
※その1
https://qiita.com/kousasak/items/8604a6b082514f3299fe
1.agentを作る前にAIを使ったアプリを作ってみる
そもそもLLMを使ったアプリを作れない事にはagentを使う事にはならないと思うので、一旦agentでも使えるだろうアプリとしてチャットアプリを作ります。
2.チャットアプリの概要
LLMに質問を渡してそれの回答を表示するという画面にします。
そこで利用したのがstreamlitで、streamlitで画面周りを作っていきます。
画面サンプル

3.ソース
COMPARTMENT_IDなどの変数は先にOS側で変数にセットしていますので、各々の環境で適宜変更してください。
import os
import time
import streamlit as st
from dotenv import load_dotenv
import oci
import json
from oci.config import from_file
from oci.generative_ai import GenerativeAiClient
from oci.generative_ai_inference import GenerativeAiInferenceClient
from oci.generative_ai_inference.models import (
OnDemandServingMode,
GenerateTextDetails,
CohereLlmInferenceRequest,
CohereMessage
)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
load_dotenv()
config = from_file()
GEN_AI_ENDPOINT = os.getenv('GEN_AI_ENDPOINT')
GEN_AI_INFERENCE_ENDPOINT = os.getenv('GEN_AI_INFERENCE_ENDPOINT')
COMPARTMENT_ID = os.getenv('C')
model_id = 'cohere.command-a-03-2025'
generative_ai_inference_client = GenerativeAiInferenceClient(config=config, retry_strategy=oci.retry.NoneRetryStrategy(), timeout=(10,240))
def main():
st.set_page_config(
page_title="My Great ChatGPT",
page_icon="?"
)
st.header("My Great ChatGPT ?")
# チャット履歴の初期化: message_history がなければ作成
if "message_history" not in st.session_state:
st.session_state.message_history = [
# System Prompt を設定 ('system' はSystem Promptを意味する)
("system", "You are a helpful assistant.")
]
# %%
start_time = time.perf_counter()
first_token_time = None
# ユーザの入力を監視
if user_input := st.chat_input("聞きたい事を入力してね!"):
# ユーザの質問を履歴に追加('user'はユーザの質問を意味する)
st.session_state.message_history.append(("user", user_input))
with st.chat_message("ai"):
placeholder = st.empty()
full_response = ""
messages_for_oci = []
for role, message in st.session_state.message_history:
if role == "system":
pass
elif role == "user":
messages_for_oci.append({
#role=oci.generative_ai_inference.models.Message.ROLE_USER,
"role": "USER",
"message": message
})
elif role == "ai":
messages_for_oci.append({
#role=oci.generative_ai_inference.models.Message.ROLE_ASSISTANT,
"role": "CHATBOT",
"message": message
})
messages_for_oci.append({
#role=oci.generative_ai_inference.models.Message.ROLE_USER,
"role": "USER",
"message": user_input
})
# System Prompt の処理: 履歴から 'system' ロールのメッセージを抽出し、
# CohereChatRequest の system_prompt に設定します。
system_prompt = next((msg for role, msg in st.session_state.message_history if role == "system"), None)
updated_chat_request = oci.generative_ai_inference.models.CohereChatRequest(
message=user_input,
chat_history=messages_for_oci,
max_tokens=500,
is_stream=True,
temperature=0.75,
top_p=0.7,
top_k=0,
frequency_penalty=1.0,
is_echo=False # Streamlitの表示で重複を避けるためFalseに
)
updated_chat_detail = oci.generative_ai_inference.models.ChatDetails(
serving_mode=OnDemandServingMode(model_id=model_id),
compartment_id=COMPARTMENT_ID,
chat_request=updated_chat_request
)
start_time = time.perf_counter()
first_token_time = None
# OCI AIサービスにリクエストを送信 (ストリーム)
try:
chat_response = generative_ai_inference_client.chat(updated_chat_detail)
full_response = ""
for event in chat_response.data.events():
data = json.loads(event.data)
if "text" in data:
full_response += data["text"]
placeholder.markdown(full_response)
placeholder.markdown(full_response)
st.session_state.message_history.append(("ai", full_response))
except Exception as e:
st.error(f"OCI Generative AI 呼び出し中にエラーが発生しました: {e}")
st.session_state.message_history.pop()
# チャット履歴の表示
for role, message in st.session_state.get("message_history", []):
st.chat_message(role).markdown(message)
if __name__ == '__main__':
main()
所感
最初は他の記事もあるし余裕で実装できるなと高をくくってたのですが・・・いやはや、ハマるハマる(笑)
モデルIDを「cohere.command」としたら404 not foundと怒られまくったり、じゃあ今回指定した最新の「cohere.command-a-03-2025」にしてみたら今度はtext generationに対応していないと怒られたり・・・
ChatGPTもGeminiもSDKを最新にしてくださいばかりで、そこら辺の対応をしてくれなくて非常にハマりました。
ちなみに書籍はlangchain+OpenAIで書かれていて非常にさくっと動きます(苦笑)
なので、今後はよほどじゃない限りOCIでやるのは避けようかと悩み中・・・
