AI Agent質疑応答例

この章では、最初の本格的なAI Agentを実際に構築します。

まずシンプルな質疑応答Agentから始めて、徐々に機能を追加していきます。

プロジェクト構造の準備

まずディレクトリを作成しますサンプル-ai-agent:

mkdir サンプル-ai-agent

ディレクトリに移動しますサンプル-ai-agent、uvコマンドを使用して仮想環境を作成します:

cd サンプル-ai-agent

# 创建名为 .venv 的虚拟环境(默认)
uv venv

# 激活环境(macOS/Linux)
source .venv/bin/activate

# 激活环境(Windows)
.venv\Scripts\activate

uvを使用して仮想環境を作成し有効化します。詳細は以下を参照してください:uvチュートリアル。

プロジェクトのディレクトリ構造を作成します:

サンプル-ai-agent/
├── .env
├── .gitignore
├── requirements.txt
├── test_basic_agent.py
├── README.md
├── src/
│   ├── __init__.py
│   └── simple_agent.py
└── tests/
    └── __init__.py

阿里百炼でAPIキーを申請する

この章では検索機能を使用します。阿里千問モデルを使用します。検索機能が組み込まれているからです。

阿里云百炼の通義千問モデルはOpenAI互換インターフェースをサポートしています。API Key、BASE_URL、モデル名を調整するだけで、既存のOpenAIコードを阿里云百炼サービスに移行して使用できます。

  • base_url:https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えます
  • api_key:阿里云百炼のAPI Keyに置き換えます
  • model: qwen3-max に置き換えます

参考URL:https://help.aliyun.com/zh/model-studio/compatibility-of-openai-with-dashscope

阿里云百炼モデルサービスを有効化し、API-KEYを取得する必要があります。

まず阿里云メインアカウントを使用して百炼モデルサービスプラットフォームにアクセスできます:https://bailian.console.aliyun.com/、次に右上隅のログインをクリックし、ログイン成功後、右上隅の歯車⚙️アイコンをクリックしてAPI keyを選択し、API keyをコピーします。ない場合はAPI keyを作成することもできます:

阿里云百炼の有効化は無料ですが、モデル呼び出し(無料枠を超えた場合)、モデルデプロイ、モデルチューニングには対応する料金が発生します。

現在APIを使用するには、トークン単位で課金されます。幸い高くないので、最も安いパッケージを購入しておきましょう:阿里云百炼大規模モデルサービスプラットフォーム。

百炼と方舟のCoding Planプランを直接使用することもできます:https://www.example.com/claude-code/coding-plan.html。

基本Agentクラスを作成します:

実例

# src/simple_agent.py
import os
from typing import List, Dict, Any
from openai import OpenAI
from dotenv import load_dotenv

# 環境変数を読み込む
load_dotenv()

class SimpleQAAgent:
    """シンプルな質疑応答Agent"""

    def __init__(self, model: str = "qwen3-max"): # デフォルトをDeepSeekモデルに設定
        """
Agentを初期化

        Args:
model: 使用するモデル名、デフォルトはDeepSeek
        """

        # api_key = os.getenv("OPENAI_API_KEY")
        api_key = "sk-xxx" # 申請したAPIキー
        base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
        if not api_key:
            raise ValueError("OPENAI_API_KEY 環境変数を設定してください")

        self.client = OpenAI(
                        api_key = api_key,
                        base_url = base_url)
        self.model = model
        self.conversation_history: List[Dict[str, str]] = []
        self.system_prompt = "あなたは役立つAIアシスタントです。丁寧かつ正確にユーザーの質問に答えてください。"

    def add_to_history(self, role: str, content: str):
        """メッセージを会話履歴に追加"""
        self.conversation_history.append({
            "role": role,
            "content": content
        })

        # 履歴の長さを10ターン以内に保つ(トークン超過を防ぐ)
        if len(self.conversation_history) > 10:
            self.conversation_history = self.conversation_history[-10:]

    def ask(self, question: str) -> str:
        """
Agentに質問する

        Args:
question: ユーザーの質問

        Returns:
Agentの回答
        """

        # ユーザーの質問を履歴に追加
        self.add_to_history("user", question)

        # メッセージリストを準備
        messages = [
            {"role": "system", "content": self.system_prompt}
        ]
        messages.extend(self.conversation_history)

        try:
            # OpenAI APIを呼び出す
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages,
                temperature=0.7,
                max_tokens=500
            )

            # 回答を抽出
            answer = response.choices[0].message.content

            # アシスタントの回答を履歴に追加
            self.add_to_history("assistant", answer)

            return answer

        except Exception as e:
            error_msg = f"API呼び出しエラー: {str(e)}"
            print(error_msg)
            return error_msg

    def clear_history(self):
        """会話履歴をクリア"""
        self.conversation_history.clear()

基本Agentをテストするテストスクリプトを作成します:

実例

# test_basic_agent.py
from src.simple_agent import SimpleQAAgent

