以下の内容はhttps://ujimushisradjp.hatenablog.jp/entry/2024/12/21/090741より取得しました。


OllamaのEmbeddedのサンプルプログラムを魔改造して漢直に少し詳しいAIもどきを作成する(ボケ)

Ollamaのブログの「Embedding Models」にはちょっとしたEmbedding modelsのサンプルプログラムがあります。

そこで,悪ノリしてWikipediaの漢直の項目について説明できるなんちゃってAI「漢直くん(仮)」の作成を試みます。

モデルの選定

色々モデルの説明文等を見てみて「日本語に得意そうなモデルで8GB未満のやつ」を選ぶことにしました。

ここでは,embeddingモデルをhun432/cl-nagoya-ruri-base,モデルをschroneko/llama-3.1-swallow-8b-instruct-v0.1 の圧縮モデルにします。だってGPUのRAMが8GBしかないんだもん。

実装

さて,まずは漢直の元ネタになる文章を用意します。Wikipediaの日本語版から「漢字直接入力」に関する説明や T-code LaboratryからT-codeに関する説明文を用意します。

import ollama
import chromadb

# 出典: Wikipedia JP,T-Code Laboratory
documents = [
    '''\
    漢字直接入力(かんじちょくせつにゅうりょく)は、\
    コンピュータでの日本語入力法の分類の一つ。\
    漢直(かんちょく)と略称されることもある。\
    かな漢字変換では、人間がキーボードなどから入力した読みを\
    コンピュータが解析して漢字仮名交じり文に変換しているが、\
    漢字直接入力では使う漢字(平仮名、片仮名、記号なども含む)\
    を人間の側で直接指定する。よって、誤変換\
    (人間の意に反した入力)は起こり得ず、習熟者は画面を\
    全く見ずに入力することもできるようになる。\
    その反面、入力者が知らない漢字は入力することができない。\
    ''',
    '''\
    汎用コンピュータと呼ばれた大型コンピュータで\
    日本語を扱えるようになった初期の頃(1970~1980年代前半)は、\
    かな漢字変換機能がなく、また記憶容量も少なかった\
    (超大型機でもメモリ256メガバイト、ディスク数十ギガバイト程度)\
    ため、一つのキーに複数の漢字を割り当てた巨大なキーボードを使って\
    漢字を直接入力したり、各漢字(2バイト文字)に対応する\
    コンピュータ固有の漢字コードやJIS区点コードをテンキーで入力して\
    漢字を呼び出す漢字直接入力の方法が用いられた。\
    ''',
    '''\
    漢字直接入力は、文字を指定する方法により連想式と無連想式に\
    大きく分けられる。いずれの方法でも、同じ打鍵操作に対しては\
    必ず同じ文字が出力されるようになっている。\
    なお、これに対して仮名漢字変換では、出力される文字が\
    それまでの入力内容に依存するため、同じ操作をしたとしても\
    出力される文字が異なる場合がある。\
    ''',
    '''\
    漢字直接入力の「無連想式」はストロークから入力される漢字が\
    連想できないもので、次のような種類がある。\
     1. 2~4打鍵の組合せにより指定するもの\
    (T-code、TUT-code、G-code、超絶技巧入力など)\
     2. 文字の読みにより指定するもの(風および互換FEP)\
    ''',
    '''\
    漢字直接入力の「連想式」はストロークから入力される漢字が\
    連想できるもので、次のような種類がある。\
     1. 文字コードに着目して指定するもの\
    (す、百相鍵盤『き』、phoenixなど)\
    ''',
    '漢字コード、あるいは区点コードを直接入力して漢字を呼び出す'
    '(各社のかな漢字変換でこの機能も使える。また、Mac OSでは'
    'Unicode Hex Inputというキーボード配列をインストールすることで'
    'Unicodeの16進値から直接入力出来る)'
    ' 2. 漢字の部首に着目して指定するもの(NIK-Code、にこにこなど)'
    '中国大陸で用いられる「五筆字型輸入法」、香港や台湾で用いられる'
    '「倉頡輸入法」もこれに近い方式である。'
    ' 3. 文字から発生するイメージ、意味、形、読みからの連想によるもの'
    '(ラインプット、カンテック、KIS、LTWORDなど)',
    '無連想式漢字直接入力(むれんそうしきかんじちょくせつにゅうりょく)'
    'は、漢字直接入力の方式の一つ。 ',
    '代表的な無連想式漢字直接入力に、T-code、TUT-code、G-code、'
    '超絶技巧入力がある。',
    '無連想式漢字直接入力は修得難易度が高すぎて気軽に始められない。'
    'これは覚えるしかない無連想方式ゆえの欠点といえる。'
    'また、ストロークを一度忘れてしまうと、思い出すかストローク表を'
    '見るまではどうにもならなくなってしまう。'
    'これも、キーストロークと漢字の関連性がまったくない'
    '無連想式ゆえの欠点である。'
    '後者については、連想式でも同じことが言えるのだが、'
    '連想式は関連性があるため、忘れにくい・思い出しやすいという点で'
    '異なる。 ',
    'T-Codeは東京大学理学部情報科学科山田研究室で開発された'
    '無連想2ストローク漢字入力方式で、漢字直接入力の一種です。'
    '片手あたり5列4段20個、計40個のキーを使います。'
    '40個のキーを二打鍵することで一文字の入力を行います。'
    '人指し指は2列分を受け持ちます。T-Codeでは40個のキーの二打鍵、'
    '計1600通りの打鍵位置のうち現在約1300に文字を割り当てています。'
    '新聞などの記事を入力する際には、入力するべき文字の約95--98%が'
    'T-Codeの二打鍵で入力できるといわれています。',
    ]

