This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
использование_ai-агентов [2026/07/17 07:45] val |
использование_ai-агентов [2026/08/03 09:52] (current) val [Черновик] |
||
|---|---|---|---|
| Line 4: | Line 4: | ||
| * Сегодня, наверное, нет пользователя сети Интернет, который бы не "общался" (хотя бы через чат в поисковой системе) с большими языковыми моделями (LLM), или, как это часто называют, искусственным интеллектом (AI) | * Сегодня, наверное, нет пользователя сети Интернет, который бы не "общался" (хотя бы через чат в поисковой системе) с большими языковыми моделями (LLM), или, как это часто называют, искусственным интеллектом (AI) | ||
| - | * Невероятные результаты, которые они показывают в качестве справочных и систем обработки данных, вызывают желание "поручить" им самостоятельное решение каких либо задач | + | * Невероятные результаты, которые они показывают в качестве справочных и систем обработки данных, вызывают желание найти им применение в решении каких либо повседневных задач |
| * Для этого используются AI агенты, и если Вы пока не работали с ними, наш вебинар для Вас | * Для этого используются AI агенты, и если Вы пока не работали с ними, наш вебинар для Вас | ||
| Line 10: | Line 10: | ||
| * Написать своего первого AI агента на python | * Написать своего первого AI агента на python | ||
| - | * Реализовать MVP с использованием AI и Asterisk по такому описанию: перед походом в магазин, звоним (можно несколько раз) на некий номер и просим запомнить, что хотим купить, в магазине, время от времени, звоним на тот же номер, говорим, что купили и просим напомнить, что еще осталось | + | * Реализовать MVP с использованием AI и Asterisk по описанию: Перед походом в магазин, звоним (можно несколько раз) ИИ агенту и просим добавить в список покупок товар, о котором "вспомнили". Затем, в магазине, время от времени, снова звоним агенту, говорим, что купили и просим перечислить, что еще осталось |
| - | * При разработке, в свою очередь, активно использовать LLM | + | * При разработке, так же, активно использовать LLM |
| ===== Запись вебинара ===== | ===== Запись вебинара ===== | ||
| Line 23: | Line 23: | ||
| ===== Шаг 1. Что у нас есть, для начала ===== | ===== Шаг 1. Что у нас есть, для начала ===== | ||
| + | * [[Голосовые сервисы помогут голосовой почте!]] (Занятие СЕМ 03.12.2019) | ||
| * [[Язык программирования Python]] | * [[Язык программирования Python]] | ||
| + | |||
| + | ===== ToDo ===== | ||
| + | |||
| + | * Если звоним в первый раз (контекста еще нет) - представиться (пересказать системный промпт?) | ||
| + | * Добавить возможность отправить список дел на почту | ||
| + | * Добавить возможность агенту позвонить и напомнить о деле | ||
| ===== Черновик ===== | ===== Черновик ===== | ||
| + | |||
| + | <code> | ||
| + | Привет, я хочу купить яблоки, хлеб и колбасу | ||
| + | Еще надо позвонить петрову и иванову | ||
| + | Я купил яблоки и колбасу, что еще осталось? | ||
| + | Петрову позвонил | ||
| + | Что надо сделать | ||
| + | </code> | ||
| <code> | <code> | ||
| ~/ai$ cp ari_rec_ai.py ari_rec_ai_content.py | ~/ai$ cp ari_rec_ai.py ari_rec_ai_content.py | ||
| Line 41: | Line 56: | ||
| from yandex_ai_studio_sdk import AIStudio | from yandex_ai_studio_sdk import AIStudio | ||
| - | from rich import inspect | + | #from rich import inspect |
| def request_to_agent_with_tools(user_request, system_prompt, context_messages=None, tools=None): | def request_to_agent_with_tools(user_request, system_prompt, context_messages=None, tools=None): | ||
| sdk = AIStudio( | sdk = AIStudio( | ||
| - | folder_id=os.getenv("FOLDER_ID"), | + | folder_id=os.getenv("YANDEX_FOLDER_ID"), |
| - | auth=os.getenv("API_KEY") | + | auth=os.getenv("YANDEX_API_KEY") |
| ) | ) | ||
| Line 75: | Line 90: | ||
| #inspect(messages, methods=True) | #inspect(messages, methods=True) | ||
| - | inspect(messages) | + | #inspect(messages) |
| response = model.run(messages) | response = model.run(messages) | ||
| - | # inspect(response, methods=True) | + | #inspect(response, methods=True) |
| choice = response.choices[0] | choice = response.choices[0] | ||
| Line 116: | Line 131: | ||
| "description": "Используй эту функцию, когда пользователь просит назвать его любимый фрукт." | "description": "Используй эту функцию, когда пользователь просит назвать его любимый фрукт." | ||
| } | } | ||
| - | |||
| ] | ] | ||
| + | | ||
| while True: | while True: | ||
| try: | try: | ||
| Line 124: | Line 138: | ||
| except (KeyboardInterrupt, EOFError): | except (KeyboardInterrupt, EOFError): | ||
| print("\nСессия завершена!") | print("\nСессия завершена!") | ||
| - | compressor_instruction = ( | ||
| - | "Ты — инструмент оптимизации контекста. Проанализируй историю диалога. " | ||
| - | "Удали выполненные дела, приветствия и воду. Сформулируй ОДНО лаконичное " | ||
| - | "сообщение от лица пользователя, в котором отражена только актуальная суть " | ||
| - | "и невыполненные задачи/оставшиеся вопросы на текущий момент." | ||
| - | ) | ||
| - | reply_text = request_to_agent_with_tools(user_request, compressor_instruction, chat_context, func_list) | ||
| - | print(reply_text) | ||
| sys.exit(0) | sys.exit(0) | ||
| reply_text = request_to_agent_with_tools(user_request, system_prompt, chat_context, func_list) | reply_text = request_to_agent_with_tools(user_request, system_prompt, chat_context, func_list) | ||
| - | if reply_text == 'random_number': | + | if 'random_number' in reply_text: |
| print(get_random_number()) | print(get_random_number()) | ||
| - | elif reply_text == 'random_fruit': | + | elif 'random_fruit' in reply_text: |
| print(get_random_fruit()) | print(get_random_fruit()) | ||
| else: | else: | ||
| Line 146: | Line 152: | ||
| <code> | <code> | ||
| # cat ~asterisk/ai/ari_rec_ai_content.py | # cat ~asterisk/ai/ari_rec_ai_content.py | ||
| + | </code><code> | ||
| import os | import os | ||
| import json | import json | ||
| Line 232: | Line 239: | ||
| print(f"Статус-код ответа: {response.status_code}") | print(f"Статус-код ответа: {response.status_code}") | ||
| print(f"Текст ответа: {response.text}") | print(f"Текст ответа: {response.text}") | ||
| + | |||
| + | def play_beep(channel_id): | ||
| + | print(f"Проигрываем сигнал перед записью в канал {channel_id}...") | ||
| + | play_url = f"{BASE_URL}/channels/{channel_id}/play" | ||
| + | play_payload = {"media": "sound:beep"} | ||
| + | requests.post(play_url, params=play_payload, auth=AUTH) | ||
| def start_recording(channel_id): | def start_recording(channel_id): | ||
| Line 265: | Line 278: | ||
| channel_caller_numbers[channel_id]=get_caller_number(channel_id) | channel_caller_numbers[channel_id]=get_caller_number(channel_id) | ||
| channel_contexts[channel_id] = load_context(channel_caller_numbers[channel_id]) | channel_contexts[channel_id] = load_context(channel_caller_numbers[channel_id]) | ||
| + | play_beep(channel_id) | ||
| #start_recording(channel_id) | #start_recording(channel_id) | ||
| # or | # or | ||
| - | detect_speech(channel_id) | + | #detect_speech(channel_id) |
| # Сценарий N | # Сценарий N | ||
| Line 333: | Line 347: | ||
| #start_recording(channel_id) | #start_recording(channel_id) | ||
| # or | # or | ||
| - | detect_speech(channel_id) | + | #detect_speech(channel_id) |
| + | |||
| + | if media_uri == "sound:beep": | ||
| + | print(f"Сигнал завершен. Начинаем запись для канала {channel_id}...") | ||
| + | detect_speech(channel_id) | ||
| + | |||
| + | elif "recording:rec_" in media_uri: | ||
| + | print(f"Воспроизведение записи завершено. Идем на новый круг для канала {channel_id}...") | ||
| + | play_beep(channel_id) | ||
| # Сценарий N: Абонент повесил трубку -> Удаляем файл | # Сценарий N: Абонент повесил трубку -> Удаляем файл | ||