Asutorufaのブログ

こんにちは

Asutorufaのブログ

QdrantでHybrid Search

投稿日 2025-08-22更新日: 2025-08-22カテゴリ llm

密ベクトルは現在ではText Embeddingサービスやvllmなどを使えば簡単に生成をてきる。
疎ベクトルは色々と探しましたが、直接利用できるサービスがあまりはない、自分で用意しなければならない。
Qdrantが提供するfastembedは利用できますけど、対応している疎ベクトルモデルが少ないため、最後的にsentence_transformersSparseEncoderを利用することにしました。

例えば、以下のようなドキュメントがあるとします:

docx = [    "test1",    "test2",    "test3",    "test4",]

戻り値の形式がわかりにくく、少し混乱しました:

document_embeddings.coalesce().indices().cpu().numpy() =     [[ 0 0 0 0 1 1 1 2 2 2 3 3 ] [ 5 25 29 56 4035 4038 4059 1 2 3 98 67 54]] document_embeddings.coalesce().values().cpu().numpy() =     [0.03429046 0.02966345 0.03258647 0.03258648 0.03258649 0.03137818 0.0306967 0.04750843 0.0475084 0.0475085 0.03258612 0.03137328]

Qdrant疎ベクトル形式の引数要求は以下のようになります:

indices = [ 5   25   29 ... ]values =  [ 0.03429046 0.02966345 0.03258647 ... ]

最後はなんとかわかりました、実は:

  • indicesの1次元目が 0 の要素が、docs[0] (“test1”) に対応します。
  • indicesの1次元目が 1 の要素が、docs[1] (“test2”) に対応します。

したがって、疎ベクトルは以下のようになります。

RustでTelegram BotをLambdaにデプロイする

投稿日 2025-08-07更新日: 2025-08-07カテゴリ Rust, Lambda, Telegram

Telegram BotにはサーバーとWebhookの二つの立ち上げる方法があります。Lambdaはサーバーレスだから、今回はWebhookで使用します。

最初はCargoで新たなプロジェクトを作ります。

cargo new telegram-bot

必要な依存を追加します。

crgo add aws_lambda_events base64 lambda_runtime serde_json serde teloxide-macros tokio teloxide cargo-lambda

zigをインストール

# macosbrew install zig# lambda cliでzigのインストール方法を出力してcargo lambda system --install-zig

Telegramのコマンドを宣言します

#[derive(BotCommands, PartialEq, Clone, Debug)]// いろんなパラメータに対応しています。公式ドキュメントをチェックしてください。#[command(    rename_rule = "lowercase",    description = "These commands are supported:")]pub enum Command {    #[command(description = "get current user id")]    UserID,}

Telegramの処理関数を定義します

告别小米,投奔三星

发布于 2025-07-27更新于: 2025-07-27分类 Personally

使用三星的一部分生态已经接近半年多了,同时为了未来的准备,渐渐把自己的一些老旧设备都换新了,没用的东西要么送人了要么卖二手,顺便记录一下目前的状态。

为什么抛弃小米的所有设备

之前买过不少的小米设备,大部分是因为小米的营销和身边人的推荐,给我一种小米价格不贵而且质量还不错的错觉。自己当时手上的数码产品都用了很多年了,也没有接触过当前其他品牌的产品,加上自己有刷机(使用国际版)的需求,索性买了小米的相关产品。先简述一下自己用过的产品的问题。

  • 小米平板4
    这个算是买的最早的小米设备了,不贵但是也花了1500块大洋(记不太清了)。主要有以下问题:

    • 管生不管养,系统从最初就是个半成品,其中只有过一次更新,之后小米就不管了,连安全更新都没有,体验很差劲。
    • 电池损耗很快,没用多久电池就不行了,电量乱跳,显示还有百分之50电量,直接黑屏关闭。
    • 电源键坏了,按很多遍才会有一次反应,我都是双击屏幕换新设备,很少用电源键,这都能坏?
    • 无法正常观看高清Netflix,Prime Video,说实话平板主要就是拿来看视频的,结果连这个都不行。

    据说现在小米平板依旧是这样。。

terraformのモジュール

投稿日 2025-02-27更新日: 2025-02-27カテゴリ Kubernetes

WIP

- +  + project1 -+  |           +- main.tf  |           +- variables.tf  |           +- pro.tfvars  |           +- debug.tfvars  |  +- modules -+              +- module1 -+              |            +- main.tf              |            +- variables.tf              |            +- outputs.tf              |              +- module2 -+                           +- main.tf                           +- variables.tf                           +- outputs.tf

Kubernetesのコントローラーを作ろう

投稿日 2025-02-23更新日: 2025-02-23カテゴリ Kubernetes

Kubernetesコントローラーとは

コントローラーはKubernetesのリソース設定を監視して変更があったら自動的にリソースを調整するプログラムです。ちなみに、Deployment、Statefulset、DaemonSetなどはKubernetesの内蔵コントローラーです。

コントローラーを実現

今回はGolangで簡単なLoadBalancerコントローラーを実現する。実際の機能はないですが、作成の流れはただしいと思います。

最初はTypeはLoadBalancerのServiceを作成

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  selector:    app.kubernetes.io/name: MyApp  ports:    - protocol: TCP      port: 80      targetPort: 80  clusterIP: 10.0.171.239  type: LoadBalancer

この時はIPアドレスを割り当てのコントローラーがないので、ServiceのステータスはPendingです。

新たなKubernetesクライアントを作成

UDPプロキシはFullcone NATを実現する

投稿日 2024-11-18更新日: 2024-11-18カテゴリ Network

