Вопрос или проблема
Я создаю персонализированный чат-бот с использованием AWS Bedrock Agent и следовал этой документации, чтобы он знал предыдущую информацию, когда начинается новый разговор через API InvokeAgent:
https://docs.aws.amazon.com/pt_br/bedrock/latest/userguide/agents-session-state.html
Таким образом, я хочу, чтобы, когда пользователь собирается пообщаться с LLM (здесь используется Claude 3.5 Sonnet), при его первом запросе я передавал sessionState с параметрами sessionAttributes в вызове. В sessionAttributes я отправляю имя пользователя, возраст и предыдущие разговоры, чтобы LLM мог ‘знать’ пользователя до генерации первого ответа, основываясь на предыдущих взаимодействиях и информации из базы данных.
Вот скрипт, который я написал:
import uuid
import boto3
def invoke_agent(agent_id, agent_alias_id, session_id, prompt):
"""
Отправляет подсказку для обработки и ответа агента,
используя как sessionAttributes, так и promptSessionAttributes.
"""
try:
# Определяем атрибуты сеанса для поддержания контекста, специфичного для пользователя, в ходе взаимодействий
response = agents_runtime_client.invoke_agent(
agentId=agent_id,
agentAliasId=agent_alias_id,
sessionId=session_id,
sessionState={
'sessionAttributes': {
'userName': 'Yoran', # {user.name}
'userAge': '21', # {year(today - user.birthdate)}
'summary': 'Пользователь много говорил о языках программирования, таких как Python и Javascript' # {user.summary_conversation}
},
},
inputText=f"{prompt}", ## user_message,
enableTrace=False,
)
completion = ""
for event in response.get("completion"):
chunk = event["chunk"]
completion += chunk["bytes"].decode()
except Exception as e:
print(f"Не удалось вызвать агента. {str(e)}")
raise
return completion
# Определяем параметры чата
agent_alias_id = "XXXXXXXX"
agent_id = "XXXXXXXX"
session_id = str(uuid.uuid4())
input_text = "Как меня зовут??"
# Вызываем агента с sessionAttributes и promptSessionAttributes
response = invoke_agent(agent_id, agent_alias_id, session_id, input_text)
print(response)
Я передаю userName как параметр sessionAttributes, но когда я спрашиваю о своем имени в первом вызове API, LLM отвечает:
Извините, но у меня нет вашего имени в записях. Не хотите ли сообщить мне ваше имя?
Я использую это неправильно? Я прочитал всю документацию и думал, что это лучший способ дать LLM память, но я просто не могу получить то, что ожидаю.
Я пытался использовать параметры, приведенные в документации AWS Bedrock, чтобы дать LLM память о контексте/долгосрочный контекст.
Я ожидал, что LLM сможет читать свои sessionAttributes.
Ответ или решение
Проблема, с которой вы столкнулись при использовании параметров sessionAttributes
в AWS Bedrock Agent, скорее всего связана с тем, как язычная модель (LLM) обрабатывает и использует эти данные. Ваша реализация передачи sessionAttributes
в API выглядит корректной, однако есть несколько аспектов, которые стоит учесть.
-
Проверка структуры запросов: Убедитесь, что
sessionAttributes
правильно передаются в методеinvoke_agent
. Вы можете добавить отладочный вывод (например,print(sessionState)
), чтобы убедиться, что данные формируются корректно. -
Форматирование данных: Иногда модели могут неправильно интерпретировать данные, если они не находятся в ожидаемом формате. Убедитесь, что значения всех атрибутов соответствуют ожидаемому формату. Например, если возраст должен быть числом, передавайте его числом, а не строкой.
-
Обработка LLM: Убедитесь, что LLM действительно поддерживает использование
sessionAttributes
при генерации ответа. Возможно, модель, которую вы используете, не настроена на автоматическое извлечение информации из этих атрибутов. В таком случае вам может потребоваться модифицировать ваш ввод (prompt) так, чтобы явно указывать данные, которые вы хотите использовать. Например, вы можете модифицировать строку запроса, чтобы она звучала так:"Меня зовут {userName}, мне {userAge} лет. Что ты об этом думаешь?"
. -
Логика обработки запросов: Если ваша модель не учитывает контекст из
sessionAttributes
, рассмотрите возможность интеграции логики на уровне вашего приложения, чтобы формировать ввод с учетом этой информации. -
Работа с документацией и поддержкой: Если после всех проверок проблема сохраняется, подумайте о том, чтобы обратиться в поддержку AWS, предоставив им минимально воспроизводимый пример, включая ваши входные данные и ожидаемые результаты.
Пример исправленного передаваемого текстового запроса может выглядеть так:
input_text = f"Меня зовут {sessionState['sessionAttributes']['userName']}, мне {sessionState['sessionAttributes']['userAge']} лет. Как ты считаешь, это нормально?"
Таким образом, вы явным образом сообщаете модели о том, какую информацию вы хотите использовать в диалоге.
Следуя этим рекомендациям, вы сможете лучше настроить взаимодействие с AWS Bedrock Agent и избежать проблем с передачей состояния сеанса. Удачи в дальнейших разработках!