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
書き切りました!