Ollama動かしてみた話
ほかの記事ではOllamaをとりあえず動かしてみました。
この記事ではCLIで叩いていましたが、pythonから利用できればより便利そうです。
https://github.com/ollama/ollama-pythonにollamaをpythonから叩けるものがあるので、利用してみます。
pip install ollama
なお、ollama-python
ではなくollama
です。
CLIとpythonでの動作回り雑記
心配していたのは、CLIでpullしたものがpythonでは認識されていなかったりしないかという点でしたが、問題なく共通の環境が参照されているようですね。
CLIでcreateしたものがきちんとollama.list()
でもリストアップされています。
個人的にはpythonでもstreamができるのがありがたいですね。やはりレスポンスを全部取得してから返すような仕組みだと、確実に使い勝手が悪いと感じています。純粋に待っている時間が暇、動いているかどうかわからない、どれくらい時間がかかっているかわからないなど、streamのありがたさはいろいろありそうです。
そのほかCLIでできることはだいたいpython内でできそうですが、さすがにmodelfileべた書きはしたくないのでcreateは出番がなさそう。いや、ちゃんとクラス作って文法チェックとかするなら案外こっちの方がいいのかな?
ModelfileのTemplate、Go template syntaxとか書いているけど、なんですかこれ。全くの未知の言語が出てきました。何か使う上で需要が発生したら、とりあえずChatGPTくんに聞いて無理そうだったら少し取り組んでみるのもありかもしれません。
starcoder2とか
コーディングに特化したモデルであるstarcoder2とかを試しに使ってみているんですが、どうも普通のllama3とかとは動作の趣が全く違っています。
ちっちゃいほうのstarcoder2:3bだとある程度短い回答を返してくれるんですが、starcoder2:7bの方は同じプロンプトを投げても延々と回答を終えてくれません。vscodeでContinueと一緒に使うだとかの用途だともしかしたら都合がいいのかもしれませんが、プロンプトを与えて回答を得るという目的だとデフォルトだと使い物にならない気がしますね。そういったこともあって、自分でModelFileを書いて、出力の終了Tokenなどいじれればいいと思った次第です。
例として、以下のようなプロンプトを投げてみました。# Write a function to execute binary search in python
こんな感じのコメントに対しstarcoder2はプログラムを返してくれるわけですが、内容を見てみるといろいろ問題がありそうです。
starcoder2 3b
全165行!
def binary_search(arr, l, r, x):
if r >= 1:
mid = int((l + (r - 1)) / 2)
# If the element is present at the middle itself
if arr[mid] == x:
return mid
# If element is smaller than mid, then it can only be present in left subarray
elif arr[mid] > x:
return binary_search(arr, l, mid - 1, x)
else:
# Else the element can only be present in right subarray
return binary_search(arr, mid + 1, r, x)
else:
# Element is not present in the array
return -1
# Driver Code
if __name__ == '__main__':
arr = [2, 3, 4, 10, 40]
x = 10
result = binary_search(arr, 0, len(arr) - 1, x)
if result != -1:
print("Element is present at index", str(result))
...
starcoder2 7b
全400行!おまけに動かない!
# Write a function to execute binary search in python
def binary_search(list, item):
low = 0
high = len(list) -1
while low <= high:
mid = (low + high)/2
guess = list[mid]
if guess == item:
return mid
elif guess > item:
high = mid - 1
else:
low = mid + 1
return None
my_list = [1,3,5,7,9]
print(binary_search(my_list, 3))
print(binary_search(my_list, -1))
<file_sep>/python/data-structures/linked-lists/singly-linked-list.py
# Singly linked list
class Node:
def __init__(self, data):
self.data = data
self.next = None
def get_data(self):
return self.data
def set_data(self, data):
self.data = data
def get_next(self):
return self.next
def set_next(self, next):
self.next = next
...
3bの方は一応動くコードですが、7bの方はそもそも書いてくれた関数が動きません。また、どっちも途中に以下のような感じの記述があります。<file_sep>/Python/Algorithms/Sorting/insertionSort.py
<file_sep>/python/data-structures/linked-lists/singly-linked-list.py
おそらく、既存のコードから次はこのファイルにこんな感じの関数を実装するといいよ、的な出力をしてくれているのかな。3bの方だとBinary search以外に、Insertion Sort、Selection Sort、Merge Sort、Quick Sort、Bubble Sortのコードまで一回のollama.chat()で返しているんだけど、コード補完に特化しているってことなのかなぁ。学習元のファイル構成とコードを丸ごとコピーして出力しているわけではないことを祈るばかりです。
コメント