CLOVER🍀

That was when it all began.

LangChain+Ollamaでこのブログを題材にしたRAGを作ってみる

これは、なにをしたくて書いたもの?

前に、LangChainのRAGのチュートリアルをやってみました。

LangChainのチュートリアル、RAG Part 1を試す(LangSmith、LangGraphなし) - CLOVER🍀

LangChainのチュートリアル、RAG Part 1を試す(LangSmithなし、LangGraphあり) - CLOVER🍀

LangChainのチュートリアル、RAG Part 2を試す - CLOVER🍀

今回は、このあたりで学んだ内容を使ってこのブログを題材にしたRAGを作ってみます。

お題

LangChainのRAGのチュートリアルを、このブログに書いたエントリーを使うように変更してみたいと思います。

このブログ、つまりここですね。

CLOVER🍀

以下の部分で取得する外部ドキュメントが、このブログになります。

  • 外部ドキュメントのロード
  • ロードしたドキュメントのベクトル化
  • ベクトルデーベースへの保存

Document Loaderとしては、RecursiveUrlLoaderを使います。これは、ルートURLからリンクをたどってドキュメントを
取得するローダーです。

Recursive URL | 🦜️🔗 LangChain

とはいえ、書いたエントリー数はそこそこあるので、あまりトライ&エラーを繰り返すのはアクセス負荷的に気が引けるので、
1度ブログ全体をローカルにダウンロードしてnginxでホストし、そちらに対してアクセスする形態にします。

ブログ全体をダウンロードするのには、wgetを使いました。

wgetでWebサイトをダウンロードする - CLOVER🍀

あとはチュートリアルとあまり変わりません。

モデルを動作させるのにはOllamaを使い、各タスクで使用するモデルは以下とします。

この前提で進めていきます。

対象とするエントリー

このブログのエントリーを外部ドキュメントとして使うと書きましたが、すべてのエントリーをベクトル化するととんでもなく
時間がかかるので(手元の環境だと50時間以上かかりそうな感じでした…)、今回は以下の3つに絞りたいと思います。

Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀

Open WebUIを使って、OllamaをWeb UIから操作する - CLOVER🍀

OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀

ちなみに、エントリーを選ぶ時にはOpen WebUIのRAGの機能を使って題材として適切かどうかを確認していました。

Open WebUI+OllamaでRAGを試す - CLOVER🍀

環境

今回の環境はこちら。

$ python3 --version
Python 3.12.3


$ uv --version
uv 0.6.11

Ollama。

$ bin/ollama serve


$ bin/ollama --version
ollama version is 0.6.3

CPU環境です。

$ grep 'model name' /proc/cpuinfo
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P

Qdrantは172.17.0.2で動作しているものとします。

$ ./qdrant --version
qdrant 1.13.5

nginx。172.17.0.3で動作しているものとします。また、このブログのエントリーをHTMLでダウンロードして
ドキュメントルートで公開しているものとします。

$ nginx -v
nginx version: nginx/1.27.4

プロジェクトを作成する

uvでプロジェクトを作成します。

$ uv init --vcs none clover-rag
$ cd clover-rag

依存ライブラリーを追加。

$ uv add langchain-community langchain-ollama langchain-qdrant beautifulsoup4 lxml langgraph


$ uv add --dev mypy ruff types-requests

インストールされた依存関係の一覧。

$ uv pip list
Package                  Version
------------------------ ---------------
aiohappyeyeballs         2.6.1
aiohttp                  3.11.14
aiosignal                1.3.2
annotated-types          0.7.0
anyio                    4.9.0
attrs                    25.3.0
beautifulsoup4           4.13.3
certifi                  2025.1.31
charset-normalizer       3.4.1
dataclasses-json         0.6.7
frozenlist               1.5.0
greenlet                 3.1.1
grpcio                   1.71.0
grpcio-tools             1.71.0
h11                      0.14.0
h2                       4.2.0
hpack                    4.1.0
httpcore                 1.0.7
httpx                    0.28.1
httpx-sse                0.4.0
hyperframe               6.1.0
idna                     3.10
jsonpatch                1.33
jsonpointer              3.0.0
langchain                0.3.21
langchain-community      0.3.20
langchain-core           0.3.49
langchain-ollama         0.3.0
langchain-qdrant         0.2.0
langchain-text-splitters 0.3.7
langgraph                0.3.21
langgraph-checkpoint     2.0.23
langgraph-prebuilt       0.1.7
langgraph-sdk            0.1.60
langsmith                0.3.19
lxml                     5.3.1
marshmallow              3.26.1
multidict                6.2.0
mypy                     1.15.0
mypy-extensions          1.0.0
numpy                    2.2.4
ollama                   0.4.7
orjson                   3.10.16
ormsgpack                1.9.1
packaging                24.2
portalocker              2.10.1
propcache                0.3.1
protobuf                 5.29.4
pydantic                 2.11.1
pydantic-core            2.33.0
pydantic-settings        2.8.1
python-dotenv            1.1.0
pyyaml                   6.0.2
qdrant-client            1.13.3
requests                 2.32.3
requests-toolbelt        1.0.0
ruff                     0.11.2
setuptools               78.1.0
sniffio                  1.3.1
soupsieve                2.6
sqlalchemy               2.0.40
tenacity                 9.0.0
types-requests           2.32.0.20250328
typing-extensions        4.13.0
typing-inspect           0.9.0
typing-inspection        0.4.0
urllib3                  2.3.0
xxhash                   3.5.0
yarl                     1.18.3
zstandard                0.23.0

pyproject.toml

[project]
name = "clover-rag"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "beautifulsoup4>=4.13.3",
    "langchain-community>=0.3.20",
    "langchain-ollama>=0.3.0",
    "langchain-qdrant>=0.2.0",
    "langgraph>=0.3.21",
    "lxml>=5.3.1",
]

[dependency-groups]
dev = [
    "mypy>=1.15.0",
    "ruff>=0.11.2",
    "types-requests>=2.32.0.20250328",
]

[tool.mypy]
strict = true
disallow_any_unimported = true
#disallow_any_expr = true
disallow_any_explicit = true
warn_unreachable = true
pretty = true

ドキュメントをロードする

最初はドキュメントをロードします。

load_blog_entries.py

import aiohttp
from bs4 import BeautifulSoup, XMLParsedAsHTMLWarning
import logging
from langchain_community.document_loaders import RecursiveUrlLoader
from langchain_ollama import OllamaEmbeddings
from langchain_qdrant import QdrantVectorStore
from langchain_text_splitters import RecursiveCharacterTextSplitter
from qdrant_client import QdrantClient
from qdrant_client.http.models import Distance, VectorParams
import requests
from typing import Union
import warnings

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(message)s")

warnings.filterwarnings("ignore", category=XMLParsedAsHTMLWarning)


def bs4_extractor(html: str) -> str:
    soup = BeautifulSoup(html, "lxml")
    return "\n".join(str(tag) for tag in soup.select(".hatenablog-entry"))


