ollama-pythonでレスポンスをストリーミング形式で表示する|Python

2 アクセス

はじめに

この記事はOllamaのPythonライブラリを使ってローカルLLMを利用するの続き
今回はストリーミング形式で表示する方法について

また、Llama3.1-Swallowのv0.2が2024年11月11日に公開されていたhttps://swallow-llm.github.io/llama3.1-swallow.ja.html
過去の記事(Llama 3.1 SwallowをOllamaで使えるようにする|ローカルLLM)と同じ手順でv0.1からv0.2に変更した

サンプルコード

あらかじめ、ollamaライブラリをpipでインストールしてある
公式のドキュメント通りに書いた→https://github.com/ollama/ollama-python

import ollama

stream = ollama.chat(
    model='Llama-3.1-Swallow-8B-Instruct-v0.2_Q4_K_M',
    messages=[{'role': 'user', 'content': '名古屋で1日遊ぶプランを考えてください'}],
    stream=True)

# 型の表示
print(type(stream))
print(stream)

for chunk in stream:
    print(chunk['message']['content'], end='', flush=True)

ストリーミング形式

ollama.chat()メソッドでstream = Trueにするだけ

型を出力すると以下のようになる

generatorクラスが返ってきていることが分かる

streamの出力

streamはジェネレーターなので、逐次データを生成する
データごとにchunkに入れてprint()関数で表示している

print()関数

chunkは辞書のネスト構造をしているので、キーで[‘message’][‘content’]を指定してやる必要がある
これはストリーミングを使わない場合と同じ

end

デフォルトでは文末には改行コード(\n)になっている
このままでは、1データごと(数文字ごと)に改行されて見づらいので、end = ”(空文字)にしておく

flush

print関数では出力を一度バッファに保存するが、flush = Trueにすることですぐに画面に表示できる

実行結果

名古屋駅から栄までは名鉄線では移動できないし、名古屋城は国宝には指定されていないし、ツッコミどころはあるが、8Bのモデルでここまで書けるのは個人的にはすごいと思う。
長文になるほど、ストリーミング形式は役に立ちそう

活用の方法として、Chat GPTやClaudeのブラウザのように逐次表示するシステムがOllamaでも実現できる
あとは、逐次出力された応答をText To Speechに送れば、ローカルLLMを利用した音声対話の高速化が望めそう

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です