ラベル Llama2 の投稿を表示しています。 すべての投稿を表示
ラベル Llama2 の投稿を表示しています。 すべての投稿を表示

2023年8月1日火曜日

Llama.cpp_serverのOpenAI互換APIとChromaを使ってIn-context Learningを行なう

 以前の記事で、Llama_cpp.serverのOpenAI互換APIとベクトル・データベースとしてPineconeを使ったIn-context Learningを行なうAPEXアプリケーションを作成しました。そのPineconeの部分をChromaに置き換えてみました。

ベクトル・データベースを置き換えただけなので、APEXアプリケーション自体にほとんど変更はありません。

置き換えたAPEXアプリケーションのエクスポートは以下になります。

https://github.com/ujnak/apexapps/blob/master/exports/vector-documents-search-chroma.zip

ChromaにAPEXからアクセスするためのパッケージCHROMA_APIを作成しています。JavaScript APIを参考にしていますが、実装を省略した部分は多々あります。(例えば引数としてstringまたはstring[]を受け取る部分をstring[]に限定していたりします)。

パッケージKB_LLM_UTILのPineconeの呼び出し部分を、パッケージCHROMA_APIのファンクションの呼び出しに置き換えています。

APEXアプリケーションの置換文字列G_INDEXに、Chromaに作成したコレクションのIDを設定します。G_ENDPOINTとして、LLama_cpp.serverとChromaが稼働しているホストを指すURLを設定します。

パッケージCHROMA_APIにはコレクションを作成するファンクションCREATE_COLLECTIONまたはGET_OR_CREATE_COLLECTIONが含まれています。そのファンクションを呼び出して、Chromaのコレクションを作成します。

metadataのhnsw:spacecosineを指定し、ベクトル検索時にコサイン類似度を使うようにします。

作成されているコレクションを一覧するには、LIST_COLLECTIONSを呼び出します。

作成したコレクションを削除するには、DELETE_COLLECTIONを呼び出します。

以上が、Chromaに切り替えた変更点です。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

2023年7月21日金曜日

llama_cpp.serverをAmpere A1のインスタンス上で動かしてみる

先の記事でLlama.cppを使ってAmpere A1でLlama 2を動かしてみたのですが、Llama.cppにはllama_cpp.serverというOpenAI互換のサーバーが含まれていました。

OpenAIについては、以前にAPIを呼び出す簡単なAPEXアプリケーションを作っているので(こちらの記事)、llama_cpp.serverをAmpere A1のインスタンスで実行して、APEXアプリケーションからアクセスしてみました。


APIのエンドポイントのホストをapi.openai.comからllama_cpp.serverを実行しているサーバーに変えるだけで、APEXアプリケーションはそのまま動作しました。

ただし、扱うトークン数の最大値が64かその近辺になっているようで、回答が短すぎました。ドキュメントに記載は見つけられませんが、llama_cpp.serverのリクエストに属性としてmax_tokensを含めることで、長い回答を得ることができました

APEXアプリケーションのエクスポートは以下です。
https://github.com/ujnak/apexapps/blob/master/exports/chatgpt-app.zip

このアプリケーションに以下の変更を加えます。