def metadata_extractor(
    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]
) -> dict[str, str | list[str]]:
    """Extract metadata from raw html using BeautifulSoup."""
    content_type = getattr(response, "headers").get("Content-Type", "")
    metadata = {"source": url, "content_type": content_type}

    soup = BeautifulSoup(raw_html, "html.parser")

    if title := soup.find("title"):
        metadata["title"] = title.get_text()
    if description := soup.find("meta", attrs={"name": "description"}):
        metadata["description"] = description.get("content", None)
    if html := soup.find("html"):
        metadata["language"] = html.get("lang", None)
    if categories := soup.select(".entry-category-link "):
        metadata["categories"] = [category.get_text() for category in categories]

    return metadata


logging.info("load blog entries")

loader = RecursiveUrlLoader(
    "http://172.17.0.3/",
    # "https://kazuhira-r.hatenablog.com/"
    max_depth=10,
    extractor=bs4_extractor,
    metadata_extractor=metadata_extractor,
)

all_docs = loader.load()

blog_entries = {}

target_urls = [
    "/entry/2024/10/19/200719",  # Valkey
    "/entry/2025/02/22/205125",  # Open WebUI
    "/entry/2025/03/16/002801",  # Gemma 3
]


for doc in all_docs:
    url = doc.metadata["source"]

    if any(u in url for u in target_urls):
        # if "/entry/" in url:
        if url.endswith(".html"):
            blog_entries[url] = doc
        else:
            blog_entries[f"{url}.html"] = doc

logger.info(f"target blog entries, count = {len(blog_entries)}")

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=200,
    add_start_index=True,
)

all_splits = text_splitter.split_documents(blog_entries.values())

logger.info(f"split count = {len(all_splits)}")

embeddings = OllamaEmbeddings(
    model="kun432/cl-nagoya-ruri-large:337m", base_url="http://localhost:11434"
)

client = QdrantClient("http://172.17.0.2:6333")
client.delete_collection(collection_name="clover_entries_collection")
client.create_collection(
    collection_name="clover_entries_collection",
    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
)

vector_store = QdrantVectorStore(
    client=client, collection_name="clover_entries_collection", embedding=embeddings
)

_ = vector_store.add_documents(all_splits)

RecursiveUrlLoaderを使って、ブログ内のリンクをたどってドキュメントをロードします。アクセス先はnginxにしています。

loader = RecursiveUrlLoader(
    "http://172.17.0.3/",
    # "https://kazuhira-r.hatenablog.com/"
    max_depth=10,
    extractor=bs4_extractor,
    metadata_extractor=metadata_extractor,
)

extractormetadata_extractorをつけていますが、extractorはHTML内のエントリーのメイン部分を抽出しています。

def bs4_extractor(html: str) -> str:
    soup = BeautifulSoup(html, "lxml")
    return "\n".join(str(tag) for tag in soup.select(".hatenablog-entry"))

ブログエントリーのHTMLをそのまま扱ってしまうと、ヘッダーやフッター、サイドバーの内容などエントリー本体に
関係しないものまで対象にしてしまうので。

metadata_extractorの方では、エントリーにつけているカテゴリーをメタデータとして取り込むことにしました。

def metadata_extractor(
    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]
) -> dict[str, str | list[str]]:
    """Extract metadata from raw html using BeautifulSoup."""
    content_type = getattr(response, "headers").get("Content-Type", "")
    metadata = {"source": url, "content_type": content_type}

    soup = BeautifulSoup(raw_html, "html.parser")

    if title := soup.find("title"):
        metadata["title"] = title.get_text()
    if description := soup.find("meta", attrs={"name": "description"}):
        metadata["description"] = description.get("content", None)
    if html := soup.find("html"):
        metadata["language"] = html.get("lang", None)
    if categories := soup.select(".entry-category-link "):
        metadata["categories"] = [category.get_text() for category in categories]

    return metadata

このカテゴリーは今回は使っていないんですけどね。

ロードしたドキュメントは、最初に挙げた3つのエントリーに絞り込みます。

all_docs = loader.load()

blog_entries = {}

target_urls = [
    "/entry/2024/10/19/200719",  # Valkey
    "/entry/2025/02/22/205125",  # Open WebUI
    "/entry/2025/03/16/002801",  # Gemma 3
]


for doc in all_docs:
    url = doc.metadata["source"]

    if any(u in url for u in target_urls):
        # if "/entry/" in url:
        if url.endswith(".html"):
            blog_entries[url] = doc
        else:
            blog_entries[f"{url}.html"] = doc

全部放り込んでしまうと、この後のベクトル化でとんでもなく時間がかかるからですね…。全部取り込もうと思うとパスに
/entry/が入ったものを対象にすればOKです。

.htmlをつけているのはローカルファイルを対象にしていて、かつパスを揃えるためです。

ところでRecursiveUrlLoaderを使ってドキュメントを取得する時に、同じコード、ドキュメントに対して実行しても取得結果が
違ったりしました。今回対象にしているドキュメントも、取得できたりできなかったりと揺らいでいたのですが…これは
どうしてでしょうね?(あまり深追いしませんでした)。

Text Splittersには、チュートリアルと同じくRecursiveCharacterTextSplitterを使いました。

    chunk_size=500,
    chunk_overlap=200,
    add_start_index=True,
)

all_splits = text_splitter.split_documents(blog_entries.values())

HTML用のText Splittersを使ってもよかったのですが、今回はチャンクサイズを小さくしないとOllamaでエラーになって
しまうのと、自分のブログエントリー的にあまりよい区切りができない気がしたのでそのままにしました。

How to split HTML | 🦜️🔗 LangChain

実行。

$ uv run load_blog_entries.py
2025-03-31 12:48:14,790 - load blog entries
2025-03-31 12:50:14,352 - target blog entries, count = 3
2025-03-31 12:50:14,355 - split count = 168
2025-03-31 12:50:14,428 - HTTP Request: GET http://172.17.0.2:6333 "HTTP/1.1 200 OK"
2025-03-31 12:50:14,434 - HTTP Request: DELETE http://172.17.0.2:6333/collections/clover_entries_collection "HTTP/1.1 200 OK"
2025-03-31 12:50:14,935 - HTTP Request: PUT http://172.17.0.2:6333/collections/clover_entries_collection "HTTP/1.1 200 OK"
2025-03-31 12:50:14,938 - HTTP Request: GET http://172.17.0.2:6333/collections/clover_entries_collection "HTTP/1.1 200 OK"
2025-03-31 12:50:14,999 - HTTP Request: POST http://localhost:11434/api/embed "HTTP/1.1 200 OK"
2025-03-31 12:51:14,900 - HTTP Request: POST http://localhost:11434/api/embed "HTTP/1.1 200 OK"
2025-03-31 12:51:14,967 - HTTP Request: PUT http://172.17.0.2:6333/collections/clover_entries_collection/points?wait=true "HTTP/1.1 200 OK"
2025-03-31 12:51:58,907 - HTTP Request: POST http://localhost:11434/api/embed "HTTP/1.1 200 OK"
2025-03-31 12:51:58,970 - HTTP Request: PUT http://172.17.0.2:6333/collections/clover_entries_collection/points?wait=true "HTTP/1.1 200 OK"
2025-03-31 12:52:22,556 - HTTP Request: POST http://localhost:11434/api/embed "HTTP/1.1 200 OK"
2025-03-31 12:52:22,591 - HTTP Request: PUT http://172.17.0.2:6333/collections/clover_entries_collection/points?wait=true "HTTP/1.1 200 OK"