NATの種類

Mappingの種類

マッピングはNAT内部から外部にパケットを送信時にアドレス変換する行為です。

  • Endpoint-Independent Mapping

NAT内部のネットワークの同じIPアドレスとポートで外部のそれぞれのUDPサーバ(IPアドレスとポートが違う)にパケットを送信すると、各個UDPサーバも同じIPアドレスとポートのパケットを受信する。
例えば:

送信元アドレス 宛先アドレス NATマッピングアドレス
192.168.1.1:3000 1.1.1.1:3000 43.124.222.234:4500
192.168.1.1:3000 1.1.1.1:3001 43.124.222.234:4500
192.168.1.1:3000 1.1.1.3:3002 43.124.222.234:4500
192.168.1.1:3000 1.1.1.4:3004 43.124.222.234:4500
  • Address-Dependent Mapping

UDPサーバのアドレスが同じ(ポートが違う)なら受信したパケットのIPアドレスとポートを変換しない、そうしないと、IPアドレスやポートを変換する。
例えば:

送信元アドレス 宛先アドレス NATマッピングアドレス
192.168.1.1:3000 1.1.1.1:3000 43.124.222.234:4500
192.168.1.1:3000 1.1.1.1:3001 43.124.222.234:4500
192.168.1.1:3000 1.1.1.2:3000 43.124.222.234:4501
192.168.1.1:3000 1.1.1.3:3003 43.124.222.234:4502
  • Address and Port-Dependent Mapping

UDPサーバのアドレスとポートが同じなら受信したパケットのIPアドレスとポートを変換しない、そうしないと、IPアドレスやポートを変換する。

golangとollamaでfunction calling

投稿日 2024-11-11更新日: 2024-11-11カテゴリ llm

今回はollamaのオフィシャルクライアントでfuncation callingを使いたいです。  
前回はlangchaingoで使っただけと、試してたらollamaの引数toolsは無効です、githubの実例ollama_functions_exampleはsystem messageとtoolsのjsonを組み合わせて内容を生成する。例えば:

func systemMessage() string { bs, err := json.Marshal(functions) if err != nil {  log.Fatal(err) }  return fmt.Sprintf(`You have access to the following tools: %s To use a tool, respond with a JSON object with the following structure: { "tool": <name of the called tool>, "tool_input": <parameters for the tool matching the above JSON schema>}`, string(bs))}

これはちょっと優雅でない、ollama/apiを使いたいと思います。

function callingとは

langchaingoでRAGを試しました

投稿日 2024-11-06更新日: 2024-11-06カテゴリ llm

日本語はまだ勉強中ですから、変などころあったら、ぜひコメントしてください。

RAGとは

RAGはRetrieval augmented generationの略です。
大規模言語モデル内容を生成する前に、promptによる外部のデーターベースに知識を検索、元のpromptと組み合わせて、アウトプットを改善するための技術です。

例えば:

ユーザ:今日の注目の新聞は何ですか?

gemini:

今日の注目の新聞記事については、リアルタイムで変化するため、特定の新聞社名を挙げて「今日の注目の記事はこれです」と断言することは難しいです。

chatgpt:

本日(2024年11月6日)の日本の注目ニュースは次のような内容が含まれている可能性があります: アメリカ大統領選挙の最新動向 - 特に若い世代の投票行動や政策への関心が注目されています。国内経済とインフレの動き - 日本の物価高騰が続き、家計への影響や政府の対応が議論されています。アジアの地政学的緊張 - 日本周辺地域の安全保障に関連する動向が続いています。以上の内容が注目ニュースとして考えられますが、詳細については直接ニュースソースで確認されるとよいでしょう。

geminiはリアルタイムによっての内容は回答できません。
chatgptはRAGか、Function Callingか、どちらかを使っていると思います。
今回はgolang+langchaingo+ollama+qdrantでRAGを実験してみます。

準備

感觉日语是一种很随意的语言

发布于 2024-07-29更新于: 2024-07-29分类 日本語

首先推荐一个视频 【文法「文の成分」】【10分間の国文法講座:ラーニング・ラボWeb講座】, 大概讲了日本中学(初中)考试的一些文法。

动词活用

相信不少中国境内的人学习动词都是 一类动词, 二类动词,三类动词, 并且老师甚至还会告诉你不要记《标准日本语》上面带ます的动词,要记字典型。
然后大概会告诉一类动词的活用,类似下面:

「う」段 →「い」段 + ます以「う」、「つ」、「る」结尾的词 → 去掉词尾 + って  ...  ...

相信不少人(至少我是)会以为这是类似英文那种动词变形,过去式等这类的。
然而后来我发现,这完全是误人子弟啊,日本中学(初中)根本就不用这种所谓的变形,也不是说不用,只是他们不会用这种规则去活用动词。

事实上的动词活用分类:

实现一个简单的Kubernetes controller

发布于 2024-03-30更新于: 2024-03-30分类 Kubernetes

controller是什么

简单来说,controller就是监听kubernetes的配置/状态变化,自动对资源进行调节。比如kubernetes内置的controller有Deployment、StatefulSet、DaemonSet。

实现controller

这里我们实现一个简单的loadbalancer controller,使用kubernetes的client-go。

先创建一个新的Serivce,并且指定Type为LoadBalancer。

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  selector:    app.kubernetes.io/name: MyApp  ports:    - protocol: TCP      port: 80      targetPort: 80  clusterIP: 10.0.171.239  type: LoadBalancer

这时Service的状态还是pending,因为还没有controller为其分配IP地址。

创建新的client