시퀀셜 에이전트플로우 상세 사용법

이번 튜토리얼에서는 사용자의 질의를 분석해 검색이 필요하다면 검색을 통해 최신 정보를 참고해 답변하고, 검색이 필요 없다면 기반 지식으로만 답변하는 Sequential Agentflow를 제작합니다.

Sequential Agent 만들기

1. 워크플로우 만들기

  • 서비스 > 에이전트 > 워크플로우에서 워크플로우를 생성합니다.

  • 적절한 이름을 작성하고 생성합니다.

  • Flowise Step 추가에서 Agentflow를 선택해 flowchart를 추가합니다.

2.1. 기본적인 Agentflow 구성하기

  • flowchart 좌측 상단에 + 버튼을 눌러 노드를 추가할 수 있습니다.

1. ChatMNC

Agent의 답변 생성에 사용할 모델을 정의합니다.

2. SQLite Agent Memory

Agent들에게 이전 대화 기록을 저장할 DB를 제공합니다.

3. State

Flowise에서 state는 플로우(또는 에이전트)의 실행 중간에 발생하는 데이터를 저장하고 관리하는 임시 저장소 입니다.

4. Start

Sequential agentflow 의 시작을 정의하는 노드입니다. 답변 모델과 State Memory, Agent Memory 등을 할당할 수 있습니다.

5. Agent

주어진 지시를 따르는 Agent입니다. Tool을 할당할 수 있으며, Tool node의 Description을 읽고 상황에 맞는 Tool을 사용하여 답변에 활용합니다.

* 본 튜토리얼에서는 다음과 같이 프롬프트를 구상하였습니다.

* {변수명}으로 정의된 프롬프트는 Format Prompt Values에서 동적으로 채워질 수 있습니다.

6.End

Sequential agentflow 의 끝을 정의하는 노드입니다.

  • 우측 상단의 채팅 아이콘을 클릭하면 Agentflow의 동작을 간편하게 확인할 수 있습니다. (동작하지 않을경우 저장 후 다시 시도해 보세요.)

2.2. Condition Node를 활용한 분기점 만들기

  • 2.1에서 끝의 End 노드를 제거하고 다음과 같이 구성합니다.

7. Condition Node

특정 조건을 바탕으로 분기할 수 있는 Node입니다. 분기 조건은 다양하며, State 메모리 내의 변수가 될 수도 있고, 이전 Agent의 답변이 될 수도 있습니다.

  • Condition Node의 Condition에서 분기 조건과 이름을 정의합니다. 본 튜토리얼에서는 이전 Agent의 답변을 분기 조건으로 설정하였습니다.

if seqAgent_0.output == 'Answer':
    output_Name = 'Lets Answer'
elif seqAgent_0.output == 'Search':
    output_Name = 'Search'
else:
    output_Name = 'End'

튜토리얼에서의 Condition Node는 위 코드와 동일한 역할을 수행합니다.

8. Loop Node

특정 Agent로 돌아갑니다. 주로 예상치 못한 출력이 나왔을 때 활용합니다.

Loop Node는 LLM Node, Agent Node로 이동할 수 있습니다.

Loop Node에는 노드의 이름을 기준으로 Loop를 형성합니다.

2.3. Custom Tool Node로 Agent에게 Tool 할당하기

Flowise에는 다양한 Tool이 정의돼 있지만, 이번 튜토리얼에서는 직접 Tool을 제작해 사용합니다.

Custom Tool 노드를 추가해 Searcher에게 할당합니다.

Custom Tool의 설정에서 Tool의 적절한 이름과 Description을 작성합니다.

Tool에서 받아야 하는 변수가 있다면, INPUT SCHEMA에 필요한 변수들을 작성합니다. 현재 제작하고자 하는 도구는 Search Tool이므로 query(검색어)를 변수로 추가합니다.

하단의 javascript function에서 tool의 기능을 코드로 작성합니다.

INPUT에서 받은 변수는 ${변수명}으로 불러올 수 있습니다.

const fetch = require('node-fetch');

// Flowise에서 입력받은 쿼리
const query = $query;

// SearchAPI.io의 GET URL 구성
const url = `https://www.searchapi.io/api/v1/search?engine=google&gl=kr&hl=ko&q=${encodeURIComponent(query)}&api_key=${your_api_key}`;
return (async () => {
  try {
    const response = await fetch(url);

    if (!response.ok) {
      throw new Error(`API 요청 실패: ${response.statusText}`);
    }

    const data = await response.json();

    const results = data.organic_results || [];

    if (results.length === 0) {
      return '검색결과 없음';
    }

    const search_summary = results.map(item => ({
      content: item.snippet || '',
      url: item.link || ''
    }));
    return { search_summary };
  } catch (error) {
    return '검색결과 없음';
  }
})();

다음과 같이 작성하여 검색 결과의 content와 url을 가져오는 tool을 제작하였습니다.

3. Sequential Agent Test하기

Agentflow의 구성이 전부 완료됐습니다. 이제 실제 동작을 확인해봅시다.

우측 상단의 chatting 아이콘을 통해 flowchart의 동작을 확인해볼 수 있습니다.

'hi'라는 질의에 'Answer.'이라는 대답이 출력됐고, 이는 'Answer'(맞춤표가 없어야함)이라는 조건에 부합하지 않으므로 Loop Node에 의해 Supervisor로 돌아가는 모습입니다.

이후 Supervisor가 다시 답변을 생성하여 'Answer'을 제대로 출력하여 분기 조건을 만족합니다.

이렇듯 Loop Node를 통해 의도치 않은 상황에 대해 대처할 수 있습니다.

Condition Node에 의해 Advisor로 분기돼 답변을 생성하였습니다.

이번엔 최신 정보에 대한 질의를 보냈고, 'Search'로 올바르게 출력하였습니다.

사용된 모델은 2024년까지의 정보를 학습한 모델이지만, 최신 정보를 묻는 질의에도 도구 사용을 통해 알맞는 답변을 이끌어내는 모습입니다. Agent가 사용한 도구들은 답변 위에 명시돼 직접 출력을 확인할 수 있습니다.

Search Tool에서 'current president of the United States'라는 query를 입력하여 다음과 같은 결과를 받았고, 이를 바탕으로 답변했음을 알 수 있습니다.

Last updated

Was this helpful?