見出し画像

🌟 Llama 3.1でローカルChatGPTクローンを作ろう!完全ガイド


1. はじめに ✨

Llama 3.1と聞いて「何それ?」と思う方もいるでしょう。でも心配しないでください!本記事では、オフラインで使えるAIチャットボットを、簡単に自分のPCで作る方法を解説します。しかも、ユーザーとの会話を記憶する「メモリー機能」まで搭載!🔥プライバシーを守りながら、どこでも使えるAIアシスタントを一緒に作りましょう!

2. 準備するもの 🛠️

本プロジェクトを始める前に、以下のものが必要です:

  • Python 3.7以上 🐍

  • OllamaとQdrant(これらのツールについては後ほど詳しく解説します)

  • 基本的なPythonの知識 ✨

  • 好きなコードエディタ(VS CodeやPyCharmがオススメです)

3. 環境のセットアップ 🚀

まずは環境を整えましょう!

  1. GitHubのリポジトリをクローンします。

git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git

💡 Tip: オープンソースのリポジトリにスターをつけて、開発者を応援しましょう!⭐️

  1. クローンしたフォルダに移動します。

cd llm_apps_with_memory_tutorials/local_chatgpt_with_memory
  1. 必要な依存関係をインストールします。

pip install -r requirements.txt
  1. Qdrantベクターデータベースをローカルでインストールして起動します。

docker pull qdrant/qdrant
docker run -p 6333:6333 qdrant/qdrant
  1. Ollamaをインストールし、Llama 3.1のモデルを取得します。

ollama pull llama3.1

4. メモリー付きチャットボットの作成 💬

では、いよいよボットを作成していきます!

まず、新しいPythonファイルを作成します。例えば「local_chatgpt_memory.py」という名前にしましょう。そして以下のコードを追加します。

コードの全体像

このチャットボットでは、以下のような機能を実装します:

  • 💾 メモリー機能: ユーザーごとの会話履歴を保存します。

  • 🤔 ローカルでのAI応答: Llama 3.1を使って、ローカル環境でユーザーの質問に答えます。

import streamlit as st
from mem0 import Memory
from litellm import completion

# 設定を定義します
config = {
    "vector_store": {
        "provider": "qdrant",
        "config": {
            "collection_name": "local-chatgpt-memory",
            "host": "localhost",
            "port": 6333,
            "embedding_model_dims": 768,
        },
    },
    "llm": {
        "provider": "ollama",
        "config": {
            "model": "llama3.1:latest",
            "temperature": 0,
            "max_tokens": 8000,
            "ollama_base_url": "http://localhost:11434",
        },
    },
    "embedder": {
        "provider": "ollama",
        "config": {
            "model": "nomic-embed-text:latest",
            "ollama_base_url": "http://localhost:11434",
        },
    },
    "version": "v1.1"
}

# Streamlitアプリケーションを初期化
st.title("Local ChatGPT using Llama 3.1 with Personal Memory 🧐")
st.caption("各ユーザーにパーソナライズされたメモリースペースを提供します!")

# チャット履歴とユーザーセッションを管理
if "messages" not in st.session_state:
    st.session_state.messages = []

# サイドバーでユーザー設定を行います
with st.sidebar:
    st.title("ユーザー設定")
    user_id = st.text_input("ユーザー名を入力してください", key="user_id")
    
    if user_id:
        st.success(f"ログイン中:{user_id}")

        # メモリーの初期化
        m = Memory.from_config(config)

        # メモリーを表示する機能
        st.header("メモリーコンテキスト")
        if st.button("自分のメモリーを表示する"):
            memories = m.get_all(user_id=user_id)
            if memories and "results" in memories:
                st.write(f"**{user_id}** のメモリー履歴:")
                for memory in memories["results"]:
                    if "memory" in memory:
                        st.write(f"- {memory['memory']}")

# チャットインターフェースの実装
if user_id:
    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)
        
        m.add(prompt, user_id=user_id)

        memories = m.get_all(user_id=user_id)
        context = ""
        if memories and "results" in memories:
            for memory in memories["results"]:
                if "memory" in memory:
                    context += f"- {memory['memory']}\n"

        with st.chat_message("assistant"):
            message_placeholder = st.empty()
            full_response = ""
            try:
                response = completion(
                    model="ollama/llama3.1:latest",
                    messages=[
                        {"role": "system", "content": "あなたは過去の会話にアクセスできるアシスタントです。提供されたコンテキストを使用して、パーソナライズされた応答を行います。"},
                        {"role": "user", "content": f"過去の会話のコンテキスト:{context}\n現在のメッセージ:{prompt}"}
                    ],
                    api_base="http://localhost:11434",
                    stream=True
                )  
                for chunk in response:
                    content = chunk.choices[0].delta.get('content', '') if hasattr(chunk, 'choices') else ''
                    if content:
                        full_response += content
                        message_placeholder.markdown(full_response + "▌")
                
                message_placeholder.markdown(full_response)
            except Exception as e:
                st.error(f"エラーが発生しました: {str(e)}")
                full_response = "申し訳ありませんが、応答の生成中にエラーが発生しました。"
                message_placeholder.markdown(full_response)
        
        st.session_state.messages.append({"role": "assistant", "content": full_response})

else:
    st.info("👍 サイドバーにユーザー名を入力してください!")

## 5. コードの詳細解説 👨‍💻
### メモリー管理
このコードでは、`Mem0`というフレームワークを使用して、ユーザーごとに会話履歴を保存しています。このメモリー機能により、ユーザーとの会話内容をAIが覚え、よりパーソナライズされた応答が可能になります。

### Llama 3.1の使用
`Ollama`を使って、Llama 3.1のモデルをローカル環境で実行します。これにより、インターネット接続なしでAIを使用でき、プライバシーも守られます。

## 6. チャットボットの実行 🏃‍♂️
すべてのコードを書き終えたら、ターミナルで以下のコマンドを実行してアプリを起動します。

```bash
streamlit run local_chatgpt_memory.py

その後、ブラウザで表示されたURLにアクセスすれば、あなた専用のローカルAIチャットボットが動き出します!

7. カスタマイズのアイデア 💡

  • ボイスインターフェースを追加する: 音声入力と出力を追加して、よりインタラクティブにしましょう!

  • プライバシーモードの実装: メモリーの保存を一時的に停止できる「プライベートモード」を追加して、より柔軟なプライバシー管理を可能にします。

8. まとめ 📜

これで、ローカル環境で動くChatGPTクローンの作り方が分かりましたね!このプロジェクトを通じて、プライバシーを重視しながら、自分だけのAIアシスタントを作る楽しさを体験できたと思います。引き続きカスタマイズを加えて、どんどん進化させてみてくださいね!✨

いいなと思ったら応援しよう!