블로그 릴레이 - Amazon Bedrock Prompt Flows의 logic 노드들 알아보기
안녕하세요. 제조 비지니스 테크놀로지부의 이병현입니다.
본 블로그는 당사의 한국어 블로그 릴레이의 열여섯 번째 블로그입니다.
이번 블로그의 주제는 「블로그 릴레이 - Amazon Bedrock Prompt Flows의 logic 노드들 알아보기」 입니다.
Amazon Bedrock Prompt Flows가 지원하는 여러 노드들 중에 logic 노드라는 특별한 노드들이 있습니다.
노드의 이름처럼 동작을 컨트롤하는 노드들입니다. Prompt Flows에서 여러 패턴을 처리하기 위해 해당 노드들을 알아봅시다.
Condition
Condition 노드는 인풋의 값 조건에 따라 다음 노드로 진행할지 컨트롤 할 수 있습니다.
인풋에 들어올 수 있는 값들을 아래의 조건들에 따라 참과 거짓을 구분할 수 있습니다. 숫자의 대소 비교 그리고 문자열이 일치하는지, 여러 조건들을 합치거나 부정문들을 조건식으로써 사용할 수 있습니다.
Operator | Meaning | Supported data types | Example usage | Example meaning |
---|---|---|---|---|
== | Equal to (the data type must also be equal) | String, Number, Boolean | A == B | If A is equal to B |
!= | Not equal to | String, Number, Boolean | A != B | If A isn't equal to B |
> | Greater than | Number | A > B | If A is greater than B |
>= | Greater than or equal to | Number | A >= B | If A is greater than or equal to B |
< | Less than | Number | A < B | If A is less than B |
<= | Less than or equal to | Number | A <= B | |
and | Both expressions are true | (A < B) and (C == 1) | If both expressions are true:A is less than BC is equal to 1 | |
or | At least one expression is true | (A != 2) or (B > C) | If either expressions is true:A isn't equal to BB is greater than C | |
not | The expression isn't true | not (A > B) | If A isn't greater than B (equivalent to A <= B) |
그러면 실제로 노드들을 어떤식으로 사용할 수 있을지 해보겠습니다.
Condition 노드는 위 처럼 생겼습니다. Input, Conditions, If all conditions are false 크게 이 세 부분으로 나누어져있습니다.
Input은 들어오는 값들을 조절할 수 있습니다. 단순하게 문자열만 받아서 사용하는게 아니라 표현식을 이용해서 json 데이터를 파싱해 사용할 수 있습니다.
스크린샷에 보이는 $.data
는 모든 값을 의미하고 만약 {type: 'order', quantity: 10}
와 같이 input으로 들어올 때 type을 가져오고 싶으면 $.data.type
의 형태로 파싱하는게 가능합니다.
다음은 Conditions에는 우리가 받은 input의 조건을 작성해주면 됩니다. 만약 type이 order이고 quantity가 0 보다 커야하는 조건을 만들어보겠습니다.
(type == 'order') and (quantity > 0)
처럼 설정해 input의 이름으로 조건식을 만들 수 있습니다.
그리고 Go to node라는 항목이 있는데 이 부분은 해당 조건식이 맞으면 어떤 노드로 진행할 지 선택하는 부분입니다.
그러면 실제로 작성하면 이렇게 됩니다.
사용자의 input에서 파싱을 하고 조건식에 따라 특정 노드로 진행시켰습니다. 이번에는 조건식이 맞고 틀리고에 따라 프롬프트에 연결해보았으니 테스트해보겠습니다.
작성한 조건식에 맞춰서 {"type": "order", "quantity": 42 }
로 Input을 넣게 되면 아래처럼 성공적으로 결과가 나오는 것을 알 수 있습니다.
하지만 {"type": "order", "quantity": 0}
처럼 수량이 0개여서 조건식을 실패하는 경우를 테스트해보겠습니다.
그러면 위처럼 실패한 경우에 맞게 프롬프트를 타고 결과물이 나오는 것을 알 수 있습니다.
예시처럼 특정 조건에 따라 다른 프롬프트를 연결해서 사용자의 요청을 컨트롤하는 방법이 가능합니다.
Iterator
Iterator는 쉽게 얘기하면 for 문 입니다. 배열로 이루어진 인풋을 각 배열의 아이템들을 따로 처리할 수 있게 도와줍니다.
예를 들어 이렇게 해보겠습니다. Input으로 배열로 이루어진 데이터가 오고, 각 아이템들을 프롬프트에 던져서 특정한 처리를 해본다고 해볼게요.
그럼 배열에 3개의 아이템이 있다면 프롬프트가 각 아이템마다 처리를 하기 때문에 3개의 요청이 일어나게 됩니다. 실제로 데이터를 넣어봅시다.
Input으로 하나의 배열로 이루어진 문자열을 넘기게 되면 실제로 각 아이템마다 프롬프트가 데이터를 받아서 처리하는 것을 볼 수 있습니다.
여러개의 아이템을 각각 처리를 해주고 싶을 때 사용하면 유용하겠네요.
Collector
그럼 Iterator처럼 나누어진 데이터를 합치고 싶다면 어떻게 할까요? 그런경우에 사용할 수 있는게 Collector 노드입니다.
방금 만든 Iterator에서 만든 여러 요청을 합치는 예시를 만들어보겠습니다.
프롬프트로 여러개의 output을 만드는 과정에 Collector 노드를 추가하여 하나의 데이터로 합쳐봅시다.
실제로 데이터를 넣어보면 잘 동작하는 것을 확인할 수 있습니다.
각각의 아이템이 프롬프트를 통해 다른 output이 나왔던 것과는 다르게 하나의 output으로 나오게 되었습니다.
여러개의 요청으로 만들어진 결과물을 하나로 합칠 때 사용하면 유용하다는 것을 확인할 수 있었습니다.
마무리
3가지의 로직 노드들을 살펴보았습니다. 눈치채신 분은 있겠지만, 현재 요청은 유저가 json 혹은 배열의 형태로 요청을 줘야한다는 것을 알 수 있습니다. 하지만, 보통은 유저는 줄글로 질문할 것 이기 때문에 위의 경우가 통하지 않죠.
그렇지만, 우리는 사용자의 요청과 여러 로직 노드들 사이에 중간 레이어를 만들어 json과 배열로 만들어 처리하게 되면 매우 유용해집니다.
실제에서는 AWS Lambda으로 요청한 상태값을 보고 condition 노드를 통해 특정 프롬프트를 사용하거나, 사용자의 요청을 처리하려면 반복적으로 처리해야한다면 iterator를 사용한다거나 다시 합치고 싶다면 collector 노드를 사용할 수 있겠습니다.
이런 방법들은 코드로 작성할 때는 당연한 것들이지만, 위처럼 UI 상에서 플로우를 지정할 때에는 이렇게 로직을 처리할 수 있는 노드를 제공하는게 매우 편리하게 사용할 수 있다는 것을 알 수 있었습니다.
이상, 한국어 블로그 릴레이의 열여섯 번째 「Amazon Bedrock Prompt Flows의 logic 노드들 알아보기」 편이었습니다. 다음 열일곱 번째 블로그 릴레이는 10월 셋째 주에 공개됩니다.
끝까지 읽어주셔서 감사합니다! 이상, 제조 비지니스 테크놀로지부의 이병현 이었습니다.