LoginSignup
10
3

はじめに

こんにちは、新卒社員やってます!@sat01m0です!

突然ですが、みなさん!LLMアプリ開発やっていますか?
私自身これまであまり触れてきてなかったんですけど、
今ローカル環境にモデルをダウンロードして気軽にLLMを動かせるようになっているらしいんですよね!すごすぎ!
ということで、今更ですがLLMアプリの開発をサクッとやってみようと思います!

今回は大規模言語モデル!Llama-3-ELYZA-JP-8Bを使って、ローカル環境でサクッとアプリを作成してみたので共有します!楽しんでください!

サクッと動かして遊べる環境を作ってもらいたいので詳しい説明は割愛します🙇‍♂️

準備

ディレクトリ構造は以下のようになっています!

ディレクトリ構造
- app.py                                       // アプリケーションのコードを記載するファイル 
- docker-compose.yaml                         // (Docker使わない場合不要)
- Dockerfile                                              // (Docker使わない場合不要)
- Llama-3-ELYZA-JP-8B-q4_k_m.gguf  // インストールしてきたLlamaモデル
- requirements.txt                           // インストールするパッケージを記載しているファイル

Dockerを使う場合とそうじゃない場合どちらも説明します!
Dockerを用いない場合、Python3.8.1以上のバージョンが使える状態にしておいてください!

Step0:環境構築

今回の開発で用いるPythonのライブラリはrequirements.txtにまとめて記載します!
ライブラリのインストールの際に使うので、こちらのファイルを作成します!

requirements.txt
streamlit
langchain
langchain-community
llama-cpp-python

Dockerを用いる場合

Dockerfile,docker-compose.yamlを以下のように記載しています!

Dockerfile
FROM python:3.11

WORKDIR /usr/src/app
COPY app.py /usr/src/app
COPY requirements.txt /usr/src/app

RUN apt-get update
RUN pip install --upgrade pip
RUN python -m pip install -r requirements.txt
docker-compose.yaml
version: '3.9'
services:
  app:
    build: .
    volumes:
      - .:/usr/src/app
    ports:
      - '8080:8080'
    command: sh -c "streamlit run app.py --server.port 8080"

Dockerを用いない場合

今回Python3.11を使って実装をしています!検証していませんが、LangChainが3.8.1以上のバージョンで使えるので、それ以上であれば大丈夫だと思います!
今回のアプリで使用するライブラリをインストールします!
requairements.txtのあるディレクトリに移動して以下のコマンドを実行します!

ターミナル
pip install -r requirements.txt

Step1:Llama-3-ELYZA-JP-8Bモデルをインストール

次に今回用いるモデルのダウンロードをします!
こちらからダウンロードします!

ファイルサイズ大きいので少し時間かかります!
スクリーンショット 2024-07-01 19.37.42.png

ダウンロードが終わったら、先ほどのディレクトリ構造を参考に各ファイルと同じ階層にモデルを移動させています!

Step2:アプリケーションのソースコードの準備

今回はLangChainのLlamaCppとStreamlitを用いて簡単にアプリを作ってみます!

今回軽く遊べるコードを用意してみました!app.pyに以下を記載します!

app.py
# 各ライブラリのインポート
import streamlit as st
from langchain_community.llms import LlamaCpp

# モデルの準備、プロンプト編集する部分
def use_model(text):
    # 使用するモデルの名前
    MODEL_NAME = "Llama-3-ELYZA-JP-8B-q4_k_m.gguf"
    # モデルの準備
    llm = LlamaCpp(
        model_path=MODEL_NAME,
    )
    # プロンプト編集部分
    prompt = "あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。{}。".format(text)
    # モデルの実行
    return llm.invoke(prompt)
# UI(チャットのやり取りの部分)
def main():
    # タイトル
    st.title("LLMアプリ")
    # 入力フォームと送信ボタンのUI
    st.chat_message("assistant").markdown("何か聞きたいことはありませんか?")
    text = st.chat_input("ここにメッセージを入力してください")

    # チャットのUI
    if text:        
        st.chat_message("user").markdown(text)
        st.chat_message("assistant").markdown(use_model(text))

if __name__ == "__main__":
    main()

Step3:レッツ実行!

準備お疲れさまでした!実際に動かしてみましょう!以下のコマンドを実行します!

Dockerを用いる場合

ターミナル
docker compose up

Dockerを用いない場合

ターミナル
streamlit run app.py --server.port 8080

localhost:8080にアクセスしてこのようなページが見られたら成功です!スクリーンショット 2024-07-01 21.01.04.png

やったー!早速何か入力してみましょう!

"焼き肉の美味しい焼き方を教えて"

"創造力をつけるために大事なことを教えて"

雑談が下手すぎますね。。。
自分のプロンプトや出力方法では、途中で区切れちゃったり、"|Answer"がついちゃってたりしてますが、とりあえず動きそうです!

プロンプトについて

今回のアプリでは、huggingfaceのドキュメントにならって、"あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。"の後に、ユーザが入力したテキストをくっつけるようにしています。

app.py(プロンプトの部分)
prompt = "あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。{}。".format(text)

app.pyのpromptの部分を編集すると求めた回答に近づけるように工夫ができると思います!

試しにPythonについて教えてくれるように修正してみました!
promptの部分を以下のように変更してみて聞いてみました。

app.py(プロンプトの部分)
prompt = "あなたは新人開発者にPythonのコードの書き方を教えることができる誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。{}。".format(text)

プロンプト変更前

プロンプト変更後

プロンプトを変更することでheadやgroupbyなど具体的に返してくれるかどうかが変わってきそうです!
手元で色々動かしてみて好みの回答が得られるように遊んでみてください!

おわりに

大規模言語モデル!Llama-3-ELYZA-JP-8Bを使って、ローカル環境でサクッとアプリを作成してみました!
プロンプトの実験とかやったことなかったものに手軽に触れられてよかったです!
今回はチャットが続かない仕様であったり、プロンプトもあまり工夫していなかったりとやり込めていない部分が多々あるので、続きはみなさんの環境で実験してみてください!LLMに触れるきっかけになれば幸いです!
最後まで読んでいただきありがとうございました(^^)ノシ

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3