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クラスを作成します:
実例
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をテストするテストスクリプトを作成します:
実例
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ファイルを作成します:
実例
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ファイルを作成します:
実例
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(优)** - **穿衣建议**:建议穿棉衣、冬大衣、皮夹克、厚呢外套、羽绒服等厚重保暖衣物,并佩戴手套、帽子等防寒配件 ...その他の拡張
