Agent 는 LLM 이 복잡한 문제를 단계별로 쪼개고 각 부분의 문제를 외부 도구들 (e.g 구글 검색, 위키피디아 검색, 파이썬 함수 코드, 외부 API 호출 등) 과 상호작용해서 해결하도록 할 수 있음.

 

언어 모델이 가진 한계를 깰 수 있고, 작업의 워크플로우를 고정적으로 처리하는게 아니라 유연한 방식으로 처리할 수 있단느 이점이 있음.

그럼 Agent 는 어떻게 외부 도구들을 이용해서 상호 작용 할 수 있는 건가?

 

이건 Agent 를 실행할 떄 사용되는 프롬포트를 보면 이해할 수 있음

Answer the following questions as best you can. You have access to the following tools:

{tools}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!

Question: {input}

 

보면은 LLM 이 사용할 수 있는 도구들을 tools 에 명시된다. 이 tools 에 대한 설명으로 내가 사용할 수 있는 툴과 툴에 대한 설명이 적혀져있을 것이고, 이걸 바탕으로 LLM 은 사용할 툴을 선택할 수 있다.

 

LLM 이 사용할 툴을 선택하게 되면 툴에 대한 이름과 툴에 대한 매개변수 같은 걸 LLM 이 응답보낼건데 그걸 바탕으로 코드로 실행하게 될거임. 이거는 LangChain 같은데서 해준다.

 

다음 질문으로 넘어가서 Agent 가 그래서 어떻게 동작하는지를 보자면 질문이 주어졌을 때 Agent 는 이 프롬포트를 가지고 LLM 에게 던지면 사용할 툴과 행동 (Action) 들이 정해진다.

 

실제로 LLM 이 사용할 툴을 결정했다면 이런 응답 포맷으로 올거임

Quesiton: QUESTION
Thought: THOUGHT 
Action: 
```json
{
    "action": TOOL_NAME,
    "action_input": TOOL_PARAMETERS
}
```

 

그리고 행동을 한 이후에 결과를 가지고 와서 다시 LLM 은 생각한다. 이제 이 질문에 답하기 위해서는 다음에는 어떠한 행동을 해야하는지를 생각해보는거지.

 

이렇게 원래의 질문  (Question) 과 LLM 이 했던 생각 (Thoguth) 그리고 행동 (Action) 그리고 행동에 대한 결과 (Observation) 은 누적되면서 최종적인 응답으로 가는거임. 

 

이런식으로 최종적으로 원하는 답까지 가게되면 사용자에게 응답이 가게 되는거임

 

이 실행 구조는 다음과 같다:

  • 질문이 들어오면 Question + Agent Prompt 를 가지고 LLM 에게 질문을 던진 후 Action 을 수행한다. 그리고 Action 에 대한 결과를 가져와서 프롬포트에 합친 후 다음 라운드를 시작한다. 다시 LLM 에게 최종 결과를 하기 위해 무엇을 해야하는지 질문을 하는거지.
  • 이렇게 여러 라운드를 거치고 나서 최종적인 답변이 생성되었다고 판단하면 사용자에게 반환하는거임.

 

References:

+ Recent posts