플레이북을 정의할 때 에이전트 동작을 더 효과적으로 제어하는 데 사용할 수 있는 인라인 Python 코드인 코드 블록을 선택적으로 제공할 수 있습니다. 이 코드는 특수 데코레이터가 있는 함수와 필요한 유틸리티 함수로 구성됩니다.
코드를 작성할 때 에이전트 동작을 제어하기 위해 코드 블록 시스템 라이브러리 를 사용할 수 있습니다.
제한사항
다음과 같은 제한사항이 적용됩니다.
- 코드 블록에는 데이터를 유지하는 객체가 포함될 수 없습니다. 하지만 도구를 사용하여 데이터를 유지하고 상태를 유지할 수 있습니다.
- 코드 블록은 원격 호출을 직접 실행할 수 없습니다. 예를 들어 Python 요청 라이브러리를 사용할 수 없습니다. 하지만 도구를 활용하여 원격 호출을 간접적으로 실행할 수 있습니다.
- Python 이름으로 변환되는 리소스 이름 은 유효한 Python 이름이어야 합니다.
- 흐름 전환이 발생하지 않는 한 코드 블록은 세션 매개변수를 작성할 수 없습니다.
인라인 액션
인라인 액션은 도구 액션과 유사하게 동작합니다. 인라인 액션에는 유형 주석과 독스트링을 포함하여 Python 함수 시그니처에 의해 결정되는 정의된 입력 및 출력 스키마가 있습니다. 도구 호출과 마찬가지로 LLM은 액션을 구현하는 코드를 인식하지 못합니다.
샘플:
@Action
def is_prime(n: int) -> bool:
"""Returns true if n is prime."""
if not isinstance(n, int) or n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
이 함수의 경우 LLM에는 액션, 입력, 출력에 관한 정보가 제공됩니다.
플레이북 안내에서 인라인 액션을 참조하려면 백틱으로 액션 이름을 참조하고 사용 방법을 설명하면 됩니다.
place_order 인라인 액션 샘플:
Take the customer's order, then call the `place_order` action when the order is ready.
인라인 액션을 사용하는 예시를 만들려면 입력 및 출력 섹션에서 인라인 액션 도구 유형을 사용합니다.
자세한 내용은 @Action 참고 문서를 확인하세요.
트리거 함수
트리거 함수는 코드에서 조건부 액션 을 정의하는 데 사용됩니다.
트리거 함수는 데코레이터를 사용하여 선언됩니다. 다음 트리거 함수 데코레이터를 사용할 수 있습니다.
| 데코레이터 | 데코레이터 매개변수 | 설명 |
|---|---|---|
| @EventTrigger | event: str, condition: str(condition은 선택사항임) |
이벤트에 의해 트리거됨 |
| @BeforeModelTrigger | condition: str(condition은 선택사항임) |
LLM이 다음 액션을 예측하기 전에 매번 트리거됨 |
| @BeforeActionTrigger | condition: str(condition은 선택사항임) |
LLM이 액션을 실행하기 전에 매번 트리거됨 |
| @BeforePlaybookTrigger | condition: str(condition은 선택사항임) |
플레이북이 처음 시작될 때 트리거됨 |
예를 들어 이러한 함수는 이러한 데코레이터와 데코레이터 매개변수를 사용하는 방법과 respond 코드 블록 시스템 라이브러리 함수를 사용하는 방법을 보여줍니다.
# No decorator parameter
@PlaybookStartTrigger
def my_playbook_conditional_action():
respond("How can I help?")
# With a condition decorator parameter
@BeforeActionTrigger('$next-action.name = "search"')
def my_before_action_conditional_action():
respond("One moment please")
# Event
@EventTrigger(event="welcome")
def my_welcome_event():
respond("hi")
# Event with a condition:
@EventTrigger(event="welcome",
condition="$sys.func.NOW().hours < 10")
def my_good_morning_event():
respond("Good morning ☕")
흐름, 플레이북, 도구 참조
코드 블록에서 특정 흐름, 플레이북, 도구 를 흐름, 플레이북, 및 도구 전역 변수를 사용하여 참조할 수 있습니다.
이러한 각 객체에는 상응하는 리소스의 이름과 일치하는 멤버가 있습니다. 이러한 이름은 유효한 Python 이름이어야 합니다.
샘플:
add_override(playbooks.troubleshooting, {})
add_override(flows.billing)
add_override(tools.weather_api.get_weather, {"location": "San Francisco"})
코드 블록에서 흐름과 플레이북을 참조할 때는 다음 구문을 사용하여 플레이북 안내에서도 참조해야 합니다.
${RESOURCE_TYPE: my_resource_name}
예를 들어 코드 블록에 flows.myflow 및 playbooks.myplaybook이 포함되어 있다면 플레이북 안내에 다음이 포함되어야 합니다.
${FLOW: myflow}
${PLAYBOOK: myplaybook}
액션 재정의
코드 블록을 사용하여 LLM에 의해 결정되는 추가 액션이 발생하기 전에 발생할 액션의 큐를 만들고 잠재적으로 재정의할 수 있습니다. add_override
대기 중인 모든 재정의 액션은 순차적으로 실행되며 액션 출력은 LLM에서 사용할 수 있습니다. 재정의가 respond 또는 턴을 완료하는 다른 함수로 턴을 완료하지 않는 한 큐가 비어 있으면 작업이 액션 및 입력 선택을 위해 LLM으로 돌아갑니다.
함수 인수:
- action: 발생할 액션입니다.
인라인 액션의 경우
my_function_name을 사용합니다. 도구 액션의 경우tools.my_tool_name.my_tool_action을 사용합니다. 흐름 액션의 경우flows.my_flow_name을 사용합니다. - inputs: 액션의 선택적 입력입니다.
예:
{"location": "Omaha"}
샘플:
# Assuming remote tool named "dmv" with operationId "search_offices"
# remote tool with only requestBody
add_override(tools.dmv.search_offices,{"address": "95030"})
# remote tool with only parameters
add_override(tools.pets.get_pet, {"id": "123"})
# remote tool with requestBody + parameters:
add_override(tools.pets.create_pet, {"requestBody": {"arg1":"foo"}, "param1": "bar"})
# datastore. Assumes existing datastore tool named "Menu".
add_override(tools.menu.Menu, {"query": "what is the menu"})
# code block action. Assumes another code block @Action my_action.
add_override(my_action)
응답 재정의
액션 재정의와 비슷하지만 특히 에이전트 응답의 경우 respond 전역 함수를 사용하여 에이전트가 특정 콘텐츠로 사용자에게 응답하도록 강제할 수 있습니다.
샘플:
respond("Hello")
도구 호출
코드 블록 함수에서 에이전트에 대해 정의된 도구를 호출할 수 있습니다. 도구 액션을 재정의할 때와 달리 도구를 직접 호출하면 도구 실행 결과를 LLM에서 사용할 수 없습니다.
샘플:
# Assumes existing tool named "DMV" with operationId "search_offices"
# remote tool with only request body.
offices = tools.dmv.search_offices({"address": "95030"})
# remote tool with parameters and request body
offices = tools.dmv.search_offices({"requestBody": {"address":"95030"}, "param1":"foo"})
# datastore actions. Assumes existing datastore tool named "Menu".
data = tools.menu.Menu({"query": "get the menu"})["snippets"]
의도 일치
샘플:
matches = flows.flow1.match_intent(history.last_user_utterance).matches
if matches and matches[0].intent == "some_intent":
to_country = matches[0].parameters.get("to_country")
if to_country:
respond(f"To confirm, you're going to {to_country}, right?")
세션 매개변수 읽기
코드 블록은 실행 시 사용할 수 있는 매개변수를 읽을 수 있습니다.
샘플:
state["$session.params.my-param"]
state["$request.session-id"]
디버깅
시뮬레이터를 사용하여 코드 블록 함수를 디버깅할 수 있습니다. 이러한 함수는 시뮬레이터에 액션으로 표시되며 필요에 따라 세부정보를 제공합니다.
추가 제어
이 가이드에서는 코드 블록 시스템 라이브러리의 몇 가지 일반적인 사용 사례를 다룹니다. 추가 제어 유형은 라이브러리 문서를 참고하세요.