def test_basic_agent():
    """基本の質疑応答Agentをテスト"""
    print("=== 基本の質疑応答Agentをテスト ===")

    # Agentを作成
    agent = SimpleQAAgent()

    # 質疑応答をテスト
    questions = [
        "こんにちは、自己紹介してください",
        "Pythonとは何ですか?",
        "機械学習と人工知能の違いは何ですか?"
    ]

    for question in questions:
        print(f"\n"ユーザー: {question}")
        answer = agent.ask(question)
        print(f"アシスタント: {answer}")

    # 会話の一貫性をテスト
    print("\n"=== 会話の一貫性をテスト ===")
    agent.clear_history()

    # 第1ラウンド
    q1 = "私の一番好きな色は青です"
    a1 = agent.ask(q1)
    print(f"ユーザー: {q1}")
    print(f"アシスタント: {a1}")

    # 第2ラウンド(前の会話を覚えているはず)
    q2 = "さっき私の一番好きな色は何と言いましたか?"
    a2 = agent.ask(q2)
    print(f"\n"ユーザー: {q2}")
    print(f"アシスタント: {a2}")

    print("\n"テスト完了!")

if __name__ == "__main__":
    test_basic_agent()

テストを実行します:

python test_basic_agent.py

=== 测试基础问答 Agent ===

ユーザー: 你好,请介绍一下自己
サンプル
助理: 你好!我是通义千问(Qwen),是阿里巴巴集团自主研发的超大规模语言模型。我可以帮助你回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等等,还能表达观点,玩游戏等。如果你有任何问题或需要帮助,随时告诉我!

ユーザー: Python是什么?
助理: 你好!Python 是一种**高级、解释型、通用的编程语言**,由荷兰程序员 **吉多·范罗苏姆(Guido van Rossum)** 于1991年首次发布。它的设计哲学强调代码的**可读性**和**简洁性**,语法清晰简洁,使得初学者也能快速上手。
...

この基本Agentにはいくつかの明らかな制限があります:

  • 学習データ内の知識にのみ回答できる
  • リアルタイム情報を取得できない
  • 計算を実行できない
  • 外部システムを操作できない

まさにこれがAgentにツールを追加する必要がある理由です。


検索ツールの追加

千問には検索機能が組み込まれており、enable_search: trueパラメータを渡すとオンライン検索機能を有効にできます。

# 导入依赖与创建客户端...
completion = client.chat.completions.create(
    # 需使用支持联网搜索的模型
    model="qwen3-max",
    messages=[{"role": "user", "content": "杭州明天天气如何"}],
    # 由于 enable_search 非 OpenAI 标准参数,使用 Python SDK 需要通过 extra_body 传入(使用Node.js SDK 需作为顶层参数传入)
    extra_body={"enable_search": True}
)

ドキュメントの説明:https://help.aliyun.com/zh/model-studio/web-search

検索ツールを統合したAgent

次に検索ツールをAgentに統合します。srcディレクトリにagent_with_search.pyファイルを作成します:

実例

# src/agent_with_search.py
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()


class AgentWithSearch:
    """Qwenの内蔵オンライン検索機能を利用したAgent"""

    def __init__(self, model: str = "qwen3-max"):
        api_key = "sk-xxx"
        base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"

        if not api_key:
            raise ValueError("OPENAI_API_KEY 環境変数(DashScope Key)を設定してください")

        self.client = OpenAI(
            api_key=api_key,
            base_url=base_url
        )
        self.model = model

        self.system_prompt = """
あなたは役立つAIアシスタントです。

質問がリアルタイム情報、最新の出来事、または事実確認が必要な内容に関する場合、
オンライン検索で最新情報を取得し、回答に情報がインターネット由来であることを明記できます。
"""


    def ask(self, question: str) -> str:
        messages = [
            {"role": "system", "content": self.system_prompt},
            {"role": "user", "content": question}
        ]

        try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages,
                temperature=0.7,
                max_tokens=800,
                extra_body={
                    "enable_search": True
                }
            )

            return response.choices[0].message.content

        except Exception as e:
            return f"エラー: {repr(e)}"

    def interactive_chat(self):
        print("=== Qwen オンライン検索 Agent ===")
        print(quit / exit を入力して会話を終了)

        while True:
            question = input("\n"あなた: ").strip()
            if question.lower() in {"quit", "exit"}:
                break

            print("アシスタント:", self.ask(question))

検索Agentのテスト

ルートディレクトリにtest_search_agent.pyファイルを作成します:

実例

# test_search_agent.py
from src.agent_with_search import AgentWithSearch

def test_search_agent():
    agent = AgentWithSearch()

    questions = [
        "今日の北京の天気はどうですか?",
        "最新のテクノロジーニュースは何ですか?",
        "2024年オリンピックの開催地はどこですか?",
        "Pythonとは何ですか?"
    ]

    for q in questions:
        print(f"\n"ユーザー: {q}")
        print("アシスタント:", agent.ask(q)[:300], "...")

if __name__ == "__main__":
    test_search_agent()

テストを実行します:

python test_search_agent.py
ユーザー: 今天北京的天气怎么样?
助理: 今天是2026年2月7日,星期六。根据最新天气预报信息,北京今天的天气情况如下:

- **天气状况**:多云转晴  
- **气温范围**:最低气温约 **-9℃**,最高气温约 **2℃**(部分区域如海淀区记录为 **-5℃ ~ 5℃**)  
- **风向风力**:白天到夜间有 **东北风1级**,部分地区午后转为 **南风转西北风,小于3级**  
- **空气质量**:**37(优)**  
- **穿衣建议**:建议穿棉衣、冬大衣、皮夹克、厚呢外套、羽绒服等厚重保暖衣物,并佩戴手套、帽子等防寒配件  
...
その他の拡張