Практичні зауваження: семантичний пошук серед інструментів MCP за допомогою Amazon Bedrock AgentCore
Покрокова інструкція з практичних нотаток: семантичний пошук у інструментах MCP за допомогою Amazon Bedrock AgentCore: контракти, перевірки та готові блоки коду для команд, які використовують цю схему.
У цьому посібнику описано процес створення системи, яка починається з сировини та закінчується функціональною системою для семантичного пошуку серед інструментів MCP за допомогою Amazon Bedrock AgentCore Gateway. Основна увага приділяється крокам виконання, чітким перевіркам та коду, який можна просто додати до репозиторію без необхідності здогадуватися щодо його призначення. Для загального огляду необхідно визначити вхідні дані, виконавця кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись здогадатися про прихований стан системи. Розглядайте цю стадію як контракт між вхідними даними та перевіреними результатами. Призначте назви елементам, визначте критерії успіху та не допускайте безповідомного часткового завершення роботи.
Що ви створюєте
Під час роботи над проектом «What you build» спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успішне виконання та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Запишіть час виконання та витрати на токени або запити поруч із результатами функціоналу. Чітке бачення витрат заздалегідь запобігає несподіваним рахункам, коли процес переходить від демо-версії до спільних середовищ. Фіксуйте назву інструменту, хеш аргументів, час відгуку та результат кожного виклику. Без цих записів дебагування може займати години.
Чому саме семантичний пошук з боку Gateway
Під час роботи над темою «Чому семантичний пошук з боку Gateway» спочатку запишіть контракт: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Тримайте конфігурацію окремо від коду додатку. Файли середовища, сховища секретних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Фіксуйте назву інструменту, хеш аргументів, час відгуку та результат кожного виклику. Без цих записів дебагування агентів займає години.
Попередні вимоги
Під час роботи над передумовами спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність пізніших змін у коді. Одночасно задокументуйте шлях успішного виконання та шлях відновлення. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої доробки. Фіксуйте назву інструменту, хеш аргументів, час виконання та результат кожного виклику. Без цих записів дебагування займає години. Під час роботи над передумовами спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність пізніших змін у коді. Розглядайте цей етап як угоду між вхідними даними та перевіреними результатами. Назвіть створювані елементи, визначте критерії успіху та не допускайте безповідомного часткового завершення роботи.
Здійснити семантичний пошук
Семантичний пошук працює найкраще, коли його розглядають як вимірювану систему. Зафіксуйте один ідеальний результат, один випадок невдачі та примітки щодо скасування змін перед розширенням обсягу роботи. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Відображення витрат заздалегідь запобігає несподіваним рахункам під час переходу від демо-середовища до спільних середовищ. Надавайте інструменти з вузькими схемами та чіткими позначеннями побічних ефектів. Адміністраторам потрібно знати, які виклики змінюють стан системи, перш ніж автоматично схвалювати їх.
Крок 1: Запит до інструменту пошуку
Крок 1: Запит до інструменту пошуку найкраще функціонує, якщо його розглядати як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу роботи. Тримайте конфігурацію окремо від коду додатку. Файли середовища, сховища конфіденційних даних та прапорці функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь граф. Робіть інструменти доступними з вузькими схемами та чіткими позначеннями побічних ефектів. Хостам потрібно знати, які виклики змінюють стан, перш ніж вони автоматично схвалюють їх.
from mcp.client.streamable_http import streamablehttp_client
from mcp.client.session import ClientSession
async with streamablehttp_client(gateway_url) as (r, w, _):
async with ClientSession(r, w) as session:
await session.initialize() result = await session.call_tool(
"x_amz_bedrock_agentcore_search",
{"query": "find a customer by phone number"},
) for match in result.content:
print(match.text)
Крок 2: Використовуйте результати для фільтрації списку інструментів
Крок 2: Використовуйте результати для фільтрації списку інструментів – це найкраще працює, якщо розглядати його як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу. Документуйте як успішний, так і відновлювальний сценарії разом. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. Відображайте інструменти з вузькими схемами та чіткими позначеннями побічних ефектів. Хостам потрібно знати, які виклики змінюють стан, перш ніж вони автоматично схвалять їх.
async def smart_tool_selection(session, user_request: str, top_k: int = 5):
search = await session.call_tool(
"x_amz_bedrock_agentcore_search",
{"query": user_request},
)
relevant_tool_names = [match.text for match in search.content[:top_k]] all_tools = await session.list_tools()
return [t for t in all_tools.tools if t.name in relevant_tool_names]
Крок 3: Під’єднати його до агента Strands
Крок 3: Під’єднати його до агента Strands найкраще працює, якщо розглядати його як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу. Віддавайте перевагу малим, тестованим одиницям перед складними скриптами. Коли якийсь крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на заплутану послідовність дій.
from strands import Agent
from strands.tools.mcp import MCPClient
async def run(user_message: str):
async with MCPClient(gateway_url) as mcp:
relevant_tools = await smart_tool_selection(mcp.session, user_message) agent = Agent(
model="anthropic.claude-opus-4-7-v1:0",
tools=relevant_tools,
system_prompt="Use only the provided tools to answer.",
)
return await agent.run_async(user_message)