作詞支援AIボットの開発奮闘記(2)

# 前回に引き続き、作詞支援AIボットの開発奮闘記

対面チャット形式では、ある程度の会話は成立するものの、どうしても「井の中の蛙」感が否めない
ボットが参照できる情報が限られているため、生成される歌詞もバリエーションに乏しく、ありきたりなものになる

# COHEREの実装
COHEREには、「ロール」と呼ばれる概念があり、ボットの役割を定義する必要がある。
既定のロールは４つしかない。

```assign_role``` 関数：

より柔軟なロール割り当てシステムを実装しました。
キーワードベースのスコアリングシステムを導入し、メッセージの内容に基づいて適切なロールを割り当てます。
```python
import requests
import json
import os
import re
from collections import Counter

def assign_role(message):
    """Automatically assign a role to the message based on its content using advanced rules and scoring."""
    
    roles = ["USER", "CHATBOT", "SYSTEM", "TOOL"]
    scores = {role: 0 for role in roles}

    # Define keywords for each role
    keywords = {
        "USER": ["お願い", "質問", "教えて", "どうすれば", "なぜ", "ユーザー", "知りたい", "方法", "やり方", "困っている", "問題", "ヘルプ"],
        "CHATBOT": ["こんにちは", "ありがとう", "どういたしまして", "会話", "はい", "いいえ", "確認", "了解", "かしこまりました"],
        "SYSTEM": ["設定", "システム", "エラー", "指示", "操作", "システムメッセージ", "完了", "状態", "バージョン", "アップデート"],
        "TOOL": ["検索", "ツール", "データ", "API", "計算", "解析", "処理", "分析", "変換", "生成", "抽出", "翻訳"]
    }

    # Count keyword occurrences
    words = message.lower().split()
    word_counter = Counter(words)
    
    # Calculate scores based on keyword occurrence
    for role, role_keywords in keywords.items():
        scores[role] = sum(word_counter[word] for word in role_keywords if word in word_counter)

    # Additional context-based scoring
    if "エラー" in message or "システム" in message:
        scores["SYSTEM"] += 2
    if "検索" in message or "ツール" in message:
        scores["TOOL"] += 2
    if "ありがとう" in message or message.strip() in ["はい", "いいえ", "了解"]:
        scores["CHATBOT"] += 2
    if any(keyword in message for keyword in ["お願い", "教えて", "質問"]):
        scores["USER"] += 2

    # Determine the role with the highest score
    assigned_role = max(scores, key=scores.get)

    # If no significant keywords are found, default to "USER"
    if all(score == 0 for score in scores.values()):
        assigned_role = "USER"

    return assigned_role

def summarize_chat_history(chat_history):
    """Summarize the chat history to reduce token usage."""
    # This is a placeholder function. In a real implementation, you would use
    # a more sophisticated summarization technique, possibly using an AI model.
    return f"Summary of previous {len(chat_history)} messages."
   

def generate_response_cohere(chat_history, message):
    url = "https://api.cohere.ai/v1/chat"
    headers = {
        "accept": "application/json",
        "content-type": "application/json",
        "Authorization": os.getenv("COHERE_API_KEY")
    }

    # Assign role based on message content
    role = assign_role(message)

    # Summarize chat history
    history_summary = summarize_chat_history(chat_history)

    # Prepare the chat history with the summary and current message
    prepared_history = [
        {"role": "SYSTEM", "message": f"This is a summary of previous conversation: {history_summary}"},
        {"role": role, "message": message}
    ]

    data = {
        "chat_history": prepared_history,
        "message": message,
        "connectors": [{"id": "web-search"}]
    }

    try:
        response = requests.post(url, headers=headers, json=data)
        response.raise_for_status()
        response_data = response.json()
        return response_data.get('text', "Error: No 'text' key found in the API response.")
    except requests.RequestException as e:
        return f"Error: Request failed - {str(e)}"
    except json.JSONDecodeError:
        return "Error: Failed to parse the API response as JSON."

# Example usage
if __name__ == "__main__":
    chat_history = [
        {"role": "USER", "message": "こんにちは、天気について教えてください。"},
        {"role": "CHATBOT", "message": "はい、どの地域の天気をお知りになりたいですか？"}
    ]
    message = "東京の天気を教えてください。"
    response = generate_response_cohere(chat_history, message)
    print(response)


```

# 今後の展望
COHEREとRAGの導入により、作詞支援AIボットは大きく進化する可能性を秘めています。
今後は、以下の点を改良していく予定です。
* ロールの細分化: より詳細なロールを定義することで、ボットの専門性を高める。
* チャット履歴の活用: チャット履歴をより効果的に活用し、ユーザーの好みを学習する。
* 評価指標の導入: 生成された歌詞の質を評価する指標を導入し、ボットの性能を向上させる。

# 参考記事
COHERE公式サイト
Retrieval Augmented Generation(RAG)とは

# おわりに
今回は、作詞支援AIボットにCOHEREとRAGを導入する取り組みについて紹介しました。
まだまだ開発途上ですが、WEB情報を取り込むことで、ボットの可能性は大きく広がりました。
今後も、AI技術を活用して、より創造的な作詞支援ツールを開発していきたいと思います。
最後まで読んでいただき、ありがとうございました！