가수면
Agent 구현 본문
구현 방법
구현 방식의 기본 개념 및 필요 요소들은 다음과 같다.
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. 최종 프롬프트의 주요 구성 사항은 다음과 같다.
- tools 제시 및 설명
- 포맷 지정 명령
- Question: 사용자의 질문
- Thought: 에이전트가 무엇을 할지
- Action: 특정 작업을 수행 지시 (알맞은 tool 고르기)
- Action Input: Action에 필요한 입력을 제공 (어떤 action을 골라야 할 지 지침)
- Observation: Action의 결과를 관찰 (검증을 위해 n번 반복할 수 있다는 추가 언급 필요)
- 이 단계들이 반복해 최종적으로 답변을 도출 - - Thought: 모든 단계를 마친 후 최종적으로 무엇을 할 지 생각
- Final Answer: 최종 답변
- Question, Thought(지난 결과 기록들 제공해 추론할 수 있도록 - scratchpad)
유용한 프롬트들 - https://smith.langchain.com/hub
예시) 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