ドキュメントの取得に2分ほど、3つのドキュメントをQdrantに登録するのに2分ほどかかっています。

QdrantのPointの数としては168になるのですが、今回は比較的文章量の少ないものを選んだのでかなり小さくなっています。

取り込んだPointのイメージはこんな感じです。metadataに、エントリーにつけているカテゴリーが「categories」として
取り込まれています。

質問してみる

あとはRAGを作るコードを書くだけです。

こちらはあまりチュートリアルと変わりません。

clover_rag.py

from langchain_core.documents import Document
from langchain_core.prompts import PromptTemplate
from langchain_ollama import OllamaEmbeddings
from langchain_ollama import ChatOllama
from langchain_qdrant import QdrantVectorStore
from qdrant_client import QdrantClient
from langgraph.graph import START, StateGraph
import sys
from typing_extensions import TypedDict

question = sys.argv[1]

embeddings = OllamaEmbeddings(
    model="kun432/cl-nagoya-ruri-large:337m", base_url="http://localhost:11434"
)

client = QdrantClient("http://172.17.0.2:6333")

vector_store = QdrantVectorStore(
    client=client, collection_name="clover_entries_collection", embedding=embeddings
)

prompt = PromptTemplate.from_template("""あなたは質問応答のアシスタントです。質問に答えるために、検索されたコンテキストの以下の部分を使用してください。答えがわからない場合は 、わからないと答えてください。
質問: {question}
コンテキスト: {context} """)

llm = ChatOllama(model="gemma3:4b", temperature=0, base_url="http://localhost:11434")


class State(TypedDict):
    question: str
    context: list[Document]
    answer: str


def retrieve(state: State) -> dict[str, list[Document]]:
    print(f"retrieve state = {state}")
    print()
    retrieved_docs = vector_store.similarity_search(state["question"])
    return {"context": retrieved_docs}


def generate(state: State) -> dict[str, str]:
    print("generate state:")
    print(f"  question: {state['question']}")
    print(f"  contexts({len(state['context'])}):")
    for c in state["context"]:
        print("    metadata:")
        print(f"      _id: {c.metadata['_id']}")
        print(f"      _collection_name: {c.metadata['_collection_name']}")
        print(f"      url: {c.metadata['source']}")
        print(f"      content-type: {c.metadata['content_type']}")
        print(f"      title: {c.metadata['title']}")
        print(f"      description: {c.metadata['description']}")
        print(f"      language: {c.metadata['language']}")
        print(f"      categories: {c.metadata['categories']}")
        print(f"      start_index: {c.metadata['start_index']}")
        print(f"    page_content: {c.page_content}")
        print()
    print()
    docs_content = "\n\n".join(doc.page_content for doc in state["context"])
    messages = prompt.invoke({"question": state["question"], "context": docs_content})

    print(f"messages = {messages}")
    print()

    response = llm.invoke(messages)
    return {"answer": response.content}


graph_builder = StateGraph(State).add_sequence([retrieve, generate])
graph_builder.add_edge(START, "retrieve")
graph = graph_builder.compile()

response = graph.invoke({"question": question})
print(f"回答 = {response['answer']}")

print()

print("レスポンス:")
print(f"  answer: {response['answer']}")
print(f"  question: {response['question']}")
print(f"  contexts({len(response['context'])}):")
for c in response["context"]:
    print("    metadata:")
    print(f"      _id: {c.metadata['_id']}")
    print(f"      _collection_name: {c.metadata['_collection_name']}")
    print(f"      url: {c.metadata['source']}")
    print(f"      content-type: {c.metadata['content_type']}")
    print(f"      title: {c.metadata['title']}")
    print(f"      description: {c.metadata['description']}")
    print(f"      language: {c.metadata['language']}")
    print(f"      categories: {c.metadata['categories']}")
    print(f"      start_index: {c.metadata['start_index']}")
    print(f"    page_content: {c.page_content}")
    print()

質問はコマンドライン引数として与え、コンテキストの内容を少し整形して出力するようにしました。

では、質問してみましょう。

Valkeyについて質問。

$ uv run clover_react_agent.py 'Valkeyとはなんでしょうか?'
error: Failed to spawn: `clover_react_agent.py`
  Caused by: No such file or directory (os error 2)
kazuhira@ikaruga:~/study/llm/clover/langchain-examples/clover-rag$ uv run clover_rag.py 'Valkeyとはなんでしょうか?'
retrieve state = {'question': 'Valkeyとはなんでしょうか?'}

generate state:
  question: Valkeyとはなんでしょうか?
  contexts(4):
    metadata:
      _id: 15e4e3a2-e26a-43d5-a8b6-50c578093cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。</p>
<p><a href="https://www.publickey1.jp/blog/24/redisvalkeyvalkey_80io.html">Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレ ッディングによる高速化など強化 - Publickey</a></p>
<h4 id="Valkey">Valkey</h4>
<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>

    metadata:
      _id: 72c4396f-4808-4b0e-9119-ca08a8bf1613
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 320
    page_content: <h4 id="Valkey">Valkey</h4>
<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>
<p><a href="https://www.publickey1.jp/blog/24/redisredis.html">Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必 須に - Publickey</a></p>
<p>つまり、Redis互換のインメ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E2%A5%EA%A1%BC">モリー</a>データストア、キーバリューストアということになります。</p>
<p>ValkeyのWebサイトはこちら。</p>
<p><a href="https://valkey.io/">Valkey</a></p>

    metadata:
      _id: c81d44e5-6321-4eed-bdce-ce64c3c8bb30
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 17382
    page_content: <p>確認。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ valkey-cli
127.0.0.1:6379&gt; set key1 value1
OK
127.0.0.1:6379&gt; get key1
"value1"</pre>
<p>OKですね。</p>
<h4 id="おわりに">おわりに</h4>
<p>Redis互換のキーバリューストア、Valkeyを試してみました。もとがRedisなので、使い方はほぼ変わらないですね。</p>
<p>自分はこういうものは大元の方を使い続けることが多いのですが、Redis/Valkeyに関してはValkeyも扱っておいた方がよさそうかなと思って<br/>
試してみることにしました。</p>
<p>今後、このブログで扱うのがRedis寄りになるのかValkey寄りになるのかは微妙なところですが、まずはValkeyの周辺事情も押さえておこうと<br/>
思います。</p>
</div>

    metadata:
      _id: 3647e8b1-441c-48dd-904a-2b1582070897
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 1602
    page_content: <blockquote><p>Valkey can be compiled and used on <a class="keyword" href="https://d.hatena.ne.jp/keyword/Linux">Linux</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/OSX">OSX</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/OpenBSD">OpenBSD</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/NetBSD">NetBSD</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/FreeBSD">FreeBSD</a>.</p></blockquote>


