Ollamaを使用して、ローカルLLM（Llama 3.1🦙）を実装したチャットAIをつくってみた

Ollamaはローカル環境で大規模言語モデル（LLM）を実行できるツールであり、プライバシー保護や高速な推論といった利点があります。
今回は、Streamlitというフレームワークを使用して、このローカルLLM（Llama 3.1🦙）をChatGPTのようなGUIとして実装してみようと思います。

![Screenshot from 2024-12-15 23-13-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677892/46591ccf-4a1c-4f0d-a180-68c82ce21955.png)
※回答内容の精査は各自行いましょう…


# 前提条件
今回は以下の条件で実施しました：
・Ubuntu 24.04
・Python 3.11
・NVIDIA GPU（RTX 3060 Ti）
・Docker
・NVIDIA Container Toolkit
・Ollama

# 使用するライブラリ/ツールの説明
### Streamlit
Pythonで簡単にインタラクティブなWebアプリケーションを構築できるフレームワークです。
直感的なUI設計が可能で、データ可視化や対話型アプリケーションに適しています。

### langchain-ollama
Ollamaが提供するローカルLLMと連携するためのPythonライブラリです。
このライブラリを利用することで、モデルの呼び出しや応答生成が簡単に行えます。

### Ollama
ローカル環境でLLMを効率的に動作させるためのツールです。

# 実装手順
### 1. プロジェクト環境の構築
以下のコマンドでプロジェクトディレクトリを作成します：

```text:python
mkdir -p /media/shared/s_AIchat/static
cd /media/shared/s_AIchat
```

仮想環境を作成し、有効化します：

```text:python
conda create -n aichat python=3.11 -y
conda activate aichat
```

### 2. 必要なパッケージのインストール
requirements.txtファイルを作成し、以下の内容を記載します：

```text:python
streamlit==1.41.1
langchain-ollama==0.2.2rc1
python-dotenv==1.0.0
```

その後、以下のコマンドでパッケージをインストールします：

```text:python
pip install -r requirements.txt
```

### 3. アプリケーションコードの作成
app.pyファイルに以下のコードを記載します：

```text:python
import streamlit as st
from langchain_ollama import OllamaLLM

def init_llm():
    return OllamaLLM(
        model="llama3",
        temperature=0.7,
        base_url="http://localhost:11434"
    )

def main():
    st.set_page_config(page_title="AIチャット", layout="wide")

    if "messages" not in st.session_state:
        st.session_state.messages = []

    llm = init_llm()

    # サイドバー設定
    with st.sidebar:
        st.title("設定")
        temperature = st.slider("Temperature", 0.0, 1.0, 0.7)

    # メインチャット画面
    st.title("AIチャットアプリ")

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

    # ユーザー入力処理
    if prompt := st.chat_input("メッセージを入力してください"):
        st.session_state.messages.append({"role": "user", "content": prompt})
        with st.chat_message("user"):
            st.markdown(prompt)

        # AI応答生成
        with st.chat_message("assistant"):
            response = llm.invoke(prompt)
            st.markdown(response)
            st.session_state.messages.append({"role": "assistant", "content": response})

if __name__ == "__main__":
    main()
```

### 4. UIスタイルの設定
static/style.cssファイルに以下の内容を記載します：

```text:python
.stChatFloatingInputContainer {
    bottom: 20px;
    background-color: rgba(255, 255, 255, 0.9);
    border-radius: 10px;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}

.stChatMessage[data-role="user"] {
    background-color: #e3f2fd;
}

.stChatMessage[data-role="assistant"] {
    background-color: #f5f5f5;
}
```

### 5. アプリケーションの起動
以下のコマンドでStreamlitアプリケーションを起動します：

```text:python
streamlit run app.py
```

ブラウザで http://localhost:8501 にアクセスすると、アプリケーションが表示されます。


# 結果と考察
ローカル環境でLlama 3.1モデルを使用したチャットAIが無事に動作しました。
RTX 3060 Tiでも、それなりにストレスのないスムーズな処理が可能だったかと思います。
また、StreamlitによるUI設計は非常に直感的で、開発者が簡単にカスタマイズできる点が魅力です。ユーザーインターフェースはシンプルかつ洗練されており、ユーザーが自然に操作できるよう工夫されているなと思いました。
暇なときにでも、日本語での返答を行えるようにしたいと思います。

# まとめ
・OllamaとStreamlitを組み合わせることで、安全かつ高速なローカルチャットAIを構築できました。
・GPUサポートにより、大規模言語モデルでもスムーズな動作が可能です。
・Streamlitを活用したUI設計は柔軟性と簡便性を両立しています。
・プライバシー保護やリアルタイム性が求められるアプリケーションにとって非常に有用であり、今後の開発にも応用可能だとおもいます。

# 参考文献
・【WSL2】コンテナを使ってLlama 3.1をローカルで動かしてみる（https://qiita.com/eiji-noguchi/items/a73d476f6ff33be2a63e）
・Streamlit Documentation（https://docs.streamlit.io/）
・Ollama Documentation（https://hub.docker.com/r/ollama/ollama）
・LangChain Documentation（https://python.langchain.com/docs/introduction/）