2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Qodo-Embed-1」驚異の性能!最先端コード埋め込みモデルを試してみた

Posted at

こんにちは、開発者の皆さん

最近、Qodoの最先端コード埋め込みモデル「Qodo-Embed-1」を試してみました。特に、1.5Bの小型バージョンでも、その性能に非常に感動しました。

この記事では、以下のトピックについて詳しく解説します。

  • コード埋め込みとは?
  • Qodo-Embed-1-1.5Bとは?
  • モデルの主な機能
  • Qodo-Embed-1-1.5Bを実際に使ってみる

それでは、始めましょう

コード埋め込みとは?

コード埋め込みは、複雑なコード構造を数値ベクトルに変換し、コードの意味や機能を捉える技術です。

簡単に言うと、コードを単なるテキストではなく、「意味を持った数字」に変換することで、機械がコードの意味を理解し、比較できるようにするものです。

例えば、Googleマップが場所を緯度・経度で表現するように、コード埋め込みはコードをベクトル(数値のリスト)として表現し、類似したコード同士が近い位置になるようにします。

以下のPython関数を例に考えてみましょう。

def add_numbers(a, b):
    return a + b

def sum_two_values(x, y):
    result = x + y
    return result

上記の2つの関数は異なるコードですが、同じような処理を行っているため、埋め込み空間では近い位置にマッピングされます。

Qodo-Embed-1-1.5Bとは?

Qodo-Embed-1-1.5Bは、ソフトウェア開発分野の検索タスク向けに設計された最先端のコード埋め込みモデル(1.5Bパラメータ)です。

このモデルは、自然言語からコード、コードからコードの検索に最適化されています。

モデルの主な機能:

コード検索: 大規模なコードベースの中から効率的に検索可能。

RAG(Retrieval-Augmented Generation): コード生成の精度を向上。

セマンティックコード理解: コードスニペット間の複雑な関係を捉える。

マルチ言語対応: 主要な9つのプログラミング言語に対応(Python, C++, C#, Go, Java, JavaScript, PHP, Ruby, TypeScript)。

高次元埋め込み: 1536次元の豊かな表現を生成。

Qodo-Embed-1-1.5Bを実際に使ってみる

Qodo-Embed-1には2つのサイズがあります。

  • Lite (1.5B): Qodo-Embed-1-1.5B
  • Medium (7B): Qodo-Embed-1-7B

このモデルは、Hugging Face TransformersやSentenceTransformersライブラリを使って利用できます。

クイックセットアップ

pip install sentence-transformers

ユースケース1: 文の類似度検索

以下のPythonコードは、文同士の類似度を計算し、最も近い文を特定するものです。

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

model = SentenceTransformer("Qodo/Qodo-Embed-1-1.5B", trust_remote_code=True)

source_sentence = "それはとても幸せな人です。"
sentences_to_compare = [
    "それは幸せな人です。",
    "それは幸せな犬です。",
    "今日は晴れの日です。",
    "その男性は喜びに満ちて笑っています。"
]

source_embedding = model.encode([source_sentence])
comparison_embeddings = model.encode(sentences_to_compare)

similarity_scores = cosine_similarity(source_embedding, comparison_embeddings)[0]
most_similar_idx = int(np.argmax(similarity_scores))
most_similar_sentence = sentences_to_compare[most_similar_idx]

print(f"最も類似した文: \"{most_similar_sentence}\"")
print(f"類似度スコア: {similarity_scores[most_similar_idx]:.4f}")

期待される出力:

最も類似した文: "それは幸せな人です。"
類似度スコア: 0.9795

ユースケース2: コード検索

以下のコードは、自然言語のクエリを使用して、最も関連性の高いコードスニペットを検索します。

snippets = [
    """def binary_search(arr, target):
    low, high = 0, len(arr)-1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1""",

    """def reverse_linked_list(head):
    prev = None
    current = head
    while current:
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node
    return prev"""
]

query = "Pythonで連結リストを反転させる方法"
query_embedding = model.encode(query)
snippets_embeddings = model.encode(snippets)
similarities = cosine_similarity([query_embedding], snippets_embeddings)
most_similar_idx = np.argmax(similarities)

print("最も関連性の高いコードスニペット:")
print(snippets[most_similar_idx])

期待される出力:

def reverse_linked_list(head):
    prev = None
    current = head
    while current:
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node
    return prev

まとめ

このモデルは、たった1.5Bのパラメータながら、3~4倍のサイズのモデルに匹敵する性能を発揮しました。

RAGパイプラインの構築、コード検索ツールの開発、または開発環境の向上を考えているなら、このモデルは試す価値があります。

最後まで読んでいただきありがとうございました!この記事が役に立ったと思ったら、ぜひ「いいね」と「シェア」をお願いします

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?