AIといえば chatgpt というか、乱立状態ですな

みなさん、お気に入りの AI が、あるようで

本当に助かる 人口脳みそ ちゃんです。


AIチャットを使うのは、WEBサイト経由で簡単に使えますよね。

でも、AIサイトの裏側を構築したり、AIに何か特別なことをさせようとすると大変ですよ

そんな大変な裏側を知ることがエンジニアとしての役目です。

ということで、nvidiaのGPUを買って、ローカルAIを構築したりして研究してました。

最初は、comfyui で、絵を描かしたり、ollama で、チャットを作ったり

基礎的なことは、やってみました。

で、Oracle Cloud でも 生成AIサービスがあるんですけど、どうやって使うのかと調べていたんですよね。

まー、WebConsoleから利用するのは、簡単に出来るんですけど、そんなもん、一般人向けサービスとしては、無理があります。

じゃーどうすんじゃーということで、OCI の SDK を使って、Webサイト経由でサービスすりゃ良いじゃん

てことで構築してみましょうね


ollamaは、AIモデルを利用する為のフレームワークみたいな物で、GUI が無いので、用意しないとダメなんですね。

で、streamlitっていうのがありまして、こいつが簡単に導入出来るし、見た目がchatgptみたくって良い感じなんですよね。

実態は、python3 で構築されていて、AIチャット部分を ollama に接続して応答させています。

で、これを OCI の生成 AI に接続すれば、良い感じのチャットが作れます。

ほぼ、同じ見た目ですね。

そりゃ、ollamaで使ったソースをぱくりましたから

ちょっと、OCI版は、ollamaのAPIとは異なるので調整は必要でしたけど、簡単に修正出来ました。

当然、AIを使いましたけどね。


前置きが長くてすみせんね。

いよいよ、ソース公開です

 

app.py

import streamlit as st
import oci
from oci.generative_ai import GenerativeAiClient
from oci.generative_ai_inference import GenerativeAiInferenceClient
from oci.generative_ai_inference.models import (
    ChatDetails,
    CohereChatRequest,
    OnDemandServingMode
)

# OCI設定
config = oci.config.from_file("~/.oci/config", "DEFAULT")
COMPARTMENT_ID = "ocid1.compartment.oc1..aaazaaaamgunk2ogelcwqnbokeb3ureqpff4ihogepntdjkv2sagdkasusvb"
DEFAULT_MODEL = "cohere.command-a-03-2025"

client = GenerativeAiInferenceClient(config=config)

#モデル一覧
available_models = []
generative_ai_client = GenerativeAiClient(config)
ret:oci.response.Response = generative_ai_client.list_models( compartment_id=COMPARTMENT_ID)
models:oci.generative_ai.models.ModelCollection = ret.data
model:oci.generative_ai.models.Model
for model in models.items:
    if( "CHAT" in model.capabilities ):
        available_models.append(model.display_name)

#タイトル
st.title("Oracle Cloud GenerativeAi デモ")

# モデル選択のドロップダウン(オプション)
selected_model = st.sidebar.selectbox("使用するモデルを選択", available_models, index=available_models.index(DEFAULT_MODEL) if DEFAULT_MODEL in available_models else 0)

# チャット履歴の初期化
if "messages" not in st.session_state:
    st.session_state.messages = []

# チャット履歴の表示
for message in st.session_state.messages:
    role = "assistant" if message["role"] == "assistant" else "user"
    with st.chat_message(role):
        st.markdown(message["message"])

# ユーザー入力
if prompt := st.chat_input("ここにメッセージを入力してください..."):
    # ユーザーメッセージを履歴に追加
    st.session_state.messages.append({"role": "user", "message": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    with st.chat_message("assistant"):
        with st.spinner("思考中..."):

            chat_history = []
            for message in st.session_state.messages:
                if message["role"] == "user":
                    chat_history.append({"role": "USER", "message": message["message"]})
                elif message["role"] == "assistant":
                    chat_history.append({"role": "CHATBOT", "message": message["message"]})

            chat_request = CohereChatRequest(
                message=prompt,
                chat_history=chat_history if chat_history else None,
                max_tokens=500,
                temperature=0.7,
                is_echo=True,
                is_stream=False
            )
            serving_mode = OnDemandServingMode(model_id=selected_model)
            chat_details = ChatDetails(
                compartment_id=COMPARTMENT_ID,
                chat_request=chat_request,
                serving_mode=serving_mode
            )

            response = client.chat(chat_details)
            bot_reply = response.data.chat_response.text

            if bot_reply:
                # アシスタントの応答を履歴に追加
                st.session_state.messages.append({"role": "assistant", "message": bot_reply})
                st.markdown(bot_reply)

CompartMentは、自身のに変えて下さい。

で、起動は、

streamlit run app.py --server.port 8501 --server.enableCORS false

です。

当然ながら、streamlit 環境と OCI SDK 環境は、構築して下さい。

Windowsだったら、WSL+Ubuntu24.04 + python3 + OCI CLI + OCI python SDK で、構築出来ますよ。

 

Joomla templates by a4joomla