Skip to content

Latest commit

 

History

History
115 lines (73 loc) · 3.35 KB

olympiad-agent.md

File metadata and controls

115 lines (73 loc) · 3.35 KB

Olympiad Agent

LangGraph를 이용해 Olympiad 문제를 푸는 Agent를 생성합니다.

Blog0-lympiad Agent에서는 Reflection, Retrieval, Human-in-the-loop 에 대해 설명합니다.

Part 1: Zero-Shot with Reflection

relection에서는 Solve / Evaluate를 반복해가며 문제를 해결합니다.

image

Graph 생성코드는 아래와 같습니다.

builder = StateGraph(State)
builder.add_node("solver", solver)
builder.set_entry_point("solver")
builder.add_node("evaluate", evaluate)
builder.add_edge("solver", "evaluate")


def control_edge(state: State):
    if state.get("status") == "success":
        return END
    return "solver"


builder.add_conditional_edges("evaluate", control_edge, {END: END, "solver": "solver"})
graph = builder.compile()

이것의 구현된 Graph는 아래와 같습니다.

image

Part 2: Few-shot Retrieval

이때의 Graph는 아래와 같습니다.

builder = StateGraph(State)
builder.add_node("draft", draft_solver)
builder.set_entry_point("draft")
builder.add_node("retrieve", retrieve_examples)
builder.add_node("solve", solver)
builder.add_node("evaluate", evaluate)
# Add connectivity
builder.add_edge("draft", "retrieve")
builder.add_edge("retrieve", "solve")
builder.add_edge("solve", "evaluate")


def control_edge(state: State):
    if state.get("status") == "success":
        return END
    return "solve"


builder.add_conditional_edges("evaluate", control_edge, {END: END, "solve": "solve"})


checkpointer = SqliteSaver.from_conn_string(":memory:")
graph = builder.compile(checkpointer=checkpointer)

생성된 Graph는 아래와 같습니다.

image

Part 3: Human-in-the-loop

builder = StateGraph(State)
prompt = hub.pull("wfh/usaco-draft-solver")
llm = ChatAnthropic(model="claude-3-opus-20240229", max_tokens_to_sample=4000)

draft_solver = Solver(llm, prompt.partial(examples=""))
builder.add_node("draft", draft_solver)
builder.set_entry_point("draft")
builder.add_node("retrieve", retrieve_examples)
solver = Solver(llm, prompt)
builder.add_node("solve", solver)
builder.add_node("evaluate", evaluate)
builder.add_edge("draft", "retrieve")
builder.add_edge("retrieve", "solve")
builder.add_edge("solve", "evaluate")


def control_edge(state: State):
    if state.get("status") == "success":
        return END
    return "solve"


builder.add_conditional_edges("evaluate", control_edge, {END: END, "solve": "solve"})
checkpointer = SqliteSaver.from_conn_string(":memory:")

이때의 Graph는 아래와 같습니다.

image

이대의 결과는 아래와 같습니다.

Reflection: 이전 결과에 대한 비판(critique)를 장려하여 relection을 구현

Retrieval: "episodic memory"를 높은 품질의 few shot 문제를 해결했습니다.

Human-in-the-loop: 인간의 피드백을 이용해 대부분의 답변을 찾아냈습니다.