Максимальное количество последовательных вызовов инструментов в ответе

Привет :wave:

Я создал два пользовательских инструмента для сбора информации из интернет-магазинов. Такая информация включает название магазина, ссылку на товар, цену и данные о наличии. После сбора этих данных результаты выводятся в виде таблицы.

  1. Для этого я создал пользовательский инструмент поиска Google, похожий на встроенный инструмент поиска Google, но с возможностью ограничения количества результатов. Также я смог создать отдельный программируемый поиск, который используется только этим инструментом. Это было необходимо, чтобы в результатах отображались только релевантные интернет-магазины.

  2. Следующий пользовательский инструмент похож на инструмент веб-браузинга Discourse, но я оптимизировал его специально для интернет-магазинов. Сначала он ищет формат на основе JSON schema.orgOffer или Product”, расположенный в <script type="application/ld+json">, и выполняет поиск необходимых данных (цена, информация о наличии) внутри него. Если это не дает результатов, он начинает поиск на основе itemtype. Если и это не дает результатов, то применяется стандартное поведение инструмента веб-браузера, которое заключается в анализе основного содержимого страницы и поиске необходимой информации. Еще одной важной функцией, внедренной в этот инструмент, является ограничение токенов. Я могу установить максимальное ограничение токенов во время просмотра. В настоящее время оно составляет 3000.

Но причина, по которой я создаю эту тему, заключается в следующем: существует ли какое-либо ограничение на использование инструментов? Я заметил, что после 5 использований инструмента процесс прерывается. Это еще одна причина, по которой я установил ограничение количества результатов в пользовательском поиске. Я установил его на 4, чтобы инструмент браузера мог работать успешно. Если я установлю его на 5, инструмент браузера завершится с ошибкой при 5-м использовании :arrow_down_small:

Например: в ответе после одного поиска в Google и пяти последовательных запросов к веб-браузеру я получаю предупреждение в /logs.

Сообщение (3 копии)

DiscourseAi: Инструмент не найден: tool-name

Трассировка стека

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:130:in `block in warn'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:130:in `warn'
/var/www/discourse/plugins/discourse-ai/lib/ai_bot/bot.rb:158:in `block in reply'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:190:in `block (5 levels) in perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:190:in `each'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:190:in `block (4 levels) in perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:178:in `each'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:178:in `block (3 levels) in perform_completion!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:535:in `call_block'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:526:in `<<'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:162:in `read'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:631:in `read_chunked'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:595:in `block in read_body_0'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:588:in `inflater'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:593:in `read_body_0'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:363:in `read_body'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:173:in `block (2 levels) in perform_completion!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2433:in `block in transport_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:320:in `reading_body'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2430:in `transport_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2384:in `request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/net_patches.rb:19:in `block in request_with_mini_profiler'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/mini_profiler/profiling_methods.rb:50:in `step'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/net_patches.rb:18:in `request_with_mini_profiler'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:116:in `block in perform_completion!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:1632:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:1070:in `start'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:99:in `perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/open_ai.rb:40:in `perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/llm.rb:279:in `generate'
/var/www/discourse/plugins/discourse-ai/lib/ai_bot/bot.rb:115:in `reply'
/var/www/discourse/plugins/discourse-ai/lib/ai_bot/playground.rb:477:in `reply_to'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/create_ai_reply.rb:18:in `execute'
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform'
/var/www/discourse/app/jobs/base.rb:299:in `each'
/var/www/discourse/app/jobs/base.rb:299:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in `execute_job'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:132:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in `block in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in `local'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in `stats'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in `global'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in `prepare'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in `process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in `process_one'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:8:in `watchdog'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread'

Я точно не знаю, что вызывает эту ошибку, возможно, это ограничение. Если да, есть ли возможность добавить настройку для персоны или пользовательского инструмента, чтобы установить лимит последовательного использования инструментов в ответе.

Редактирование: Я нашел это, что, вероятно, и есть ограничение. Было бы здорово иметь возможность переопределить это с помощью настройки, о которой я упоминал выше.

Спасибо :slightly_smiling_face:

Что такое инструмент веб-браузинга Discourse и где его можно найти или скачать?!

Полагаю, речь идет о инструментах, которые может использовать ИИ. Таким образом, они могут активироваться при редактировании AI-персон.

Я пока не сталкивался с этой проблемой, но если это действительно жёстко заданное ограничение, то было бы здорово иметь возможность его переопределить!

В наборе персонажей, предоставляемых плагином по умолчанию, есть «Исследователь». Вы можете посмотреть его, чтобы понять, как он работает :slight_smile:

Какую LLM вы используете?

Возвращает ли ваша LLM более 5 вызовов функций в одном ответе, то есть параллельные вызовы функций?

Можете ли вы поделиться этим ответом от LLM?

GPT4o, GPT4o Mini, Gemini Flash 2. Честно говоря, я пробовал множество LLM. :grin:

Да, это происходит, когда я задаю Forced Tools и добавляю системное сообщение в Персону для проверки данных. Например: «посетите все сайты, найденные через поиск Google». Это необходимо для одного из моих вариантов использования.

Я отправлю вам пример в личные сообщения, так как это может быть неподходящим контентом для публичного обсуждения. В этом примере бот использует Google Search и Web Browser с моделью Gemini Flash 2.

Кажется, я вижу эту ошибку… В целом параметр max_tools был нужен, чтобы избежать огромных цепочек вызовов инструментов, но, вероятно, существуют два разных типа ограничений:

  • Максимальное количество циклов обмена с LLM перед ответом.
  • Максимальное количество вызовов инструментов (которое может быть значительно выше).
  • Максимальный объем контекста, который могут добавить инструменты (например, если вы исчерпаете контекст за 3 вызова инструмента, а затем добавите ещё 2, из-за чего модель забудет о двух предыдущих ответах инструментов).

Подумаю над этим, проблема решаема.

Недавно я значительно увеличил цифры, как сейчас выглядит ситуация?