Skip to content

Latest commit

 

History

History
189 lines (127 loc) · 11.3 KB

reflection-agent.md

File metadata and controls

189 lines (127 loc) · 11.3 KB

Reflection Agent

Reflection은 Agent을 포함한 AI 시스템의 품질과 성공률을 높이기 위해 사용되는 프롬프트 전략(prompting strategy)입니다. 여기에서는 LangGraph의 Blog - Reflection Agents을 참조하여 Reflection Agent를 구현합니다.

Reflection 동작

LangChain - Reflection에서는 아래와 같이 Reflection의 동작을 설명하고 있습니다. 사용자의 요청이 Generate에 전달되면 초기 응답을 생성합니다. Reflect는 초기 응답으로 Reflections을 생성하고 이를 N번 반복한 이후에 응답을 사용자에게 전달합니다.

image

상세한 동작을 설명하기 위해 Activity Diagram을 그려보면 아래와 같습니다.

  1. "START"가 "generat"에 사용자의 input을 전달하면, "generate"는 LLM으로 답변(generation)을 생성하여 "should_continue"에 전달합니다.
  2. "should_continue"는 일정 숫자만큼만 reflection을 수행하도록 제어합니다. 여기서는 메시지의 길이가 6이하인 경우에는 "reflect"에 보내고, 이상인 경우에는 "END"로 보내서 동작을 종료하도록 하고 있습니다. 메시지는 Human/AI 형태로 저장되므로 6이하라면 모두 3회 반복하게 됩니다.
  3. "reflect"는 "generate"가 생성한 답변(generation)을 받아서, LLM Prompt를 이용해 향상된 답변(reflection)을 생성합니다.
  4. 이 동작을 3회 반복 수행한 후에 "END"에 최종 답변을 전달합니다.

상세한 코드는 lambda_function.py을 참조합니다. 동작은 agent-reflection-kor.ipynb에서 확인할 수 있습니다. 그밖에 참고할 만한 자료는 아래와 같습니다.

상세구현

상세코드는 lambda_function.py을 참조합니다. State 클래스를 준비합니다.

class State(TypedDict):
    messages: Annotated[list, add_messages]

에세이 생성을 위해 generation() 노드를 준비합니다.

def generation(state: State):    
    prompt = ChatPromptTemplate.from_messages(
        [
            (
                "system",
                "당신은 5문단의 에세이 작성을 돕는 작가이고 이름은 서연입니다"
                "사용자의 요청에 대해 최고의 에세이를 작성하세요."
                "사용자가 에세이에 대해 평가를 하면, 이전 에세이를 수정하여 답변하세요."
                "최종 답변에는 완성된 에세이 전체 내용을 반드시 포함하여야 하고, <result> tag를 붙여주세요.",
            ),
            MessagesPlaceholder(variable_name="messages"),
        ]
    )
        
    chat = get_chat()
    chain = prompt | chat

    response = chain.invoke(state["messages"])
    return {"messages": [response]}

Reflection을 수행합니다.

def reflection(state: State):
    messages = state["messages"]
        
    reflection_prompt = ChatPromptTemplate.from_messages(
        [
            (
                "system",
                "당신은 교사로서 학셍의 에세이를 평가하삽니다. 비평과 개선사항을 친절하게 설명해주세요."
                "이때 장점, 단점, 길이, 깊이, 스타일등에 대해 충분한 정보를 제공합니다."
                "각 문단의 길이는 최소 200자 이상이 되도록 관련된 예제를 충분히 포함합니다.",
            ),
            MessagesPlaceholder(variable_name="messages"),
        ]
    )
        
    chat = get_chat()
    reflect = reflection_prompt | chat
        
    cls_map = {"ai": HumanMessage, "human": AIMessage}
    translated = [messages[0]] + [
        cls_map[msg.type](content=msg.content) for msg in messages[1:]
    ]
    print('translated: ', translated)
        
    res = reflect.invoke({"messages": translated})    
    response = HumanMessage(content=res.content)    
    return {"messages": [response]}

반복하는 횟수를 총 3회로 아래와 같이 설정합니다.

def should_continue(state: State) -> Literal["continue", "end"]:
    messages = state["messages"]
        
    if len(messages) >= 6:   # End after 3 iterations        
        return "end"
    else:
        return "continue"

Workflow를 Graph를 선언합니다.

def buildReflectionAgent():
    workflow = StateGraph(State)
    workflow.add_node("generate", generation)
    workflow.add_node("reflect", reflection)
    workflow.set_entry_point("generate")
    workflow.add_conditional_edges(
        "generate",
        should_continue,
        {
            "continue": "reflect",
            "end": END,
        },
    )

    workflow.add_edge("reflect", "generate")
    return workflow.compile()

app = buildReflectionAgent()

구현된 workflow는 아래와 같습니다.

image

이제 아래와 같이 실행합니다.

query = "한국 인공지능 발전을 어떤 준비를 해야할지 설명하세요. 특히 한국의 현황과 향후 중국, 일본, 미국과 어떻게 경쟁해야할지 기술하세요."
inputs = [HumanMessage(content=query)]

for event in app_reflection.stream({"messages": inputs}, stream_mode="values"):   
    message = event["messages"][-1]
    if message.content and len(event["messages"])>1:
        print('generate: ', message.content)

아래는 생성된 에세이 초안입니다.

