情報を探索しやすくするサイトを高速化するためにOpenAI APIを捨てた

# はじめに
最近のサービス開発では、AIっぽいことを行おうとする際にLLMを活用することは当たり前になってきました。
しかしLLMの選定はあまり行われずOpenAI APIをそのまま活用するというケースが多いのではないでしょうか？
そこで今回はgroqというサービスを使用し、LLMの精度と速度などを比較し、他の選択肢もあるよ～というのを伝えられたらと思います

# 宣伝
groqに乗り換えて高速になりました、ぜひ使ってみてください
https://knotix.net

# groqとは
https://groq.com/
このサービス、OpenAI APIからの乗り換えも用意で利用料金も無料という素晴らしいサービスです。
例えばOpenAI APIを使用したコードだと
```python
from openai import OpenAI

client = OpenAI(api_key='api-key')
import time

# OpenAI APIキーを設定します（自分のAPIキーを使ってください）

# 実行速度の計測を行う関数
def generate_text_with_openai(prompt):
    # 時間計測の開始
    start_time = time.time()

    # OpenAI APIを使ったテキスト生成
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
    )

    # 時間計測の終了
    end_time = time.time()
    elapsed_time = end_time - start_time

    # 生成結果と実行時間を表示
    generated_text = response.choices[0].message.content.strip()
    print("Generated Text:")
    print(generated_text)
    print("\nExecution Time: {:.2f} seconds".format(elapsed_time))
    return generated_text

# テキスト生成を行うプロンプト
prompt = "Explain the concept of machine learning"

# 関数の呼び出し
text = generate_text_with_openai(prompt)
len(text)
```
ですが、Groqだと
```python
from groq import Groq

# Create the Groq client
client = Groq(api_key="API-key")


# 実行速度の計測を行う関数
def generate_text_with_openai(prompt):
    # 時間計測の開始
    start_time = time.time()

    # OpenAI APIを使ったテキスト生成
    response = client.chat.completions.create(
        model="llama3-70b-8192",
        messages=[{"role": "user", "content": prompt}],
    )

    # 時間計測の終了
    end_time = time.time()
    elapsed_time = end_time - start_time

    # 生成結果と実行時間を表示
    generated_text = response.choices[0].message.content.strip()
    print("Generated Text:")
    print(generated_text)
    print("\nExecution Time: {:.2f} seconds".format(elapsed_time))
    return generated_text

# テキスト生成を行うプロンプト
prompt = "Explain the concept of machine learning"

# 関数の呼び出し
text = generate_text_with_openai(prompt)
len(text)
```
とclientとmodelの部分を書き換えるだけで速攻で乗り換えれるというのが素晴らしいサービスになっています。

# 評価
今回の評価はG-Evalを使用しました。G-Evalについては以下の記事を参照していただけるとわかりやすいと思います。
https://zenn.dev/fukuchan3542/articles/dc67924de2c218
評価用のコード
```python
from deepeval.test_case import LLMTestCase, LLMTestCaseParams
from deepeval.metrics import GEval
import os

#シークレットからAPI keys情報呼び出し
os.environ["OPENAI_API_KEY"]='API-key'

# テストケースの作成。inputにLLMの出力、actual_outputに正解出力
test_case = LLMTestCase(input=prompt, actual_output=text)
coherence_metric = GEval(
    name="Coherence",
    criteria="Coherence - the collective quality of all sentences in the actual output",
    evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT],
)
# スコアと理由のリストを作成
scores = []
reasons = []

# 5回の評価を行うループ
for i in range(5):
    coherence_metric.measure(test_case)
    scores.append(coherence_metric.score)
    reasons.append(coherence_metric.reason)

# 平均スコアの計算
average_score = sum(scores) / len(scores)

# 出力
print(f"平均スコア: {average_score}")
print("各回の評価理由:")
for i, reason in enumerate(reasons):
    print(f"評価 {i + 1}: {reason}")
```

# 実験結果
実際の実験結果は以下のようになりました
## 生成速度
* GPT-4o-mini 
  * 6.39秒
* GPT-3.5-turbo
  * 2.37秒
* llama-3-70B-8192(Groq)
  * 2.78秒

## 生成された文章の長さ
* GPT-4o-mini 
  * 2814文字
* GPT-3.5-turbo
  * 1299文字
* llama-3-70B-8192(Groq)
  * 2278文字

## G-Eval
* GPT-4o-mini 
  * 0.9782982198757211
* GPT-3.5-turbo
  * 0.9629350592450487
* llama-3-70B-8192(Groq)
  * 0.9923382284368631

# 感想
いかがでしょうか、今回の結果からGroqは精度も高くレスポンスが早いことがわかります。
LLMを活用したサービスでネックになるのがその生成速度だと思いますが、それの解決の一案としてGroqを選定してみるのもありなのではないでしょうか。