messages = text='あなたは質問応答のアシスタントです。質問に答えるために、検索されたコンテキストの以下の部分を使用してください。答えがわからない場合は、わからないと答えてくだ さい。\n質問: Valkeyとはなんでしょうか?\nコンテキスト: <div class="entry-content hatenablog-entry">\n<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>\n<p>RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。</p>\n<p><a href="https://www.publickey1.jp/blog/24/redisvalkeyvalkey_80io.html">Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey</a></p>\n<h4 id="Valkey">Valkey</h4>\n<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>\n\n<h4 id="Valkey">Valkey</h4>\n<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>\n<p><a href="https://www.publickey1.jp/blog/24/redisredis.html">Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセン ス契約が必須に - Publickey</a></p>\n<p>つまり、Redis互換のインメ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E2%A5%EA%A1%BC">モリー</a>データストア、キーバリ ューストアということになります。</p>\n<p>ValkeyのWebサイトはこちら。</p>\n<p><a href="https://valkey.io/">Valkey</a></p>\n\n<p>確認。</p>\n<pre class="code shell" data-lang="shell" data-unlink="">$ valkey-cli\n127.0.0.1:6379&gt; set key1 value1\nOK\n127.0.0.1:6379&gt; get key1\n"value1"</pre>\n<p>OKですね。</p>\n<h4 id="おわりに">おわりに</h4>\n<p>Redis互換のキーバリューストア、Valkeyを試してみました。もとがRedisなので、使い方はほぼ変わらないですね。</p>\n<p>自分はこういうものは大元の方を使い続けることが多いのですが 、Redis/Valkeyに関してはValkeyも扱っておいた方がよさそうかなと思って<br/>\n試してみることにしました。</p>\n<p>今後、このブログで扱うのがRedis寄りになるのかValkey寄りになるのかは微妙なところですが、まずはValkeyの周辺事情も押さえておこうと<br/>\n思います。</p>\n</div>\n\n<blockquote><p>Valkey can be compiled and used on <a class="keyword" href="https://d.hatena.ne.jp/keyword/Linux">Linux</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/OSX">OSX</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/OpenBSD">OpenBSD</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/NetBSD">NetBSD</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/FreeBSD">FreeBSD</a>.</p></blockquote> '

回答 = Valkeyは、Redisのフォークプロジェクトです。ライセンスが変更されたRedisのフォークであり、Redis互換のインメモリキーバリューストアです。Linux、OSX、OpenBSD、NetBSD、FreeBSDなど、様々なOSでコンパイルして使用できます。

レスポンス:
  answer: Valkeyは、Redisのフォークプロジェクトです。ライセンスが変更されたRedisのフォークであり、Redis互換のインメモリキーバリューストアです。Linux、OSX、OpenBSD、NetBSD、FreeBSDなど、様々なOSでコンパイルして使用できます。
  question: Valkeyとはなんでしょうか?
  contexts(4):
    metadata:
      _id: 15e4e3a2-e26a-43d5-a8b6-50c578093cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。</p>
<p><a href="https://www.publickey1.jp/blog/24/redisvalkeyvalkey_80io.html">Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレ ッディングによる高速化など強化 - Publickey</a></p>
<h4 id="Valkey">Valkey</h4>
<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>

    metadata:
      _id: 72c4396f-4808-4b0e-9119-ca08a8bf1613
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 320
    page_content: <h4 id="Valkey">Valkey</h4>
<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>
<p><a href="https://www.publickey1.jp/blog/24/redisredis.html">Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必 須に - Publickey</a></p>
<p>つまり、Redis互換のインメ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E2%A5%EA%A1%BC">モリー</a>データストア、キーバリューストアということになります。</p>
<p>ValkeyのWebサイトはこちら。</p>
<p><a href="https://valkey.io/">Valkey</a></p>

    metadata:
      _id: c81d44e5-6321-4eed-bdce-ce64c3c8bb30
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 17382
    page_content: <p>確認。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ valkey-cli
127.0.0.1:6379&gt; set key1 value1
OK
127.0.0.1:6379&gt; get key1
"value1"</pre>
<p>OKですね。</p>
<h4 id="おわりに">おわりに</h4>
<p>Redis互換のキーバリューストア、Valkeyを試してみました。もとがRedisなので、使い方はほぼ変わらないですね。</p>
<p>自分はこういうものは大元の方を使い続けることが多いのですが、Redis/Valkeyに関してはValkeyも扱っておいた方がよさそうかなと思って<br/>
試してみることにしました。</p>
<p>今後、このブログで扱うのがRedis寄りになるのかValkey寄りになるのかは微妙なところですが、まずはValkeyの周辺事情も押さえておこうと<br/>
思います。</p>
</div>

    metadata:
      _id: 3647e8b1-441c-48dd-904a-2b1582070897
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 1602
    page_content: <blockquote><p>Valkey can be compiled and used on <a class="keyword" href="https://d.hatena.ne.jp/keyword/Linux">Linux</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/OSX">OSX</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/OpenBSD">OpenBSD</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/NetBSD">NetBSD</a>, <a class="keyword" href="https://d.hatena.ne.jp/keyword/FreeBSD">FreeBSD</a>.</p></blockquote>

回答自体はこちらで、あとは検索して追加したコンテキストなどの情報ですね。

回答 = Valkeyは、Redisのフォークプロジェクトです。ライセンスが変更されたRedisのフォークであり、Redis互換のインメモリキーバリューストアです。Linux、OSX、OpenBSD、NetBSD、FreeBSDなど、様々なOSでコンパイルして使用できます。

Open WebUI。

$ uv run clover_rag.py 'OllamaにWeb UIでアクセスしたいのですが、なにかツールはあるでしょうか?'
retrieve state = {'question': 'OllamaにWeb UIでアクセスしたいのですが、なにかツールはあるでしょうか?'}

generate state:
  question: OllamaにWeb UIでアクセスしたいのですが、なにかツールはあるでしょうか?
  contexts(4):
    metadata:
      _id: 3b00dbcd-acd8-4680-a54a-b2a77b791d70
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/02/22/205125.html
      content-type: text/html
      title: Open WebUIを使って、OllamaをWeb UIから操作する - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaをWeb UIで操作できないかなと探していたら、Open WebUIというものを見つけたので試してみることにしました。 Open WebUI Open WebUIのオフィシャルサイトはこちら。 Open WebUI GitHubリポジトリーはこちら。 GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) ドキュメントはこちら。 🏡 Home | Open WebUI Open WebUIは、オフラインかつセルフホス…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 23762
    page_content: <p><a href="https://docs.openwebui.com/getting-started/quick-start/starting-with-ollama">🦙 Starting With Ollama | Open WebUI</a></p>
