Пример вопросов и ответов по AI-агенту

В этой главе мы создадим нашего первого настоящего AI-агента.

Мы начнём с простого Q&A-агента и постепенно добавим больше функций.

Подготовка структуры проекта

Сначала создайте каталогexample-ai-agent:

mkdir example-ai-agent

Перейдите в каталогexample-ai-agentи используйте команду uv, чтобы создать виртуальное окружение:

cd example-ai-agent

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

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

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

Используйте uv, чтобы создать и активировать виртуальное окружение. Для получения дополнительной информации можно прочитатьруководство по uv。

Создайте структуру каталогов проекта:

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

Получите API Key в Alibaba Bailian

В этой главе требуется функция поиска, поэтому мы используем модель Alibaba Qwen, так как она имеет встроенную функцию поиска.

Модель Tongyi Qianwen в Alibaba Cloud Bailian поддерживает API, совместимые с OpenAI. Вам нужно только изменить API Key, BASE_URL и имя модели, чтобы перенести существующий код OpenAI в Alibaba Cloud Bailian.

  • base_url: замените на https://dashscope.aliyuncs.com/compatible-mode/v1
  • api_key: замените на ваш API Key от Alibaba Cloud Bailian
  • model: замените на qwen3-max

Ссылка для справки:https://help.aliyun.com/zh/model-studio/compatibility-of-openai-with-dashscope

Нам нужно активировать сервис моделей Alibaba Cloud Bailian и получить API-KEY.

Сначала войдите на платформу Bailian Model Studio, используя основную учётную запись Alibaba Cloud:https://bailian.console.aliyun.com/, затем нажмите Login в правом верхнем углу. После входа нажмите на значок шестерёнки ⚙️ в правом верхнем углу, выберите API key и скопируйте его. Если у вас его нет, вы также можете создать API key:

Активация Alibaba Cloud Bailian не влечёт никаких расходов. Плата взимается только за вызовы моделей (после превышения бесплатной квоты), развёртывание моделей и тонкую настройку моделей.

] API теперь тарифицируются по токенам. К счастью, цены вполне доступные, поэтому мы можем начать с покупки самого дешёвого пакета:Платформа сервиса больших моделей Bailian от Alibaba Cloud。

Вы также можете напрямую использовать пакет Coding Plan от Bailian и Ark: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:
    """Простой агент вопросов и ответов"""

    def __init__(self, model: str = "qwen3-max"): # Установить модель по умолчанию DeepSeek
        """
Инициализировать агент

        Аргументы:
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 = "Вы — полезный ИИ-ассистент. Пожалуйста, отвечайте на вопросы пользователей вежливо и точно."

    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:
        """
Задать вопрос агенту

        Аргументы:
question: Вопрос пользователя

        Возвращает:
Ответ агента
        """

        # Добавить вопрос пользователя в историю
        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()

Создайте тестовый скрипт для тестирования базового агента:

Пример

# test_basic_agent.py
from src.simple_agent import SimpleQAAgent

def test_basic_agent():
    """Тест базового агента вопросов и ответов"""
    print("=== Тест базового агента вопросов и ответов ===")

    # Создать агента
    agent = SimpleQAAgent()

    # Тест вопросов и ответов
    questions = [
        "Здравствуйте, представьтесь, пожалуйста",
        "Что такое Python?",
        "В чём разница между машинным обучением и искусственным интеллектом?"
    ]

    for question in questions:
        print(f"\nПользователь: {question}")
        answer = agent.ask(question)
        print(f"Ассистент: {answer}")

    # Тест согласованности диалога
    print("\n=== Тест согласованности диалога ===")
    agent.clear_history()

    # Первый раунд
    q1 = "Мой любимый цвет — синий"
    a1 = agent.ask(q1)
    print(f"Пользователь: {q1}")
    print(f"Ассистент: {a1}")

    # Второй раунд (должен помнить предыдущий разговор)
    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 ===

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

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

У этого базового агента есть несколько очевидных ограничений:

  • Может отвечать только на основе знаний из обучающих данных
  • Не может получать информацию в реальном времени
  • Не может выполнять вычисления
  • Не может управлять внешними системами

Именно поэтому нам нужно добавить инструменты в агента.


Добавить инструмент поиска

В Qwen есть встроенная функция поиска; передав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_with_search.py в каталоге src:

Пример

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

load_dotenv()


class AgentWithSearch:
    """Агент, основанный на встроенной возможности веб-поиска Qwen"""

    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)")

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

        self.system_prompt = """
Вы — полезный ИИ-ассистент.

Когда вопрос касается информации в реальном времени, последних событий или контента, требующего проверки фактов,
вы можете получить последнюю информацию через веб-поиск и указать в своих ответах, что информация взята из интернета.
"""


    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 ===")
        print("Введите quit / exit, чтобы завершить разговор")

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

            print("Ассистент:", self.ask(question))

Тест поискового агента

Создайте файл 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
User: 今天北京的天气怎么样?
助理: 今天是2026年2月7日,星期六。根据最新天气预报信息,北京今天的天气情况如下:

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