여기 한국 인공지능 발전을 위한 5문단 에세이 초안입니다:

1. 한국은 인공지능 기술 발전을 위해 정부 차원의 전략적 투자와 지원이 필요합니다. 정부는 인공지능 연구개발에 많은 예산을 할당하고 우수 인재 육성 프로그램을 마련해야 합니다. 또한 인공지능 기업에 대한 세제 혜택과 규제 완화 등 기업 친화적 정책을 펼쳐야 합니다.

2. 한국 기업들은 인공지능 기술 개발에 적극적으로 나서야 합니다. 대기업은 인공지능 연구소를 설립하고 스타트업 인수 등 투자를 아끼지 말아야 합니다. 중소기업도 인공지능 기술을 자사 제품과 서비스에 접목하는 노력이 필요합니다. 기업들이 정부와 긴밀히 협력하여 기술 상용화에 박차를 가해야 합니다.

3. 한국의 우수한 인력을 활용하는 것도 중요합니다. 한국은 세계 수준의 과학기술 인재를 많이 보유하고 있습니다. 정부와 기업은 이들 인재가 국내에서 연구할 수 있는 환경을 만들어야 합니다. 동시에 해외 우수 인재를 적극 유치하여 국내 인공지능 생태계를 더욱 풍부하게 해야 합니다.

4. 중국, 일본, 미국 등 주요국과의 협력도 필수적입니다. 인공지능 기술은 국가 간 경계를 넘나드는 분야입니다. 한국은 이들 국가와 인재 교류, 공동 연구개발, 기술 이전 등의 협력을 강화해야 합니다. 상호 윈윈할 수 있는 전략적 제휴를 맺어 경쟁력을 높여야 합니다.

5. 마지막으로 인공지능 기술 발전에 따른 사회적 영향에도 대비해야 합니다. 인공지능으로 인한 일자리 변화, 윤리적 문제 등에 선제적으로 대응하는 정책과 제도를 마련해야 합니다. 인공지능 기술이 국가 발전과 국민 행복에 기여할 수 있도록 사회 전반의 인프라를 구축해야 합니다.

최종적으로 완성된 에세이는 아래와 같습니다.

인공지능 기술 발전에 따른 사회적 영향에도 대비해야 합니다. 인공지능으로 인한 일자리 변화, 윤리적 문제 등에 선제적으로 대응하는 정책과 제도를 마련해야 합니다. 인공지능 기술이 국가 발전과 국민 행복에 기여할  있도록 사회 전반의 인프라를 구축해야 합니다."

1. 한국은 인공지능 기술 발전을 위해 정부 차원의 전략적 투자와 지원이 필요합니다. 정부는 인공지능 연구개발에 많은 예산을 할당해야 합니다. 또한 우수 인재 육성 프로그램을 마련하여 인공지능 전문가를 체계적으로 양성해야 합니다. 인공지능 기업에 대해서는 세제 혜택과 규제 완화  기업 친화적 정책을 펼쳐 활발한 기술 혁신이 일어날  있도록 해야 합니다.

2. 한국 기업들 역시 인공지능 기술 개발에 적극적으로 나서야 합니다. 대기업은 인공지능 전문 연구소를 설립하고, 유망 인공지능 스타트업에 대한 인수  투자를 아끼지 말아야 합니다. 중소기업도 자사 제품과 서비스에 인공지능 기술을 접목하는 노력이 필요합니다. 기업들이 정부와 긴밀히 협력하여 인공지능 기술의 상용화를 앞당겨야 합니다.

3. 한국은 우수한 과학기술 인재를 많이 보유하고 있지만, 아직 인공지능 분야 전문 인력이 부족한 실정입니다. 정부와 기업은 이들 인재가 국내에서 연구할  있는 환경을 조성해야 합니다. 동시에 해외 우수 인공지능 인재를 적극 유치하여 국내 인공지능 생태계를 더욱 풍부하게 해야 합니다.

4. 중국, 일본, 미국  주요국과의 협력도 필수적입니다. 중국의 정부 주도 인공지능 육성 정책에 대응하여 민간 기업의 자율성을 보장하는 정책을 펼쳐야 합니다. 일본의 제조업 인공지능 기술 강점을 인정하고 상호 기술교류를 활성화해야 합니다. 미국의 선도적 인공지능 기업들과 전략적 제휴를 맺어 기술 격차를 줄여나가야 합니다. 인재 교류, 공동 연구개발, 기술 이전  다각적인 협력을 통해 상호 윈윈할  있어야 합니다.

5. 한국은 우수한 ICT 인프라와 기술력을 바탕으로 인공지능 발전의 잠재력이 크지만, 아직 주요 기술과 인재가 부족한 실정입니다. 또한 인공지능 기업에 대한 투자와 정부 지원이 미흡하여 글로벌 경쟁력이 뒤처지고 있습니다.

6. 인공지능 기술 발전에 따른 사회적 영향에도 대비해야 합니다. 인공지능으로 인한 일자리 변화, 윤리적 문제 등에 선제적으로 대응하는 정책과 제도를 마련해야 합니다. 인공지능 기술이 국가 발전과 국민 행복에 기여할  있도록 사회 전반의 인프라를 구축해야 합니다.

LangSmith로 확인해 보면 아래와 같이 여러 단계를 거쳐서 generation/reflection이 수행되고 있음을 알 수 있습니다.

image