loog

llamafile を試す

April 08, 2024

llamafile v0.7 が、早くてなんかすごいらしいので、試したいと思います。

私の視点では、ローカルで高速で動くことを目指してチューニングされた Llama2 です。

動作環境の構築が極めて容易なのも特徴です。
というか、構築しません。
ダウンロードして実行するだけです。

V0.7 リリースノート

https://github.com/Mozilla-Ocho/llamafile/releases

公式 Github

https://github.com/Mozilla-Ocho/llamafile

Quickstart

$ wget https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4.llamafile?download=true -O llava-v1.5-7b-q4.llamafile
$ chmod +x llava-v1.5-7b-q4.llamafile
$ ./llava-v1.5-7b-q4.llamafile -ngl 9999 --host 0.0.0.0

これだけで 8080 port で WEB UI が起動します。

クイックスタートの llava-v1.5-7b-q4 は、日本語を扱えますが、日本語の回答をお願いしても、日本語指定を無視されることが目立ちました。

けど、性能は悪くない!

User: おはよう

Llama: おはようございます!何かお手伝いできることがあれば、どうぞお気軽にお申し付けください。

Coding test

Codeing の依頼をしてみます。

User: BS4 を使用して、cli 引数に url, CSS セレクター を受取り、text を全て返す python code を書いて。

Llama: それは以下のようなコードで実現できます:

import bs4
from bs4 import BeautifulSoup

def gettext(url, cssselector):
soup = BeautifulSoup(url, 'html.parser')
text = soup.select(cssselector).gettext()
return text

if name == "main":
url = input("入力してください:")
css_selector = input("CSS セレクターを入力してください:")

text = gettext(url, cssselector)

print(f"{css_selector}に対応する文字列は以下のようです:")
print(text)

これを実行して、入力された URL と CSS セレクターに対応するテキストを取得できます。

すごい!

5G に満たないモデルなのに、きちんと回答して書き切りました。

Llamafile だけを用意する

$ curl -L -o llamafile https://github.com/Mozilla-Ocho/llamafile/releases/download/0.7/llamafile-0.7
$ chmod +x llamafile 

Swallow で日本語を試す

Tom Jobbins さんが、Swallow-7B-GGUF を配布していたので、ありがたく試してみます。

User: おはよう

Llama: Hello!

User: BS4 を使用して、cli 引数に url, CSS セレクター を受取り、text を全て返す python code を書いて。
<code>フォーマットに入れて。

Llama: こんにちは!

User: BS4 を使用して、cli 引数に url, CSS セレクター を受取り、text を全て返す python code を書いて。
<code>フォーマットに入れて。

Llama: 

あれれ?なにか変ですね。

コーディングは苦手なようです。

ELYZA で日本語を試す

ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf

./llamafile -ngl 9999 -m ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf --host 0.0.0.0
User: おはよう

Llama: こんにちわ

User: BS4 を使用して、cli 引数に url, CSS セレクター を受取り、text を全て返す python code を書いて。

Llama: 承知しました。


User: 書いて。

Llama: BS4 のドキュメントを読み込みますか?

ユーザーは「はい」または「いいえ」を選択できます。

- BS4を使用して、cli引数にurl,CSSセレクターを受取りtextを全て返すpython codeを書く
- BS4のドキュメントを読む


User: BS4 を使用して、cli 引数に url, CSS セレクター を受取り、text を全て返す python code を書いて。

Llama: はい、BS4を使ってhtmlパースするコードは以下です。

import bs4

def parse_url(url):
    doc = bs4.BeautifulSoup('<html><body>{}</body></html>'.format(url), 'lxml')

    # 文書のタイトルを取得する
    title = doc.title

    return title

def parsecssselector(css):
    doc = bs4.BeautifulSoup('<html><body>{}</body></html>'.format(url), 'lxml')

    

文書のCSSセレクターを順に解析していく

for selector in css:

    if selector == 'h1':
        title = doc.find(id='h1').text

    elif selector == 'p':
        text = list(doc.find_all('p'))

    return title, text

def main():
url = input("入力するURL: ")

css = input("CSSセレクター: ").split()

title, text = parseurl(url), parsecss_selector(css)

print("タイトル:", title)

print("テキスト: \n", text)

if name == 'main':
main()


なお、lxml パースはより高速に動作する代わりにビルトイン・モジュールがかなり多く含まれているので注意して下さい。
また、上記のコードで文書タイトルを取得できない場合には `bs4.BeautifulSoup('', 'html.parser') 」を使用することでパースすることが可能です。

以上がCSSセレクターを用いた文字列の

User: 続き

Llama: 続

「タイトルの取得とテキスト抽出はそれぞれどのような手法で実装しますか?」という質問に対する回答です。

文書を解析するパーサとしての BeautifulSoup を使う方法、CSSセレクターの順に解析していく方法など様々なアプローチが考えれますのでご参考にしてください。

なんか惜しい!

ELYZA-japanese-Llama-2-13b-fast-instruct-q4_K_M.gguf

今度は 13b で試します。
model は 8G 弱あります。

User: おはよう

Llama: おはようございます

User: BS4 を使用して、cli 引数に url, CSS セレクター を受取り、text を全て返す python code を書いて。

Llama:

import requests

def get_text(url):
response = requests.get(url)
return response.text

User: Beautiful soup を使用してください。

Llama:

from bs4 import BeautifulSoup

def gettext(url, cssselector):
    url = 'http://' + url
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    text = soup.find(css_selector).text
    return text

書き切りました!