Closed7

karakuri-lm-8x7b-instruct-v0.1+Ollama+LlamaIndexでRAGエージェントを試す

kun432kun432

環境

  • Ubuntu 22.04
  • Intel Core i9-13900F
  • メモリ 96GB
  • RTX4090(VRAM 24GB)
  • Python-3.11.4

事前準備

作業ディレクトリ作成

$ mkdir work && cd work

Python仮想環境作成。(※実際には以下のコマンドではなく、自分の場合はdirenv等も設定してコマンド一発で作れるようにしている。やり方はここ。)

$ python -m venv .venv
$ source .venv/bin/activate

モデルの量子化

モデルのダウンロード。かなり時間がかかる&ディスク容量350GBぐらい消費する。なお、自分の場合は既に別のパスにダウンロード済みなのでそれを使った。

$ git lfs install
$ git clone https://huggingface.co/karakuri-ai/karakuri-lm-8x7b-instruct-v0.1

llama.cppのインストール・ビルド。GPUオフロードを有効化している。あと、量子化のためのスクリプトで必要なPythonライブラリのインストール。

$ git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp
$ make GGML_CUDA=1
$ pip install -r requirements.txt

スクリプトでまずモデルをGGUFに変換。このあたりちょっと前にコマンド体系とか色々変わったっぽい。

$ python convert-hf-to-gguf.py ../karakuri-lm-8x7b-instruct-v0.1

GGUFファイルが生成される

INFO:hf-to-gguf:blk.31.attn_q.weight,        torch.bfloat16 --> F16, shape = {4096, 4096}
INFO:hf-to-gguf:blk.31.attn_v.weight,        torch.bfloat16 --> F16, shape = {4096, 1024}
INFO:hf-to-gguf:output_norm.weight,          torch.bfloat16 --> F32, shape = {4096}
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:../karakuri-lm-8x7b-instruct-v0.1/ggml-model-f16.gguf: n_tensors = 323, total_size = 93.4G
Writing:  12%|█████████████████████▊                                                                                                                                                                    | 10.9G/93.4G [05:11<43:08, 31.9Mbyte/s]

完了

INFO:hf-to-gguf:Model successfully exported.

GGUFファイルは、クローンしたモデルのディレクトリ内に生成されている。

$ ls -lt ../karakuri-lm-8x7b-instruct-v0.1/ggml-model-f16.gguf
-rw-rw-r-- 1 kun432 kun432 93411066080  628 01:10 ../karakuri-lm-8x7b-instruct-v0.1/ggml-model-f16.gguf

そして量子化。今回はQ4_K_Mにした。

$ ./llama-quantize ../karakuri-lm-8x7b-instruct-v0.1/ggml-model-f16.gguf ../karakuri-lm-8x7b-instruct-v0.1.Q4_K_M.gguf Q4_K_M

以下のような感じで処理が進むので完了するまで待つ。

main: build = 3248 (f675b20a)
main: built with cc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 for x86_64-linux-gnu
main: quantizing '../karakuri-lm-8x7b-instruct-v0.1/ggml-model-f16.gguf' to '../karakuri-lm-8x7b-instruct-v0.1.Q4_K_M.gguf' as Q4_K_M
(snip)
llama_model_loader: - type  f32:   97 tensors
llama_model_loader: - type  f16:  226 tensors
[   1/ 323]                    token_embd.weight - [ 4096, 32128,     1,     1], type =    f16, converting to q4_K .. size =   251.00 MiB ->    70.59 MiB
[   2/ 323]           blk.0.ffn_gate_exps.weight - [ 4096, 14336,     8,     1], type =    f16, converting to q4_K .. size =   896.00 MiB ->   252.00 MiB
[   3/ 323]           blk.0.ffn_down_exps.weight - [14336,  4096,     8,     1], type =    f16, converting to q6_K .. size =   896.00 MiB ->   367.50 MiB
(snip)

完了

(snip)
[ 322/ 323]                 blk.31.attn_v.weight - [ 4096,  1024,     1,     1], type =    f16, converting to q8_0 .. size =     8.00 MiB ->     4.25 MiB
[ 323/ 323]                   output_norm.weight - [ 4096,     1,     1,     1], type =    f32, size =    0.016 MB
llama_model_quantize_internal: model size  = 89083.02 MB
llama_model_quantize_internal: quant size  = 27130.56 MB