<p>Ollamaのモデルのダウンロードもできるようなので便利ですね。</p>
<h4 id="おわりに">おわりに</h4>
<p>Open WebUIを使って、OllamaをWeb UIから操作してみました。</p>
<p>かなり良い感じにできあがっていてビックリしました。機能もいろいろあるようなので、ちょっと試したい時などに<br/>
使ってみようかなと思います。</p>
</div>

    metadata:
      _id: f00efdaf-a609-489a-9be2-bc9844b8000e
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 5561
    page_content: real    0m37.272s
user    0m0.005s
sys     0m0.009s</pre>
<p>1Bでもけっこうしっかり返してくれますね。しかも軽快ですし。</p>
<p>4B。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma3:4b
&gt;&gt;&gt; あなたの自己紹介をしてください
こんにちは!私はGemmaです。Google DeepMindによってトレーニングされた大規模言語モデルです。私はオープンウェイトモデルであり、広く一般に公開されています。テキストと画像を
インプットとして受け取り、テキストのみを出力することができます。私はまだ学習中ですが、様々なタスクを実行することができます。

私は、あなたの質問に答えたり、テキストを作成したり、アイデアをブレインストーミングしたりするのに役立ちます。ぜひ、私に色々なことを試してみてください!

    metadata:
      _id: 48ab2033-8248-4c1b-addb-248008a62262
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 2792
    page_content: model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P</pre>
<h4 id="Gemma-3を動かす">Gemma 3を動かす</h4>
<p>まずはGemma 3を動かしてみます。</p>
<p>パラメーター数は1B、4B、12B、27Bのものがあるので、1B、4Bで試してみましょう。</p>
<p>1B。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma3:1b
&gt;&gt;&gt; あなたの自己紹介をしてください
私は、Googleによってトレーニングされた、大規模言語モデルです。

    metadata:
      _id: c850aaa4-c1a2-4e7d-990f-142ced357cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 8988
    page_content: gemma3:4b                                          c0494fe00251    3.3 GB    2 hours ago</pre>
<p>12Bは8.1GBなのですが、これでもムリですか。</p>
<p>個人的には、スピードと質のバランスを取るなら<code>gemma2:2b</code>も悪くないと思います。</p>
<p><code>gemma2:2b</code>。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma2:2b
&gt;&gt;&gt; あなたの自己紹介をしてください
こんにちは! Gemma と申します。


messages = text='あなたは質問応答のアシスタントです。質問に答えるために、検索されたコンテキストの以下の部分を使用してください。答えがわからない場合は、わからないと答えてくだ さい。\n質問: OllamaにWeb UIでアクセスしたいのですが、なにかツールはあるでしょうか?\nコンテキスト: <p><a href="https://docs.openwebui.com/getting-started/quick-start/starting-with-ollama">🦙 Starting With Ollama | Open WebUI</a></p>\n<p>Ollamaのモデルのダウンロードもできるようなので便利ですね。</p>\n<h4 id="おわりに">おわりに</h4>\n<p>Open WebUIを使って、OllamaをWeb UIから操作してみました。</p>\n<p>かなり良い感じにできあがっていてビックリしました。機能もいろいろあるようなので、ちょっと試したい時などに<br/>\n使ってみようかなと思います。</p>\n</div>\n\nreal    0m37.272s\nuser    0m0.005s\nsys     0m0.009s</pre>\n<p>1Bでもけっこうしっかり返してくれますね。しかも軽快ですし。</p>\n<p>4B。</p>\n<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma3:4b\n&gt;&gt;&gt; あなたの自己紹介をしてください\nこんにちは!私はGemmaです。Google DeepMindによってトレーニングされた大規模言語モデルです。私はオープンウェイトモデルであり、広く一般に公開されています。テキストと画像を\nインプットとして受け取り、テキストのみを出力 することができます。私はまだ学習中ですが、様々なタスクを実行することができます。\n\n私は、あなたの質問に答えたり、テキストを作成したり、アイデアをブレインストーミングしたりするのに役立ちます。ぜひ、私に色々なことを試してみてください!\n\nmodel name      : 13th Gen Intel(R) Core(TM) i7-1360P\nmodel name      : 13th Gen Intel(R) Core(TM) i7-1360P</pre>\n<h4 id="Gemma-3を動かす">Gemma 3を動かす</h4>\n<p>まずはGemma 3を動かしてみます。</p>\n<p>パラメーター数は1B、4B、12B、27Bのものがあるので、1B、4Bで試してみましょう。</p>\n<p>1B。</p>\n<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma3:1b\n&gt;&gt;&gt; あなたの自己紹介をしてください\n私は、Googleによってトレー ニングされた、大規模言語モデルです。\n\ngemma3:4b                                          c0494fe00251    3.3 GB    2 hours ago</pre>\n<p>12Bは8.1GBなのですが、これでもムリ ですか。</p>\n<p>個人的には、スピードと質のバランスを取るなら<code>gemma2:2b</code>も悪くないと思います。</p>\n<p><code>gemma2:2b</code>。</p>\n<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma2:2b\n&gt;&gt;&gt; あなたの自己紹介をしてください\nこんにちは! Gemma と申します。 '

回答 = Open WebUIを使ってOllamaをWeb UIから操作できます。

レスポンス:
  answer: Open WebUIを使ってOllamaをWeb UIから操作できます。
  question: OllamaにWeb UIでアクセスしたいのですが、なにかツールはあるでしょうか?
  contexts(4):
    metadata:
      _id: 3b00dbcd-acd8-4680-a54a-b2a77b791d70
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/02/22/205125.html
      content-type: text/html
      title: Open WebUIを使って、OllamaをWeb UIから操作する - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaをWeb UIで操作できないかなと探していたら、Open WebUIというものを見つけたので試してみることにしました。 Open WebUI Open WebUIのオフィシャルサイトはこちら。 Open WebUI GitHubリポジトリーはこちら。 GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) ドキュメントはこちら。 🏡 Home | Open WebUI Open WebUIは、オフラインかつセルフホス…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 23762
    page_content: <p><a href="https://docs.openwebui.com/getting-started/quick-start/starting-with-ollama">🦙 Starting With Ollama | Open WebUI</a></p>
<p>Ollamaのモデルのダウンロードもできるようなので便利ですね。</p>
<h4 id="おわりに">おわりに</h4>
<p>Open WebUIを使って、OllamaをWeb UIから操作してみました。</p>
<p>かなり良い感じにできあがっていてビックリしました。機能もいろいろあるようなので、ちょっと試したい時などに<br/>
使ってみようかなと思います。</p>
</div>

    metadata:
      _id: f00efdaf-a609-489a-9be2-bc9844b8000e
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 5561
    page_content: real    0m37.272s