アプリケーション定義置換置換文字列としてG_SERVERを定義します。置換値はllama_cpp.serverが稼働しているインスタンスの(https://で始まる)ホスト名になります。


ボタンSEND_USER_MESSAGEをクリックしたときに実行されるPL/SQLコードを変更します。変更は3箇所です。
  1. 属性max_tokensの追加。
  2. API呼び出しのURLに直書きされたapi.openai.comを、置換文字列G_SERVERに置き換える。
  3. Web資格証明の指定を除く。



これより、Llama_cpp.serverを動かすために実施した作業を記載します。

Oracle Cloudで動かすHTTPサーバーは基本的にHTTPS化する必要があります。Llama_cpp.serverはHTTPSで動かす方法は提供されていないので、Nginxによりリクエストを受け付けるようにします。

最初にNginxをインストールします。

sudo apt install nginx

(以下はNginxがインストール済みなので、これといった作業は行われていません。)

ubuntu@mywhisper2:~$ sudo apt install nginx

Reading package lists... Done

Building dependency tree       

Reading state information... Done

nginx is already the newest version (1.18.0-0ubuntu1.4).

0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

ubuntu@mywhisper2:~$ 


Llama_cpp.serverを動かすために必要なパッケージをインストールします。

pip install llama-cpp-python[server]

(以下もパッケージはインストール済みなので、これといった作業は行われていません。)

ubuntu@mywhisper2:~$ pip install llama-cpp-python[server]

Requirement already satisfied: llama-cpp-python[server] in ./.local/lib/python3.8/site-packages (0.1.73)

Requirement already satisfied: numpy>=1.20.0 in /usr/local/lib/python3.8/dist-packages (from llama-cpp-python[server]) (1.23.5)

Requirement already satisfied: diskcache>=5.6.1 in ./.local/lib/python3.8/site-packages (from llama-cpp-python[server]) (5.6.1)

Requirement already satisfied: typing-extensions>=4.5.0 in ./.local/lib/python3.8/site-packages (from llama-cpp-python[server]) (4.7.1)

Requirement already satisfied: uvicorn>=0.22.0; extra == "server" in ./.local/lib/python3.8/site-packages (from llama-cpp-python[server]) (0.23.1)

Requirement already satisfied: fastapi>=0.100.0; extra == "server" in ./.local/lib/python3.8/site-packages (from llama-cpp-python[server]) (0.100.0)

Requirement already satisfied: pydantic-settings>=2.0.1; extra == "server" in ./.local/lib/python3.8/site-packages (from llama-cpp-python[server]) (2.0.2)

Requirement already satisfied: sse-starlette>=1.6.1; extra == "server" in ./.local/lib/python3.8/site-packages (from llama-cpp-python[server]) (1.6.1)

Requirement already satisfied: h11>=0.8 in ./.local/lib/python3.8/site-packages (from uvicorn>=0.22.0; extra == "server"->llama-cpp-python[server]) (0.14.0)

Requirement already satisfied: click>=7.0 in ./.local/lib/python3.8/site-packages (from uvicorn>=0.22.0; extra == "server"->llama-cpp-python[server]) (8.1.3)

Requirement already satisfied: pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,<3.0.0,>=1.7.4 in ./.local/lib/python3.8/site-packages (from fastapi>=0.100.0; extra == "server"->llama-cpp-python[server]) (2.0.3)

Requirement already satisfied: starlette<0.28.0,>=0.27.0 in ./.local/lib/python3.8/site-packages (from fastapi>=0.100.0; extra == "server"->llama-cpp-python[server]) (0.27.0)

Requirement already satisfied: python-dotenv>=0.21.0 in ./.local/lib/python3.8/site-packages (from pydantic-settings>=2.0.1; extra == "server"->llama-cpp-python[server]) (1.0.0)

Requirement already satisfied: annotated-types>=0.4.0 in ./.local/lib/python3.8/site-packages (from pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,<3.0.0,>=1.7.4->fastapi>=0.100.0; extra == "server"->llama-cpp-python[server]) (0.5.0)

Requirement already satisfied: pydantic-core==2.3.0 in ./.local/lib/python3.8/site-packages (from pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,<3.0.0,>=1.7.4->fastapi>=0.100.0; extra == "server"->llama-cpp-python[server]) (2.3.0)

Requirement already satisfied: anyio<5,>=3.4.0 in /usr/local/lib/python3.8/dist-packages (from starlette<0.28.0,>=0.27.0->fastapi>=0.100.0; extra == "server"->llama-cpp-python[server]) (3.6.2)

Requirement already satisfied: idna>=2.8 in /usr/lib/python3/dist-packages (from anyio<5,>=3.4.0->starlette<0.28.0,>=0.27.0->fastapi>=0.100.0; extra == "server"->llama-cpp-python[server]) (2.8)

Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.8/dist-packages (from anyio<5,>=3.4.0->starlette<0.28.0,>=0.27.0->fastapi>=0.100.0; extra == "server"->llama-cpp-python[server]) (1.3.0)

ubuntu@mywhisper2:~$ 


Nginxは、HTTPSの標準ポートである443で接続を待ち受けるように構成します。そのため、firewalldで443から8443へのポート・フォワードが設定されている場合、その設定を削除します。

firewall-cmd --remove-forward-port=port=443:proto=tcp:toport=8443

Llama_cpp.serverはポート8000(デフォルト)で接続を待ち受けるため、firewalldにポート8000の接続許可を与えます。

firewall-cmd --add-port=8000/tcp

変更を永続化します。

firewall-cmd --runtime-to-permanent

最終的に以下の設定になります。

firewall-cmd --list-all

root@mywhisper2:/home/ubuntu# firewall-cmd --list-all

public

  target: default

  icmp-block-inversion: no

  interfaces: 

  sources: 

  services: dhcpv6-client http https ssh

  ports: 8000/tcp

  protocols: 

  masquerade: no

  forward-ports: 

  source-ports: 

  icmp-blocks: 

  rich rules: 

root@mywhisper2:/home/ubuntu# 


Nginxの構成ファイルを/etc/nginx/conf.d/server.confとして作成します。内容は以下になります。


Let's encryptのcertbotを使って証明書を取得済みとします。Nginxはrootで動作させるため、/etc/letsencrypt/live/ホスト名以下に作成されるfullchain.pemprivkey.pemを直接参照しています。

以上でNginxの構成は完了です。Nginxを起動します。

systemctl start nginx

root@mywhisper2:~# systemctl start nginx

root@mywhisper2:~# systemctl status nginx

nginx.service - A high performance web server and a reverse proxy server

     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)

     Active: active (running) since Fri 2023-07-21 03:03:36 UTC; 18s ago

       Docs: man:nginx(8)

    Process: 139267 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (c>

    Process: 139268 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exite>

   Main PID: 139269 (nginx)

      Tasks: 5 (limit: 28696)

     Memory: 4.4M

     CGroup: /system.slice/nginx.service

             ├─139269 nginx: master process /usr/sbin/nginx -g daemon on; master_process o>

             ├─139270 nginx: worker process

             ├─139271 nginx: worker process

             ├─139272 nginx: worker process

             └─139273 nginx: worker process


Jul 21 03:03:36 mywhisper2 systemd[1]: Starting A high performance web server and a revers>

Jul 21 03:03:36 mywhisper2 systemd[1]: Started A high performance web server and a reverse>

lines 1-18/18 (END)


あとはllama_cpp.serverを起動するだけなのですが、llama_cpp.serverを起動すると以下の警告が発生します。

warning: failed to mlock 174080000-byte buffer (after previously locking 0 bytes): Cannot allocate memory

Try increasing RLIMIT_MLOCK ('ulimit -l' as root).

llama_new_context_with_model: kv self size  = 1600.00 MB


無償枠のAmpere A1、4OCPU、24GBメモリのインスタンスを使っているため、メモリは足りていると思っていたのですが、mlockとmmapのシステム・コールが失敗しています。これは、ulimitでmax locked memoryが65536に制限されているためでした。

ubuntu@mywhisper2:~$ ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 95653

max locked memory       (kbytes, -l) 65536

max memory size         (kbytes, -m) unlimited

open files                      (-n) 1024

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 8192

cpu time               (seconds, -t) unlimited

max user processes              (-u) 95653

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

ubuntu@mywhisper2:~$ 


一般ユーザーのubuntuにてmax locked memoryの制限を外すため、/etc/security/limits.confに以下の記述を追加します。

ubuntu        hard          memlock                 unlimited

#<domain>      <type>  <item>         <value>

#


#*               soft    core            0

#root            hard    core            100000

#*               hard    rss             10000

#@student        hard    nproc           20

#@faculty        soft    nproc           20

#@faculty        hard    nproc           50

#ftp             hard    nproc           0

#ftp             -       chroot          /ftp

#@student        -       maxlogins       4

ubuntu           hard    memlock         unlimited


ユーザーubuntuでログインし直した後から、max locked memoryを変更できるようになります。

ulimit -l unlimited

その後、llama_cpp.serverを起動します。このインスタンスは4OCPUなので、n_threadsに4を指定します。(デフォルトは2)

python3 -m llama_cpp.server --model llama-2-13b-chat.ggmlv3.q8_0.bin --n_threads 4

ubuntu@mywhisper2:~$ ulimit -l

65536

ubuntu@mywhisper2:~$ ulimit -l unlimited

ubuntu@mywhisper2:~$ python3 -m llama_cpp.server --model llama-2-13b-chat.ggmlv3.q8_0.bin --n_threads 4

/home/ubuntu/.local/lib/python3.8/site-packages/pydantic/_internal/_fields.py:126: UserWarning: Field "model_alias" has conflict with protected namespace "model_".


You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ('settings_',)`.

  warnings.warn(

llama.cpp: loading model from llama-2-13b-chat.ggmlv3.q8_0.bin

llama_model_load_internal: format     = ggjt v3 (latest)

llama_model_load_internal: n_vocab    = 32000

llama_model_load_internal: n_ctx      = 2048

llama_model_load_internal: n_embd     = 5120

llama_model_load_internal: n_mult     = 256

llama_model_load_internal: n_head     = 40

llama_model_load_internal: n_layer    = 40

llama_model_load_internal: n_rot      = 128

llama_model_load_internal: freq_base  = 10000.0

llama_model_load_internal: freq_scale = 1

llama_model_load_internal: ftype      = 7 (mostly Q8_0)

llama_model_load_internal: n_ff       = 13824

llama_model_load_internal: model size = 13B

llama_model_load_internal: ggml ctx size =    0.09 MB

llama_model_load_internal: mem required  = 15159.96 MB (+ 1608.00 MB per state)

llama_new_context_with_model: kv self size  = 1600.00 MB

AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 0 | VSX = 0 | 

INFO:     Started server process [139695]

INFO:     Waiting for application startup.

INFO:     Application startup complete.

INFO:     Uvicorn running on http://localhost:8000 (Press CTRL+C to quit)



以上でllama_cpp.serverにアクセスできるようになります。

ブラウザより以下のURLにアクセスします。

https://ホスト名/docs


まだまだ、チューニングの余地はあると思いますが、作業の紹介は以上になります。

2023年7月20日木曜日

Llama.cppを使ってAmpere A1でLlama 2を動かしてみる

MetaよりLlama 2の提供が開始されました。動かすには沢山のリソースが必要なのだろうなと思っていたら、以下の記事を見つけました。


CPUでも動くとのことで、以前に作成したOracle Cloudの無料枠のAmpere A1のインスタンス(4OCPU、24GB)で動かしてみました。
OpenAI Whisperを使った文字起こしアプリの作成(3) - Flaskを使ったAPIサーバー

HuggingFaceよりTheBloke/Llama-2-13B-chat-GGMLllama-2-13b-chat.ggmlv3.q8_0.binをダウンロードして使用しています。Provided filesのUse caseには、リソース使用量が多く遅いと記載されていますが、メモリについては24GBあるので足りそうですし、動作させてみるのが目的なのでaccuracyが高そうなモデルを選んでいます。

Ampere A1のインスタンスにAPIサーバーを作成し、フロントエンドをAPEXで作成します。

作成したアプリケーションに、プロンプトとして以下を与えました。

User: Who was the Japanese prime minister during Reagan's administration?
Assistant:

応答は以下です。

Assistant: The Japanese Prime Minister during Ronald Reagan's administration (1981-1989) was Yasuhiro Nakasone. He served as Prime Minister from 1982 to 1987.

応答が得られるまでに1分程度かかりました。


プロンプトに日本語を入力してみました。

User: 現在のアメリカの大統領は誰ですか?
Assistant:

応答は以下です。

Assistant: The current President of the United States is Joe Biden. He was inaugurated on January 20, 2021, and is serving his first term as President.

応答は英語でしたが、正しく解釈されています。


日本に関する質問をしてみました。

User: 現在の日本の首相は誰ですか?
Assistant:

日本語で学習していると応答が日本語になることがあるのかもしれません。しかし、3年前の情報です。


これから行った作業について説明します。

Llama.cppのPythonバインディングをインストールします。

pip install llama-cpp-python

ubuntu@mywhisper2:~$ pip install llama-cpp-python

Collecting llama-cpp-python

  Downloading llama_cpp_python-0.1.73.tar.gz (1.6 MB)

     |████████████████████████████████| 1.6 MB 27.6 MB/s 

  Installing build dependencies ... done

  Getting requirements to build wheel ... done

    Preparing wheel metadata ... done

Collecting diskcache>=5.6.1

  Downloading diskcache-5.6.1-py3-none-any.whl (45 kB)

     |████████████████████████████████| 45 kB 4.3 MB/s 

Collecting typing-extensions>=4.5.0

  Downloading typing_extensions-4.7.1-py3-none-any.whl (33 kB)

Requirement already satisfied: numpy>=1.20.0 in /usr/local/lib/python3.8/dist-packages (from llama-cpp-python) (1.23.5)

Building wheels for collected packages: llama-cpp-python

  Building wheel for llama-cpp-python (PEP 517) ... done

  Created wheel for llama-cpp-python: filename=llama_cpp_python-0.1.73-cp38-cp38-linux_aarch64.whl size=250785 sha256=292028cdc30da399c4dfc90d3a465b46a0834d377b1956de529377a79b1e0942

  Stored in directory: /home/ubuntu/.cache/pip/wheels/0e/b1/1c/924b1420d220bbb77b4b7c5e533f23b2cf683d28ad20ee5b62

Successfully built llama-cpp-python

ERROR: tensorflow-cpu-aws 2.13.0 has requirement typing-extensions<4.6.0,>=3.6.6, but you'll have typing-extensions 4.7.1 which is incompatible.

Installing collected packages: diskcache, typing-extensions, llama-cpp-python

Successfully installed diskcache-5.6.1 llama-cpp-python-0.1.73 typing-extensions-4.7.1

ubuntu@mywhisper2:~$


使用するモデルのダウンロード・リンクを取得し、wgetでファイルをダウンロードします。

APIサーバーをllama2-server.pyとして作成します。コードは以下になります。

pythonで実行します。

python llama2-server.py

ubuntu@mywhisper2:~$ python llama2-server.py 

llama.cpp: loading model from /home/ubuntu/llama-2-13b-chat.ggmlv3.q8_0.bin

llama_model_load_internal: format     = ggjt v3 (latest)

llama_model_load_internal: n_vocab    = 32000

llama_model_load_internal: n_ctx      = 512

llama_model_load_internal: n_embd     = 5120

llama_model_load_internal: n_mult     = 256

llama_model_load_internal: n_head     = 40

llama_model_load_internal: n_layer    = 40

llama_model_load_internal: n_rot      = 128

llama_model_load_internal: freq_base  = 10000.0

llama_model_load_internal: freq_scale = 1

llama_model_load_internal: ftype      = 7 (mostly Q8_0)

llama_model_load_internal: n_ff       = 13824

llama_model_load_internal: model size = 13B

llama_model_load_internal: ggml ctx size =    0.09 MB

llama_model_load_internal: mem required  = 15025.96 MB (+ 1608.00 MB per state)

llama_new_context_with_model: kv self size  =  400.00 MB

AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 0 | VSX = 0 | 

 * Serving Flask app 'llama2-server'

 * Debug mode: on

INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

 * Running on all addresses (0.0.0.0)

 * Running on https://127.0.0.1:8443

 * Running on https://10.0.0.131:8443

WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

 * Running on all addresses (0.0.0.0)

 * Running on https://127.0.0.1:8443

 * Running on https://10.0.0.131:8443

INFO:werkzeug:Press CTRL+C to quit

Press CTRL+C to quit

INFO:werkzeug: * Restarting with stat

 * Restarting with stat

llama.cpp: loading model from /home/ubuntu/llama-2-13b-chat.ggmlv3.q8_0.bin

llama_model_load_internal: format     = ggjt v3 (latest)

llama_model_load_internal: n_vocab    = 32000

llama_model_load_internal: n_ctx      = 512

llama_model_load_internal: n_embd     = 5120

llama_model_load_internal: n_mult     = 256

llama_model_load_internal: n_head     = 40

llama_model_load_internal: n_layer    = 40

llama_model_load_internal: n_rot      = 128

llama_model_load_internal: freq_base  = 10000.0

llama_model_load_internal: freq_scale = 1

llama_model_load_internal: ftype      = 7 (mostly Q8_0)

llama_model_load_internal: n_ff       = 13824

llama_model_load_internal: model size = 13B

llama_model_load_internal: ggml ctx size =    0.09 MB

llama_model_load_internal: mem required  = 15025.96 MB (+ 1608.00 MB per state)

llama_new_context_with_model: kv self size  =  400.00 MB

AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 0 | VSX = 0 | 

WARNING:werkzeug: * Debugger is active!

 * Debugger is active!

INFO:werkzeug: * Debugger PIN: 610-498-273

 * Debugger PIN: 610-498-273


これから、このAPIサーバーを呼び出すAPEXアプリケーションを作成します。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。ユーザー・インターフェースはすべてデフォルトで作成されるホーム・ページに実装します。

名前Llama2 UIとし、アプリケーションの作成を実行します。


RESTデータ・ソースを作成して、APIサーバーへの呼び出しを行います。

共有コンポーネントRESTデータ・ソースを開きます。


作成済みのRESTデータ・ソースが一覧されます。作成をクリックします。


RESTデータ・ソースの作成最初からを選択します。

へ進みます。


RESTデータ・ソース・タイプとして簡易HTTPを選択します。名前Llama2とします。URLエンドポイントは、Amere A1で動作しているAPIサーバーを呼び出すURLになります。以下のような形式になります。

https://インスタンスのホスト名/chat

へ進みます。


リモート・サーバーベースURLサービスURLパスが認識されます。

通常は変更不要なので、値を確認してへ進みます。


ページ区切りなしです。

へ進みます。


認証が必要ですオフです。

今回作成するRESTデータ・ソースは特殊なため、自動検出はできません。RESTソースの手動作成を実施します。


RESTデータ・ソースLlama2が作成されます。ただし、ほとんど構成されていません。

RESTデータ・ソースを編集するために開きます。


操作データベース・アクション行のフェッチだけを残し、他を削除します。


データベース・アクション行のフェッチである操作鉛筆アイコンをクリックして開きます。

HTTPメソッドをGETからPOSTに変更します。変更するとリクエスト本文テンプレートの項目が現れるので、以下を記述します。
{
"max_tokens": #MAX_TOKENS#,
"query": "#PROMPT#"
}
上記を入力後、生成をクリックします。


操作パラメータ本文との同期というボタンが現れます。これをクリックすると、リクエスト本文に含まれる置換文字列操作パラメータとして追加されます。

今回は操作パラメータとしてMAX_TOKENSPROMPTが追加されます。


操作パラメータのMAX_TOKENSは、必須オンにし、デフォルト値として64を設定します。


操作パラメータPROMPTについては、後で必須オンにします。サンプル・データを使ってデータ・プロファイルを検出する際に、デフォルト値の無い必須パラメータがあるとエラーが発生します。そのため、データ・プロファイルの検出ができなくなります

パラメータの追加をクリックし、Content-TypeヘッダーとAcceptヘッダーを追加します。両方ともに、値はapplication/jsonです。

パラメータタイプHTTPヘッダー名前Content-Type目的入力です。デフォルト値としてapplication/jsonを指定します。静的オンにすることにより、つねにデフォルト値が送信されます。


同様にパラメータとしてAcceptヘッダーを追加します。

以上で操作の設定は完了です。

変更の適用をクリックします。


続いてデータ・プロファイルの編集を行います。

データ・プロファイルを編集するにあたって、サンプルとなるレスポンスをファイルに落とします。

curlコマンドを使ってAPIサーバーを呼び出します。APIサーバーの応答がsample.jsonに書き込まれます。
curl -X POST -H "Content-Type: application/json" -d '{ "max_tokens": 64, "query": "User: Why is sky blue?\nAssistant:" }' -o sample.json https://ホスト名/chat
sample.jsonは以下のような内容になります。
{
  "id": "cmpl-2293b348-82a9-44f9-b270-e04df749473a",
  "object": "text_completion",
  "created": 1689824214,
  "model": "/home/ubuntu/llama-2-13b-chat.ggmlv3.q8_0.bin",
  "choices": [
    {
      "text": "User: Why is sky blue?\nAssistant: That's a great question! The reason the sky appears blue is because of a phenomenon called Rayleigh scattering. When sunlight enters Earth's atmosphere, it encounters tiny molecules of gases such as nitrogen and oxygen. These molecules scatter the light in all directions,",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 64,
    "total_tokens": 76
  }
}

データ・プロファイルの編集をクリックします。


データ・プロファイル行セレクタとしてchoicesを指定します。再検出サンプル・レスポンスとしてcurlを実行して出力したsample.jsonを指定します。

上記で、データ・プロファイルの再検出をクリックします。


新規列としてTEXTINDEX_などが検出されます。

データ・プロファイルの置換をクリックします。


としてTEXTINDEX_などが追加されていることを確認し、変更の適用をクリックします。


操作パラメータPROMPTの編集画面を再度開き、必須オンにします。


以上でRESTデータ・ソースは完成です。

変更の適用をクリックします。


Llama2のAPIサーバーへの問い合わせを行なう画面を作成します。

ページ・デザイナホーム・ページを開きます。

出力のトークン数を指定するページ・アイテムP1_MAX_TOKENSを作成します。タイプ数値フィールドラベルMax Tokensです。デフォルトタイプ静的値を選び、静的値として64を設定します。


Llama2に渡すプロンプトを入力するページ・アイテムP1_PROMPTを作成します。タイプテキスト領域ラベルPromptとします。


APIサーバーへの問い合わせを発行するボタンQUERYを作成します。ラベルQuery動作アクションとして動的アクションで定義を選択します。必ずしも必要ではありませんが、テンプレート・オプションWidthStrechに変更し、ボタンの幅をページ幅まで広げます。

動的アクションは、対話モード・レポートのリージョンを作成したのちに作成します。


対話モード・レポートのリージョンResponseを作成します。ソース位置としてRESTソースを選択し、RESTソースとしてLlama2を選びます。送信するページ・アイテムP1_MAX_TOKENSP1_PROMPTを含めます。


RESTデータ・ソースLlama2のパラメータMAX_TOKENSには、アイテムP1_MAX_TOKENSが割り当たります。


パラメータPROMPTには、アイテムP1_PROMPTが割り当たります。


TEXTがLlama2によって生成された文字列です。改行が適切に表示されるよう、タイプリッチ・テキストに変更し、設定書式マークダウンにします。


ボタンQUERY動的アクションを作成します。

リージョンResponseのRESTデータ・ソースが行のフェッチを行なうときにAPIリクエストが発行され、そのレスポンスが対話モード・レポートに表示されます。つまり、リージョンResponseをリフレッシュするだけで新しくAPIリクエストが発行され、対話モード・レポートの表示が更新されます。

動的アクション識別名前onClick Refreshとします。タイミングボタンのデフォルトから変更せず、イベントクリック選択タイプボタンボタンQUERYです。


TRUEアクションとしてリフレッシュを選択します。影響を受ける要素選択タイプリージョンリージョンとしてResponseを選択します。クライアントの条件タイプとしてアイテムはnullではないを選択し、アイテムP1_PROMPTを選択します。

ページ・アイテムP1_PROMPTに値がないときにリージョンResponseのリフレッシュはしない、つまりAPI呼び出しも行いません。


以上でアプリケーションは完成です。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/llama2-ui-test.zip

Flaskのサーバーが応答するのに時間がかかるし、応答を返す前に新たなリクエストを受け付けると、Llamaのレスポンスが##################になったりしますが、Llama2のお試しにはなるでしょう。

また、Oracle APEXでノーコードでREST APIを扱うサンプルにもなっています。

Oracle APEXのアプリケーション作成の参考になれば幸いです。