main: quantize time = 1313236.27 ms
main:    total time = 1313236.27 ms
$ ls -lt ../karakuri-lm-8x7b-instruct-v0.1.Q4_K_M.gguf
-rw-rw-r-- 1 kun432 kun432 28449206496  628 01:48 ../karakuri-lm-8x7b-instruct-v0.1.Q4_K_M.gguf

簡単に実行してみる。プロンプトテンプレートは、HuggingFaceのモデルのページによればCommand-R-Plusと同じらしい。

$ ./llama-cli \
    -m ../karakuri-lm-8x7b-instruct-v0.1.Q4_K_M.gguf \
    -n 512 \
    -p "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>あなたは親切な日本語のアシスタントです。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>競馬の楽しみ方を簡潔に5つリストアップして。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>" \
    -ngl 0 \
    -e
<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|> あなたは親切な日本語のアシスタントです。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|> 競馬の楽しみ方を簡潔に5つリストアップして。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>


まず、競馬とは競走馬によるレースのことです。競馬の楽しみ方は人によって異なりますが、一般的には以下の5つが挙げられます。

1. **馬券を購入する**: 競馬では、馬券を購入してレースの結果を予想することができます。
2. **レースを観戦する**: 実際のレースを観戦することで、競馬の迫力やスピードを体感することができます。
3. **馬や騎手を応援する**: お気に入りの馬や騎手を見つけて、レースでの活躍を応援することも競馬の醍醐味です。
4. **競馬場でのイベントを楽しむ**: 競馬場では、レース以外にも様々なイベントや催し物が行われています。
5. **競馬を通じて交流する**: 競馬ファン同士の交流も競馬の楽しみの一つです。<|END_OF_TURN_TOKEN|> [end of text]

llama_print_timings:        load time =    2509.57 ms
llama_print_timings:      sample time =       8.19 ms /   361 runs   (    0.02 ms per token, 44099.68 tokens per second)
llama_print_timings: prompt eval time =    2204.41 ms /    59 tokens (   37.36 ms per token,    26.76 tokens per second)
llama_print_timings:        eval time =   53895.73 ms /   360 runs   (  149.71 ms per token,     6.68 tokens per second)
llama_print_timings:       total time =   56826.91 ms /   419 tokens
Log end

なお、少し余談だけども、llama.cppはGPUオフロードを有効にしてビルドしているので高速化することができる。自分の環境だと-ngl 20ぐらいでVRAM22〜23GBぐらいだった。

$ ./llama-cli \
    -m ../karakuri-lm-8x7b-instruct-v0.1.Q4_K_M.gguf \
    -n 512 \
    -p "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>あなたは親切な日本語のアシスタントです。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>競馬の楽しみ方を簡潔に5つリストアップして。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>" \
    -ngl 20 \
    -e

33レイヤー中、20レイヤーオフロードしている。

llm_load_tensors: offloading 20 repeating layers to GPU
llm_load_tensors: offloaded 20/33 layers to GPU
<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|> あなたは親切な日本語のアシスタントです。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|> 競馬の楽しみ方を簡潔に5つリストアップして。<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>
僕が思う競馬の楽しみ方を5つ挙げてみると、以下のようになるかな。

1. 馬券を買って予想が的中すると嬉しい
2. 生でレースを観戦できる
3. 競馬場で美味しい食事やお酒を楽しめる
4. 競走馬を応援できる
5. 競馬に関する情報を集めるのが楽しい<|END_OF_TURN_TOKEN|> [end of text]

llama_print_timings:        load time =    2893.44 ms
llama_print_timings:      sample time =       3.06 ms /   147 runs   (    0.02 ms per token, 48102.09 tokens per second)
llama_print_timings: prompt eval time =     853.89 ms /    59 tokens (   14.47 ms per token,    69.10 tokens per second)
llama_print_timings:        eval time =   10181.74 ms /   146 runs   (   69.74 ms per token,    14.34 tokens per second)
llama_print_timings:       total time =   11061.93 ms /   205 tokens
Log end

生成スピードが倍ぐらいになっているのがわかる。

量子化が完了したので、作業ディレクトリに戻る。

$ cd ..
kun432kun432

Ollamaでモデルの実行

量子化されたモデルをOllamaで使えるようにする。

Ollamaのインストール。前回はDockerを使ったが、今回は直接インストールする。