user    0m0.005s
sys     0m0.009s</pre>
<p>1Bでもけっこうしっかり返してくれますね。しかも軽快ですし。</p>
<p>4B。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma3:4b
&gt;&gt;&gt; あなたの自己紹介をしてください
こんにちは!私はGemmaです。Google DeepMindによってトレーニングされた大規模言語モデルです。私はオープンウェイトモデルであり、広く一般に公開されています。テキストと画像を
インプットとして受け取り、テキストのみを出力することができます。私はまだ学習中ですが、様々なタスクを実行することができます。

私は、あなたの質問に答えたり、テキストを作成したり、アイデアをブレインストーミングしたりするのに役立ちます。ぜひ、私に色々なことを試してみてください!

    metadata:
      _id: 48ab2033-8248-4c1b-addb-248008a62262
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 2792
    page_content: model name      : 13th Gen Intel(R) Core(TM) i7-1360P
model name      : 13th Gen Intel(R) Core(TM) i7-1360P</pre>
<h4 id="Gemma-3を動かす">Gemma 3を動かす</h4>
<p>まずはGemma 3を動かしてみます。</p>
<p>パラメーター数は1B、4B、12B、27Bのものがあるので、1B、4Bで試してみましょう。</p>
<p>1B。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma3:1b
&gt;&gt;&gt; あなたの自己紹介をしてください
私は、Googleによってトレーニングされた、大規模言語モデルです。

    metadata:
      _id: c850aaa4-c1a2-4e7d-990f-142ced357cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 8988
    page_content: gemma3:4b                                          c0494fe00251    3.3 GB    2 hours ago</pre>
<p>12Bは8.1GBなのですが、これでもムリですか。</p>
<p>個人的には、スピードと質のバランスを取るなら<code>gemma2:2b</code>も悪くないと思います。</p>
<p><code>gemma2:2b</code>。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma2:2b
&gt;&gt;&gt; あなたの自己紹介をしてください
こんにちは! Gemma と申します。

回答はこちら。

回答 = Open WebUIを使ってOllamaをWeb UIから操作できます。

Gemma 3。

$ uv run clover_rag.py 'Gemma 3について教えてください'
retrieve state = {'question': 'Gemma 3について教えてください'}

generate state:
  question: Gemma 3について教えてください
  contexts(4):
    metadata:
      _id: 1e30f9c2-0a7f-4907-9c66-832640d3879f
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 680
    page_content: <p><a href="https://huggingface.co/blog/gemma3">Welcome Gemma 3: Google's all new multimodal, multilingual, long context open LLM</a></p>
<p><a href="https://gigazine.net/news/20250313-google-gemma-3/">Googleが単一のGPUで実行できる中では過去最高の大規模言語モデル「Gemma 3」を発表 - GIGAZINE</a></p>
<p>Ollamaのモデルとしてはこちらです。</p>
<p><a href="https://ollama.com/library/gemma3">gemma3</a></p>
<h4 id="QwQ">QwQ</h4>
<p>ほぼ同じ時期に使えるようになったモデルのQwQも少しメモしておきます。</p>
<p>QwQはAlibaba CloudのQwenが開発したLLMです。</p>

    metadata:
      _id: 0414fcc3-85a1-4c16-aaa2-35eabe3e0a8a
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 409
    page_content: <p><a href="https://blog.google/technology/developers/gemma-3/">Gemma 3: Google’s new open model based on Gemini 2.0</a></p>
<p><a href="https://github.com/google-deepmind/gemma">GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind</a></p>
<p><a href="https://huggingface.co/blog/gemma3">Welcome Gemma 3: Google's all new multimodal, multilingual, long context open LLM</a></p>

    metadata:
      _id: afbc3c1c-59a4-4601-b9d6-6e3166c733e5
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。</p>
<p>今回のエントリーはどちらかというと、モデルのメモです。</p>
<h4 id="Gemma-3">Gemma 3</h4>
<p>Gemma 3は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google">Google</a>のLLMです。単一の<a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU">GPU</a>ま たはTPUで実行できるモデルとしては、現時点で最高の性能としています。</p>

    metadata:
      _id: c850aaa4-c1a2-4e7d-990f-142ced357cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 8988
    page_content: gemma3:4b                                          c0494fe00251    3.3 GB    2 hours ago</pre>
<p>12Bは8.1GBなのですが、これでもムリですか。</p>
<p>個人的には、スピードと質のバランスを取るなら<code>gemma2:2b</code>も悪くないと思います。</p>
<p><code>gemma2:2b</code>。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma2:2b
&gt;&gt;&gt; あなたの自己紹介をしてください
こんにちは! Gemma と申します。


messages = text='あなたは質問応答のアシスタントです。質問に答えるために、検索されたコンテキストの以下の部分を使用してください。答えがわからない場合は、わからないと答えてくだ さい。\n質問: Gemma 3について教えてください\nコンテキスト: <p><a href="https://huggingface.co/blog/gemma3">Welcome Gemma 3: Google\'s all new multimodal, multilingual, long context open LLM</a></p>\n<p><a href="https://gigazine.net/news/20250313-google-gemma-3/">Googleが単一のGPUで実行できる中では過去最高の大規模言語モデル「Gemma 3」を発表 - GIGAZINE</a></p>\n<p>Ollamaのモデルとしてはこちらです。</p>\n<p><a href="https://ollama.com/library/gemma3">gemma3</a></p>\n<h4 id="QwQ">QwQ</h4>\n<p>ほぼ同じ時期に使えるようになったモデルのQwQも少しメモしておきます。</p>\n<p>QwQはAlibaba CloudのQwenが開発したLLMです。</p>\n\n<p><a href="https://blog.google/technology/developers/gemma-3/">Gemma 3: Google’s new open model based on Gemini 2.0</a></p>\n<p><a href="https://github.com/google-deepmind/gemma">GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind</a></p>\n<p><a href="https://huggingface.co/blog/gemma3">Welcome Gemma 3: Google\'s all new multimodal, multilingual, long context open LLM</a></p>\n\n<div class="entry-content hatenablog-entry">\n<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>\n<p>OllamaでGemma 3が使えるようになっていたので、軽く動 かしてみます。</p>\n<p>今回のエントリーはどちらかというと、モデルのメモです。</p>\n<h4 id="Gemma-3">Gemma 3</h4>\n<p>Gemma 3は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google">Google</a>のLLMです。単一の<a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU">GPU</a>またはTPUで実行できるモデルとしては、現時点で最高の性能としています。</p>\n\ngemma3:4b                                          c0494fe00251    3.3 GB    2 hours ago</pre>\n<p>12Bは8.1GBなのですが、これでもムリですか。</p>\n<p>個人的には、スピードと質のバランスを取るなら<code>gemma2:2b</code>も悪くないと思います。</p>\n<p><code>gemma2:2b</code>。</p>\n<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma2:2b\n&gt;&gt;&gt; あなたの自己紹介をしてください\nこんにちは! Gemma と申します。 '

