가수면

Agent 구현 본문

Python/LLM

Agent 구현

니비앙 2024. 7. 17. 23:56

구현 방법

구현 방식의 기본 개념 및 필요 요소들은 다음과 같다.

 

1. tool로 사용할 함수를 정의한다. 이때, 함수명과 설명을 잘 적는 것이 중요하다.

예시)

def get_text_length(text: str) -> int:
    """Returns the length of a text by characters"""

2. 에이전트 프로세스를 실행시킬 프롬프트를 작성한다.

2-1. 이때  프롬프트에는 tool의 이름/설명과 tool 목록을 전달하여 LLM이 선택할 수 있도록 한다.

2-1. 최종 프롬프트의 주요 구성 사항은 다음과 같다.

  1. tools 제시 및 설명
  2. 포맷 지정 명령
  3. Question: 사용자의 질문
  4. Thought: 에이전트가 무엇을 할지
  5. Action: 특정 작업을 수행 지시 (알맞은 tool 고르기)
  6. Action Input: Action에 필요한 입력을 제공 (어떤 action을 골라야 할 지 지침)
  7. Observation: Action의 결과를 관찰 (검증을 위해 n번 반복할 수 있다는 추가 언급 필요)
    - 이 단계들이 반복해 최종적으로 답변을 도출 -
  8. Thought: 모든 단계를 마친 후 최종적으로 무엇을 할 지 생각
  9. Final Answer: 최종 답변
  10. Question, Thought(지난 결과 기록들 제공해 추론할 수 있도록 - scratchpad)

유용한 프롬트들 - https://smith.langchain.com/hub

 

LangSmith

 

smith.langchain.com

예시) hwchase17/react의 프롬프트를 사용

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}
Thought:{agent_scratchpad}

3. LLM 등 필수 요소 생성

4. 응답에 대해 Action, Action Input, Observation, Final Answer 등의 답변 부분만을 추출하는 정규식 필터링 로직

정규식 예시)

        regex = (
            r"Action\s*\d*\s*:[\s]*(.*?)[\s]*Action\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)"
        )
        
 # 결과 예시
 tool='get_text_length' tool_input='DOG"\n' log='I should use the get_text_length function to find the length of the word "DOG".\n    Action: get_text_length\n    Action Input: "DOG"\n

5. 최종 결과를 도출할 때까지 에이전트를 위한  프롬프트에 각 변수 전달하고 에이전트를 반복문으로 수행

5-1. 각 반복문마다 실행 과정을 기록하는 리스트를 생성

5-2. 각 반복문마다 실행과정을 기록

5-3. 반복문에 프롬프트 변수(scratchpad)로 실행 과정을 전달

5-4. 불필요한 응답을 제거, 겹치는 응답을 제거하기 위해 LLM에 stop 토큰 설정 (ex. "\nObservation", "Observation")

Langchain을 이용한 반복문 예시)

    agent_step = ""
    execution_num = 1

    while not isinstance(agent_step, AgentFinish):
        agent_step: Union[AgentAction, AgentFinish] = agent.invoke(
            {
                "input": "What is the length of the word: DOG",
                "agent_scratchpad": intermediate_steps,
            }
        )
        print(f"{execution_num}번째 실행??", agent_step)
        if isinstance(agent_step, AgentAction):
            tool_name = agent_step.tool
            tool_to_use = find_tool_by_name(tools, tool_name)
            tool_input = agent_step.tool_input
            observation = tool_to_use.func(str(tool_input))
            print(f"{observation=}")
            intermediate_steps.append((agent_step, str(observation)))

        execution_num += 1

    if isinstance(agent_step, AgentFinish):
        print("### 최종 결과 ###")
        print(agent_step.return_values)

'Python > LLM' 카테고리의 다른 글

프롬프트 엔지니어링  (0) 2024.07.22
토큰 한도 처리 전략  (4) 2024.07.22
Vector Db, Embedding  (0) 2024.07.07
[기본] LangChain  (0) 2024.06.30
Comments