https://github.com/ollama/ollama

$ curl -fsSL https://ollama.com/install.sh | sh

Ollamaがサービスとして起動した。

$ ps auxw | grep ollama
ollama    435268  1.5  0.4 7571372 407132 ?      Ssl  02:26   0:04 /usr/local/bin/ollama serve

$ systemctl status ollama
● ollama.service - Ollama Service
     Loaded: loaded (/etc/systemd/system/ollama.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-06-28 02:26:27 JST; 5min ago
   Main PID: 435268 (ollama)
      Tasks: 18 (limit: 115580)
     Memory: 796.8M
        CPU: 4.854s
     CGroup: /system.slice/ollama.service
             └─435268 /usr/local/bin/ollama serve

(snip)

karakuri-lm-8x7b-instruct-v0.1用のModelfileを作成する。上にも少し書いたけど、karakuri-lm-8x7b-instruct-v0.1のプロンプトテンプレートはcommand-r+と同じらしい。

https://huggingface.co/karakuri-ai/karakuri-lm-8x7b-instruct-v0.1

The model uses the same prompt template as Command R+, except that it contains attribute values.

ということで、Ollamaにすでにあるcommand-r-plusの設定をにして書けばよさそう。

https://ollama.com/library/command-r-plus/blobs/42499e38acdf

Modelfile
FROM ./karakuri-lm-8x7b-instruct-v0.1.Q4_K_M.gguf
TEMPLATE "{{ if .System }}<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>{{ .System }}<|END_OF_TURN_TOKEN|>{{ end }}{{ if .Prompt }}<|START_OF_TURN_TOKEN|><|USER_TOKEN|>{{ .Prompt }}<|END_OF_TURN_TOKEN|>{{ end }}<|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>{{ .Response }}<|END_OF_TURN_TOKEN|>"
PARAMETER stop <|START_OF_TURN_TOKEN|>
PARAMETER stop <|END_OF_TURN_TOKEN|>"

Modelfileからモデルを作成

$ ollama create karakuri-lm-8x7b-instruct:q4_k_m -f  Modelfile
transferring model data
using existing layer sha256:2b778525d055b411a95a78c9ff179409ab313e0a1e2f08046c7d7086a8f3979c
creating new layer sha256:42499e38acdff5e24aecef98617114c4cb6cb50e4c533b3e22e1bfd65b543418
creating new layer sha256:9de5ae2d5df48deab97ceb57d211ed46314a91bd372a7cc85414d5a0aa8a96b7
creating new layer sha256:b4714bbdc386fff0c400aa67c6e9d3b2a4849bc6d60e099c95f6c5634b9cdb3a
writing manifest
success

成功。確認。

$ ollama ls
NAME                            	ID          	SIZE 	MODIFIED
karakuri-lm-8x7b-instruct:q4_k_m	0053fa858528	28 GB	50 seconds ago
$ ollama run karakuri-lm-8x7b-instruct:q4_k_m
>>> /set system あなたは親切な日本語のアシスタントです。
Set system message.
>>> 競馬の楽しみ方を簡潔に5つリストアップして。

1.好きなサラブレッド(お気に入り)を決めること
2.購入する馬券の種類を決めること
3.実際に競馬場へ行ってみること
4.スマホやパソコンで生配信を視聴すること
5.SNSでレース結果などをチェックすること

とりあえず問題なさそう。

kun432kun432

LlamaIndexを使ったエージェントのFunction Calling・RAG

ではFunction CallingとRAGを試してみる。JupyterLab上でLlamaIndexを使って書いていく。

まず、JupyterLab諸々をインストール

$ pip install -U pip jupyterlab black ruff jupyterlab-lsp python-lsp-server python-lsp-ruff jupyterlab-code-formatter jupytext jupyterlab-git nbdime ipywidgets

JupyterLabを起動

$ jupyter-lab --ip="0.0.0.0" --NotebookApp.token=""

パッケージのインストール。Ollamaのインテグレーションをセットでインストール。あとトレーシング用にArize Phoenixのインテグレーションをインストールする。で、LLMはOllamaでいいのだけども、EmbeddingsはOllamaのものは日本語の実績がなさそうに思えた。そこで今回はEmbeddingsはOpenAIを使おうと思う。.envを読み込むためのライブラリをインストールしているのはこのため。

!pip install llama-index llama-index-llms-ollama llama-index-callbacks-arize-phoenix python-dotenv
!pip freeze | egrep "llama-"
llama-cloud==0.0.6
llama-index==0.10.50
llama-index-agent-openai==0.2.7
llama-index-callbacks-arize-phoenix==0.1.5
llama-index-cli==0.1.12
llama-index-core==0.10.50
llama-index-embeddings-openai==0.1.10
llama-index-indices-managed-llama-cloud==0.2.1
llama-index-legacy==0.9.48
llama-index-llms-ollama==0.1.5
llama-index-llms-openai==0.1.23
llama-index-multi-modal-llms-openai==0.1.6
llama-index-program-openai==0.1.6
llama-index-question-gen-openai==0.1.3
llama-index-readers-file==0.1.25
llama-index-readers-llama-parse==0.1.4
llama-parse==0.4.4
openinference-instrumentation-llama-index==2.0.0

ということで、.envを作成しておく。JupyterLab上からはドット付きファイルを作成できない(知らないだけかもしれないけど)ので、ターミナル等で作業ディレクトリに直接ファイルを作成する。

.env
OPENAI_API_KEY=sk-XXXXXXXXXXXXXXXXXXX

Jupyterに戻って、もろもろの準備。

.envの読み込み。

from dotenv import load_dotenv

load_dotenv(verbose=True)

Arize Phoenixのトレーシングを有効化。

import phoenix as px
import llama_index.core

px.launch_app()
llama_index.core.set_global_handler("arize_phoenix")

表示されたURLにブラウザでアクセスすると、Arize Phoenixのトレーシングが表示される。以下localhostとなっているが、自分の場合はリモートサーバなのでIPアドレスを書き換えてアクセス。

🌍 To view the Phoenix app in your browser, visit http://localhost:6006/
📖 For more information on how to use Phoenix, check out https://docs.arize.com/phoenix

こんな画面が表示される。

notebookなのでイベントループのネストを有効化しておく。

import nest_asyncio

nest_asyncio.apply()

ではまずシンプルにOllamaを使ったChatCompletionから。

from llama_index.llms.ollama import Ollama
from llama_index.core.llms import ChatMessage

llm = Ollama(model="karakuri-lm-8x7b-instruct:q4_k_m", temperature=0.1)

messages = [
    ChatMessage(
        role="system",
        content="あなたは親切な日本語のアシスタントです。"
    ),
    ChatMessage(
        role="user",
        content="競馬の楽しみ方を簡潔に5つリストアップして。"
    ),
]
response = llm.chat(messages)
print(response)

assistant:

  1. 予想すること
  2. 賭けること
  3. レースを見ること
  4. 勝ち馬を当てること
  5. 競馬場で飲むビール

次に簡単なエージェントでFunction Callingを試してみる。

from llama_index.core.tools import FunctionTool
from llama_index.llms.ollama import Ollama
from llama_index.core.agent import ReActAgent


# ツールを定義
def multiply(a: int, b: int) -> int:
    """2つの整数を乗算し、結果を整数で返す。"""
    return a * b


multiply_tool = FunctionTool.from_defaults(fn=multiply)

# llmを初期化
llm = Ollama(model="karakuri-lm-8x7b-instruct:q4_k_m",temperature=0.1)

# ReActエージェントを初期化
agent = ReActAgent.from_tools([multiply_tool], llm=llm, verbose=True)
agent.chat("2123 かける 215123 は?")
Thought: The current language of the user is: Japanese. I need to use a tool to help me answer the question.
Action: multiply
Action Input: {'a': 2123, 'b': 215123}
Observation: 456706129
Thought: I can answer without using any more tools. I'll use the user's language to answer
Answer: 456706129

シンプルなものではあるけれどもFunction CallingとReActエージェントが動作しているのがわかる。トレーシングでも確認できる。

では次にRAGも含めたエージェントを作ってみる。以下のドキュメントをRAGのコンテキストとして使う。

https://ja.wikipedia.org/wiki/キタサンブラック

https://ja.wikipedia.org/wiki/ドゥラメンテ

まずインデックスを作成していくが、あくまでも動作のテストなので、インデックスの作り方はあまり気にせず雑にやる。

from pathlib import Path
import requests
import re

def replace_heading(match):
    level = len(match.group(1))
    return '#' * level + ' ' + match.group(2).strip()

# Wikipediaからのデータ読み込み
wiki_titles = ["キタサンブラック", "ドゥラメンテ"]
for title in wiki_titles:
    response = requests.get(
        "https://ja.wikipedia.org/w/api.php",
        params={
            "action": "query",
            "format": "json",
            "titles": title,
            "prop": "extracts",
            # 'exintro': True,
            "explaintext": True,
        },
    ).json()
    page = next(iter(response["query"]["pages"].values()))
    wiki_text = f"# {title}\n\n## 概要\n\n"
    wiki_text += page["extract"]

    wiki_text = re.sub(r"(=+)([^=]+)\1", replace_heading, wiki_text)
    wiki_text = re.sub(r"\t+", "", wiki_text)
    wiki_text = re.sub(r"\n{3,}", "\n\n", wiki_text)
    data_path = Path("data")
    if not data_path.exists():
        Path.mkdir(data_path)

    with open(data_path / f"{title}.txt", "w") as fp:
        fp.write(wiki_text)

エージェントにツールを選択させるために、ここでは別々のインデックスにわけて、それぞれのQuery Engineを作成している。

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.openai import OpenAIEmbedding

kitasan_docs = SimpleDirectoryReader(input_files=["data/キタサンブラック.txt"]).load_data()
duramente_docs = SimpleDirectoryReader(input_files=["data/ドゥラメンテ.txt"]).load_data()

embed_model = OpenAIEmbedding(model="text-embedding-3-small")

kitasan_index = VectorStoreIndex.from_documents(
    kitasan_docs,
    embed_model=embed_model,
    show_progress=True
)
duramente_index = VectorStoreIndex.from_documents(
    duramente_docs,
    embed_model=embed_model,
    show_progress=True
)

kitasan_query_engine = kitasan_index.as_query_engine(similarity_top_k=5)
duramente_query_engine = duramente_index.as_query_engine(similarity_top_k=5)

LlamaIndexではQueryEngineToolを使うと、RAGのQuery Engineをエージェントのツールとして使えるようになる。これを使ってツールを定義して、ReActエージェントを作成した。

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import QueryEngineTool, ToolMetadata

query_engine_tools = [
    QueryEngineTool(
        query_engine=kitasan_query_engine,
        metadata=ToolMetadata(
            name="kitasan_black_tool",
            description="日本の競走馬「キタサンブラック」に関する情報を提供する。 "
            "プレーンなテキストで詳細に書かれた質問をツールの入力として使用する。",
        ),
    ),
    QueryEngineTool(
        query_engine=duramente_query_engine,
        metadata=ToolMetadata(
            name="duramente_tool",
            description="日本の競走馬「ドゥラメンテ」に関する情報を提供する。 "
            "プレーンなテキストで詳細に書かれた質問をツールの入力として使用する。",
        ),
    ),
]

llm = Ollama(model="karakuri-lm-8x7b-instruct:q4_k_m", temperature=0.1)

agent = ReActAgent.from_tools(query_engine_tools, llm=llm, verbose=True)

では、キタサンブラックについてのクエリを投げてみる。

response = agent.chat("キタサンブラックの代表産駒について教えて。")

print("回答:", response.response)
print("根拠:")
print("===")
print("\n---\n".join([n.text.replace("\n","")[:100] + "..." for n in response.source_nodes]))
print("===")

結果

回答: イクイノックス(牡、母父:キングヘイロー、2021年東京スポーツ杯2歳ステークス、2022年・2023年天皇賞(秋)、2022年有馬記念、2023年ドバイシーマクラシック、宝塚記念、ジャパンカップ)とソールオリエンス(牡、母父:Motivator、2023年京成杯、皐月賞)がキタサンブラックの代表産駒として知られています。
根拠:
===
## 競走成績以下の内容は、netkeiba並びにJBISサーチの情報に基づく。タイム欄のRはレコード勝ちを示す。## 種牡馬成績### 年度別成績### 重賞優勝産駒一覧#### GI級競走優勝産駒...
---
翌2017年は、GI昇格初年度の大阪杯を優勝し、天皇賞(春)は2006年ディープインパクトを上回るレコードを樹立して連勝とした。続く宝塚記念では、設置初年度となった「春の古馬三冠競走」戴冠が懸かったが...
---
なかなか売り手がつかないことから牧場と馬主の共同名義で競走馬としてデビューさせようと考えていた。その後、ヤナガワ牧場と約半世紀の付き合いがあるという北島三郎が「顔が二枚目。僕とよく似ている」「目も顔も...
---
2017年、春の古馬GI3連勝が懸かった宝塚記念こそ9着大敗するも、それ以外ではすべて馬券圏内で応えていた。ただ勝利で応えたのは引退レース、挑戦3回目の有馬記念だけだった。前々年の有馬記念は3着、前年...
---
## エピソード### 北島三郎北島三郎は、2013年に紅白歌合戦を卒業し、2015年1月に劇場の座長公演を終了するなど一線から身を引き始めていたが、キタサンブラックはその直後の2015年1月31日に...
===

ReActエージェントの出力はこんな感じ。

クエリに応じてツールを選択して、FunctionCallingを使ってインデックス検索しているのがわかる。

トレースも抜粋。

続けてドゥラメンテについても。

response = agent.chat("じゃあドゥラメンテの血統についても教えて。")

print("回答:", response.response)
print("根拠:")
print("===")
print("\n---\n".join([n.text.replace("\n","")[:100] + "..." for n in response.source_nodes]))
print("===")
回答: タイトルホルダー(牡、母父:ディープインパクト、2021年菊花賞、有馬記念)、スターズオンアース(牝、母父:キングヘイロー、2022年桜花賞、優駿牝馬、秋華賞、エリザベス女王杯)、リバティアイランド(牝、母父:ディープインパクト、2023年フローラステークス、優駿牝馬)などの代表産駒がいます。
根拠:
===
ミルコ・デムーロは皐月賞後のインタビューで「(2003年に自身が騎乗して二冠を制した)ネオユニヴァースに似てるね。本当に強い馬」と語り、「馬体がそっくり。それから頭、考え方みたいなものもよく似ている」...
---
# ドゥラメンテ## 概要ドゥラメンテ(欧字名:Duramente、2012年3月22日 - 2021年8月31日) は、日本の競走馬・種牡馬。馬名の意味は、イタリア語の "duramente" (荒...
---
長らくディープインパクトが守ってきたJRAリーディングサイアーのタイトルを獲得した。ディープインパクト以外の種牡馬がJRAリーディングサイアーを獲得したのは、自身の父であるキングカメハメハが2011年...
---
2022年11月3日、ヴァレーデラルナがJBCレディスクラシックを制し、産駒のダートGI級競走初勝利を果たした。2022年12月11日、リバティアイランドが阪神ジュベナイルフィリーズを制し、産駒の2歳...
---
5月31日の第82回東京優駿では単勝1.9倍で1番人気となった。レースでは折り合いが心配されていたが、道中は中団に位置し、直線に入ると坂の途中で先頭に立ち、押し寄せる後続馬をものともせずに押し切り勝利...
===

実行してから気づいたのだけど、ちょっとクエリをミスってて(代表産駒について聞きたかったのが血統になってしまった)、chatメソッド使ってるので前回の会話履歴からクエリを書き換えてくれてはいるのだけど、これはこれで正しいのかわからないな。あと、こちらはすこしハルシネーションしてる。

とりあえず一応RAGエージェントとしても動作自体は確認できたかな。

kun432kun432

まとめ

とりあえず動作は確認できたけどシンプルなことしかやってないので、karakuri-lm-8x7b-instruct-v0.1がエージェントに強いかどうかは、これだけだと判断できないと思う。実際にGemma2-9bに置き換えてみたけど、普通に動作したし。

やるんなら、マルチエージェント用のフレームワークとか使って試すのが良いのかなーと思っているところ。

あと、やっぱりハルシネーションはそこそこある気がする。上には書いてないけど、モデル自体が持ってる知識を問うような質問だとちょっと怪しい回答をするときがそれなりにある。このあたりは量子化によるところも関連してきそう。メモリが許すならばQ5_K_Mあたりに変えて試してみたいなと言う気がしている。

kun432kun432

Ollama、GPUオフロードの割合をどうやら自動で調整してくれる様子。賢い。

$ ollama ps
NAME                            	ID          	SIZE 	PROCESSOR      	UNTIL
karakuri-lm-8x7b-instruct:q4_k_m	0053fa858528	31 GB	25%/75% CPU/GPU	4 minutes from now
このスクラップは5ヶ月前にクローズされました