回答 = Gemma 3はGoogleによって開発された、マルチモーダル、多言語、長いコンテキストを扱えるオープンLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能と しています。Google DeepMindによって開発され、Hugging FaceやOllamaで利用可能です。Gemma 3はGemini 2.0をベースにしています。

レスポンス:
  answer: Gemma 3はGoogleによって開発された、マルチモーダル、多言語、長いコンテキストを扱えるオープンLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。Google DeepMindによって開発され、Hugging FaceやOllamaで利用可能です。Gemma 3はGemini 2.0をベースにしています。
  question: Gemma 3について教えてください
  contexts(4):
    metadata:
      _id: 1e30f9c2-0a7f-4907-9c66-832640d3879f
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 680
    page_content: <p><a href="https://huggingface.co/blog/gemma3">Welcome Gemma 3: Google's all new multimodal, multilingual, long context open LLM</a></p>
<p><a href="https://gigazine.net/news/20250313-google-gemma-3/">Googleが単一のGPUで実行できる中では過去最高の大規模言語モデル「Gemma 3」を発表 - GIGAZINE</a></p>
<p>Ollamaのモデルとしてはこちらです。</p>
<p><a href="https://ollama.com/library/gemma3">gemma3</a></p>
<h4 id="QwQ">QwQ</h4>
<p>ほぼ同じ時期に使えるようになったモデルのQwQも少しメモしておきます。</p>
<p>QwQはAlibaba CloudのQwenが開発したLLMです。</p>

    metadata:
      _id: 0414fcc3-85a1-4c16-aaa2-35eabe3e0a8a
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 409
    page_content: <p><a href="https://blog.google/technology/developers/gemma-3/">Gemma 3: Google’s new open model based on Gemini 2.0</a></p>
<p><a href="https://github.com/google-deepmind/gemma">GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind</a></p>
<p><a href="https://huggingface.co/blog/gemma3">Welcome Gemma 3: Google's all new multimodal, multilingual, long context open LLM</a></p>

    metadata:
      _id: afbc3c1c-59a4-4601-b9d6-6e3166c733e5
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。</p>
<p>今回のエントリーはどちらかというと、モデルのメモです。</p>
<h4 id="Gemma-3">Gemma 3</h4>
<p>Gemma 3は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google">Google</a>のLLMです。単一の<a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU">GPU</a>ま たはTPUで実行できるモデルとしては、現時点で最高の性能としています。</p>

    metadata:
      _id: c850aaa4-c1a2-4e7d-990f-142ced357cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 8988
    page_content: gemma3:4b                                          c0494fe00251    3.3 GB    2 hours ago</pre>
<p>12Bは8.1GBなのですが、これでもムリですか。</p>
<p>個人的には、スピードと質のバランスを取るなら<code>gemma2:2b</code>も悪くないと思います。</p>
<p><code>gemma2:2b</code>。</p>
<pre class="code shell" data-lang="shell" data-unlink="">$ bin/ollama run gemma2:2b
&gt;&gt;&gt; あなたの自己紹介をしてください
こんにちは! Gemma と申します。

回答。

回答 = Gemma 3はGoogleによって開発された、マルチモーダル、多言語、長いコンテキストを扱えるオープンLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能と しています。Google DeepMindによって開発され、Hugging FaceやOllamaで利用可能です。Gemma 3はGemini 2.0をベースにしています。

コンテキストを与えられない質問をしてみます。

$ uv run clover_rag.py 'DuckDBとはなんですか?'
retrieve state = {'question': 'DuckDBとはなんですか?'}

generate state:
  question: DuckDBとはなんですか?
  contexts(4):
    metadata:
      _id: afbc3c1c-59a4-4601-b9d6-6e3166c733e5
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。</p>
<p>今回のエントリーはどちらかというと、モデルのメモです。</p>
<h4 id="Gemma-3">Gemma 3</h4>
<p>Gemma 3は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google">Google</a>のLLMです。単一の<a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU">GPU</a>ま たはTPUで実行できるモデルとしては、現時点で最高の性能としています。</p>

    metadata:
      _id: 8a5f3230-5a05-4483-9d9f-481e5fd7fe31
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/02/22/205125.html
      content-type: text/html
      title: Open WebUIを使って、OllamaをWeb UIから操作する - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaをWeb UIで操作できないかなと探していたら、Open WebUIというものを見つけたので試してみることにしました。 Open WebUI Open WebUIのオフィシャルサイトはこちら。 Open WebUI GitHubリポジトリーはこちら。 GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) ドキュメントはこちら。 🏡 Home | Open WebUI Open WebUIは、オフラインかつセルフホス…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 21370
    page_content: <p>Gemma2を使って、会話してみます。</p>
<p><span itemscope="" itemtype="http://schema.org/Photograph"><img class="hatena-fotolife" height="729" itemprop="image" loading="lazy" src="https://cdn-ak.f.st-hatena.com/images/fotolife/K/Kazuhira/20250222/20250222202756.png" title="" width="1200"/></span></p>
<p>するとチャット用のページに切り替わり、会話ができます。</p>

    metadata:
      _id: cd1a3d2f-9d83-4fd8-b182-b7dab911d9f6
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 2045
    page_content: <p>Valkeyのインストール方法なのですが、ダウンロードページを見るとDockerイメージと<a class="keyword" href="https://d.hatena.ne.jp/keyword/Ubuntu%20Linux">Ubuntu Linux</a> 18.04 LTS、20.04 LTS向けの<br/>
バイナリーが案内されています。</p>
<p><a href="https://valkey.io/download/">Valkey · Download</a></p>
<p>他のバージョンや<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>の場 合は…?となるのですが。</p>

    metadata:
      _id: 15e4e3a2-e26a-43d5-a8b6-50c578093cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。</p>
<p><a href="https://www.publickey1.jp/blog/24/redisvalkeyvalkey_80io.html">Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレ ッディングによる高速化など強化 - Publickey</a></p>
<h4 id="Valkey">Valkey</h4>
<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>


messages = text='あなたは質問応答のアシスタントです。質問に答えるために、検索されたコンテキストの以下の部分を使用してください。答えがわからない場合は、わからないと答えてくだ さい。\n質問: DuckDBとはなんですか?\nコンテキスト: <div class="entry-content hatenablog-entry">\n<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>\n<p>OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。</p>\n<p>今回のエントリーはどちらかというと、モデルのメモです。</p>\n<h4 id="Gemma-3">Gemma 3</h4>\n<p>Gemma 3は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google">Google</a>のLLMです。単一の<a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU">GPU</a>またはTPUで実行できるモデルとしては、現時点で最高の性能としています。</p>\n\n<p>Gemma2を使って、会話してみます。</p>\n<p><span itemscope="" itemtype="http://schema.org/Photograph"><img class="hatena-fotolife" height="729" itemprop="image" loading="lazy" src="https://cdn-ak.f.st-hatena.com/images/fotolife/K/Kazuhira/20250222/20250222202756.png" title="" width="1200"/></span></p>\n<p>するとチャット用のページに切り替わり、会話ができます。</p>\n\n<p>Valkeyのインストール方法なのですが、ダウンロードページを見るとDockerイメージと<a class="keyword" href="https://d.hatena.ne.jp/keyword/Ubuntu%20Linux">Ubuntu Linux</a> 18.04 LTS、20.04 LTS向けの<br/>\nバイナリーが案内されています。</p>\n<p><a href="https://valkey.io/download/">Valkey · Download</a></p>\n<p>他のバージョンや<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>の場合は…?となるのですが。</p>\n\n<div class="entry-content hatenablog-entry">\n<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>\n<p>RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。</p>\n<p><a href="https://www.publickey1.jp/blog/24/redisvalkeyvalkey_80io.html">Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey</a></p>\n<h4 id="Valkey">Valkey</h4>\n<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p> '