色々やっていくうちにそこそこ文章が長くなりました。ネタのわりに本気度が感じられます。

次に,元ネタとそのベクトル値をデータベースに登録する部分を実装します。 といっても,サンプルのコードそのままです。

cl-nagoya-ruri-baseの説明に「文章の前に『文章:』をつけろ」というような記述があるので, その通りになるよう修正しています。

client = chromadb.Client()
collection = client.create_collection(name="docs")

# store each document in a vector embedding database
for i, d in enumerate(documents):
    response = ollama.embeddings(
        model="kun432/cl-nagoya-ruri-base",
        prompt="文章: " + d
    )
    embedding = response["embedding"]
    collection.add(
        ids=[str(i)],
        embeddings=[embedding],
        documents=[d]
    )

次は簡単な質疑応答ができるような部分を作成します。 といっても,やはりサンプルプログラムそのまんまです。

本来だとDBから引っ張ってきた文章をcontextに入れるのでしょうが, サンプルの通りにプロンプトに入れ込んでいます。

for k in range(10):
    # an example prompt
    prompt = input("質問: ")
    if prompt == "":
        break
    print('\n回答: ')

    # generate an embedding for the prompt and retrieve the most relevant doc
    response = ollama.embeddings(
        prompt=prompt,
        model="kun432/cl-nagoya-ruri-base"
    )
    results = collection.query(
        query_embeddings=[response["embedding"]],
        n_results=1
    )
    data = results['documents'][0][0]

    # generate a response combining the prompt and data we retrieved in step 2
    output = ollama.generate(
        model="schroneko/llama-3.1-swallow-8b-instruct-v0.1:q5_k_s",
        prompt=f"Using this data: {data}. Respond to this prompt: {prompt}"
    )
    print(output['response'])
    print("")

実行結果を次に示します。 何となく,それっぽい感じに答えてくれます。

立ち上げ直してもう一回。(というかはてなblogへのアップロードで失敗表示出たので何回も別に撮り直してアップロードして全部失敗と出たけど,後で見るといくつかは成功していた模様)

実行し直すと,文章が少しずつ変化するのが面白いです。

かなりうまくいっているように見えますが, 用意している文章に沿った質問をしているためで, 漢直と関係のない質問をするとやはりうまくいきません。

上記の結果は,かなりの美化が含まれているということです。

まとめ

以上のようにAI「漢直くん(仮)」の可能性が示せました。(笑) 単なるサンプルプログラムを魔改造しただけなので,本気にしないで 下さいね。

色々試していくなかで,

  • 一つの文章のかたまりはそこそこ長い文章の方がいい(AI側で質問に応じて勝手に取捨選択してくれる)
  • 長過ぎでもうまくいかない

で一つの情報の文章の長さを今回のサンプルでもちょこちょこ試行錯誤しています。

なので,実際に使いものになるようにするとなると,なかなかハードルが高そうです。

さいごに

来年のことを言うと鬼が笑うかもしれませんが,漢直のAdvent Calendarを2025年にできればなぁと思います。

準備期間が一年あれば,一人でも25件ぐらいネタが作れるのではないかと。で,いっぱいネタがあつまったら 「漢直くん」の学習データがいっぱい集まるのではないかと(大嘘です)。

真面目な話として,前回2015年から来年で10年経つことになり,2015年の記事は リンク切れもたくさん発生しているようです。

漢直は使用年数が経ってくると各々が独自路線に走っていく傾向にあり, 情報が集約しづらいような気がします。

githubkanchoku もそれほど情報が増えているような感じもしないですし, XはXで情報がブツ切れになって個人的には見づらいんですよね。老人にとっては。

ということで来年この時期に余裕があれば,漢直Advent Calendarをやれればと思います。




以上の内容はhttps://ujimushisradjp.hatenablog.jp/entry/2024/12/21/090741より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14