回答 = 提供されたコンテキストに基づいて、DuckDBについて答えることはできません。コンテキストはValkeyというRedisのフォークプロジェクトについて述べており、DuckDBについては言及されていません。

レスポンス:
  answer: 提供されたコンテキストに基づいて、DuckDBについて答えることはできません。コンテキストはValkeyというRedisのフォークプロジェクトについて述べており、DuckDBについては言 及されていません。
  question: DuckDBとはなんですか?
  contexts(4):
    metadata:
      _id: afbc3c1c-59a4-4601-b9d6-6e3166c733e5
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/03/16/002801.html
      content-type: text/html
      title: OllamaでGoogleのLLM、Gemma 3を試す - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。 今回のエントリーはどちらかというと、モデルのメモです。 Gemma 3 Gemma 3はGoogleのLLMです。単一のGPUまたはTPUで実行できるモデルとしては、現時点で最高の性能としています。 Gemma 3: Google’s new open model based on Gemini 2.0 GitHub - google-deepmind/gemma: Gemma open-weight LLM library, from Google DeepMind Welco…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>OllamaでGemma 3が使えるようになっていたので、軽く動かしてみます。</p>
<p>今回のエントリーはどちらかというと、モデルのメモです。</p>
<h4 id="Gemma-3">Gemma 3</h4>
<p>Gemma 3は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google">Google</a>のLLMです。単一の<a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU">GPU</a>ま たはTPUで実行できるモデルとしては、現時点で最高の性能としています。</p>

    metadata:
      _id: 8a5f3230-5a05-4483-9d9f-481e5fd7fe31
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2025/02/22/205125.html
      content-type: text/html
      title: Open WebUIを使って、OllamaをWeb UIから操作する - CLOVER🍀
      description: これは、なにをしたくて書いたもの? OllamaをWeb UIで操作できないかなと探していたら、Open WebUIというものを見つけたので試してみることにしました。 Open WebUI Open WebUIのオフィシャルサイトはこちら。 Open WebUI GitHubリポジトリーはこちら。 GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) ドキュメントはこちら。 🏡 Home | Open WebUI Open WebUIは、オフラインかつセルフホス…
      language: ja
      categories: ['Ollama', 'LLM']
      start_index: 21370
    page_content: <p>Gemma2を使って、会話してみます。</p>
<p><span itemscope="" itemtype="http://schema.org/Photograph"><img class="hatena-fotolife" height="729" itemprop="image" loading="lazy" src="https://cdn-ak.f.st-hatena.com/images/fotolife/K/Kazuhira/20250222/20250222202756.png" title="" width="1200"/></span></p>
<p>するとチャット用のページに切り替わり、会話ができます。</p>

    metadata:
      _id: cd1a3d2f-9d83-4fd8-b182-b7dab911d9f6
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 2045
    page_content: <p>Valkeyのインストール方法なのですが、ダウンロードページを見るとDockerイメージと<a class="keyword" href="https://d.hatena.ne.jp/keyword/Ubuntu%20Linux">Ubuntu Linux</a> 18.04 LTS、20.04 LTS向けの<br/>
バイナリーが案内されています。</p>
<p><a href="https://valkey.io/download/">Valkey · Download</a></p>
<p>他のバージョンや<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>の場 合は…?となるのですが。</p>

    metadata:
      _id: 15e4e3a2-e26a-43d5-a8b6-50c578093cdd
      _collection_name: clover_entries_collection
      url: http://172.17.0.3/entry/2024/10/19/200719.html
      content-type: text/html
      title: Redis互換のキーバリューストア、ValkeyをUbuntu Linux 22.0.4 LTSにインストールする - CLOVER🍀
      description: これは、なにをしたくて書いたもの? RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。 Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレッディングによる高速化など強化 - Publickey Valkey Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです 。 Redis、クラウドベンダなどによる商用サービスを制限するライセンス変更を発表。今後はRedis社とのライセンス契約が必須に - Publickey つまり、Redis互換のインメモリーデータストア…
      language: ja
      categories: ['Valkey']
      start_index: 0
    page_content: <div class="entry-content hatenablog-entry">
<h4 id="これはなにをしたくて書いたもの">これは、なにをしたくて書いたもの?</h4>
<p>RedisのフォークであるValkeyが8.0になったので、少し試してみようかなということで。</p>
<p><a href="https://www.publickey1.jp/blog/24/redisvalkeyvalkey_80io.html">Redisをフォークした「Valkey」初のメジャーバージョンアップ「Valkey 8.0」正式リリース。非同期I/Oスレ ッディングによる高速化など強化 - Publickey</a></p>
<h4 id="Valkey">Valkey</h4>
<p>Valkeyは、ライセンスが変更されたRedisのフォークプロジェクトです。</p>

Prompt templateでは以下のように指示しているので

prompt = PromptTemplate.from_template("""あなたは質問応答のアシスタントです。質問に答えるために、検索されたコンテキストの以下の部分を使用してください。答えがわからない場合は、わからないと答えてください。
質問: {question}
コンテキスト: {context} """)

答えられないと返ってきます。なぜか中途半端にValkeyの情報がくっついてますが…。

回答 = 提供されたコンテキストに基づいて、DuckDBについて答えることはできません。コンテキストはValkeyというRedisのフォークプロジェクトについて述べており、DuckDBについては言及されていません。

よさそうですね。

Tool callingは?

RAG part 2にあったTool callingも試そうと思ったのですが、Gemma 3がToolに対応していませんでした…。

ollama._types.ResponseError: registry.ollama.ai/library/gemma3:4b does not support tools (status code: 400)

使う時にちゃんとモデルのタグを確認しないといけないですね。

おわりに

このブログ(CLOVER)を題材にしたRAGを作ってみました。

いろいろ試そうと思ったのですが、ベクトル化の部分にとても時間がかかるので、ちょっと対象のエントリーを絞らざるを
えなくなりました。

また、Text splittersなどももうちょっと工夫したかったですね。このあたりは、また試しているかもしれません。

とにかく自分に身近なお題に持ち込まないと覚えない気がするので、ちょっとずつ工夫、改善して覚えていきたいですね。