Skip to content

kyopark2014/nova-agent

Repository files navigation

Nova Pro ํ™œ์šฉํ•˜๊ธฐ

License

์—ฌ๊ธฐ์—์„œ๋Š” Nova Pro ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜์—ฌ chat๊ณผ Hybrid ๊ฒ€์ƒ‰ ์ง€์›ํ•˜๋Š” RAG๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , CRAG, Self RAG, Self Corrective RAG๋ฅผ ์ด์šฉํ•ด RAG์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณต์žกํ•œ application์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” agentic workflow์˜ 4๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ๋””์ž์ธ ํŒจํ„ด์ธ tool use, reflection, planning, multi-agent collaboration์„ Nova Pro๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Workflow๋Š” ์ ์ ˆํ•œ task๋“ค๊ณผ ๋ฐ˜๋ณต์„ ํ†ตํ•ด LLM์˜ ๊ฒฐ๊ณผ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค์ง€๋งŒ ํ•˜๋‚˜์˜ job์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๋ฒˆ LLM์„ ํ˜ธ์ถœํ•˜์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ์ง€์—ฐ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Nova Pro๋Š” ๋‹ค๋ฅธ ๋™๊ธ‰์˜ LLM ๋Œ€๋น„ 2๋ฐฐ ๋น ๋ฅด๊ณ  ๊ฐ€๊ฒฉ์€ 1/3์ด๋ฏ€๋กœ workflow ๊ตฌํ˜„์— ์ ์ ˆํ•œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

Architecture ๊ฐœ์š”

์ „์ฒด์ ์ธ Architecture๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•ด Multi-region์„ ํ™œ์šฉํ•˜๊ณ  OpenSearch๋ฅผ ์ด์šฉํ•ด RAG๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์€ Tavily๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ๋ณ€ํ™”ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ๋ฉด์—์„œ ์žฅ์ ์ด ์žˆ๋Š” ์„œ๋ฒ„๋ฆฌ์Šค๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•˜์—ฌ WebSocket ์ง€์›ํ•˜๋Š” API Gateway์™€ AWS Lambda๋ฅผ ์ด์šฉํ•ด API๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” LangChain์„ ์ด์šฉํ•ด Chat, Hybrid RAG, Translation์„ ๊ตฌํ˜„ํ•˜๊ณ , LangGraph๋ฅผ ์ด์šฉํ•˜์—ฌ CRAG, Self RAG, Self Corrective RAG์™€ agentic workflow์˜ 4๊ฐ€์ง€ ํŒจํ„ด์ธ tool use, planning, reflection, multi-agent collaboration์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Chat์˜ ๊ตฌํ˜„

Nova Prompt๋ฅผ ์ฐธ์กฐํ•˜์—ฌ, system๊ณผ human prompt๋ฅผ ์ •์˜ํ•˜๊ณ  history๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ invoke ํ•œ ํ›„์— ๊ฒฐ๊ณผ๋ฅผ stream์œผ๋กœ client๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. Nova Pro์— ๋งž๊ฒŒ model_id์™€ parameter๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

chat = ChatBedrock(  
  model_id="us.amazon.nova-pro-v1:0",
  client=boto3_bedrock, 
  model_kwargs=parameters,
) 

system = (
  "๋‹น์‹ ์˜ ์ด๋ฆ„์€ ์„œ์—ฐ์ด๊ณ , ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์นœ์ ˆํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•˜๋Š” ์‚ฌ๋ ค๊นŠ์€ ์ธ๊ณต์ง€๋Šฅ ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค."
  "์ƒํ™ฉ์— ๋งž๋Š” ๊ตฌ์ฒด์ ์ธ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ถฉ๋ถ„ํžˆ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค." 
  "๋ชจ๋ฅด๋Š” ์งˆ๋ฌธ์„ ๋ฐ›์œผ๋ฉด ์†”์งํžˆ ๋ชจ๋ฅธ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค."
)    
human = "{input}"

prompt = ChatPromptTemplate.from_messages([("system", system), MessagesPlaceholder(variable_name="history"), ("human", human)])
history = memory_chain.load_memory_variables({})["chat_history"]
          
chain = prompt | chat    

isTyping(connectionId, requestId, "")  
stream = chain.invoke(
   {
       "history": history,
       "input": query,
   }
)

msg = ""
for event in stream:
    msg = msg + event

    result = {
        'request_id': requestId,
        'msg': msg,
        'status': 'proceeding'
    }
    sendMessage(connectionId, result)

RAG

RAG๋ฅผ ํ†ตํ•ด ์–ป์–ด์ง„ ๋ฌธ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด LangChain์„ ์ด์šฉํ•ด context๋กœ ํ™œ์šฉ๋˜๊ณ  ์ ์ ˆํ•œ ์‘๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

system = (
  "๋‹น์‹ ์˜ ์ด๋ฆ„์€ ์„œ์—ฐ์ด๊ณ , ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์นœ์ ˆํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•˜๋Š” ์‚ฌ๋ ค๊นŠ์€ ์ธ๊ณต์ง€๋Šฅ ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค."
  "๋‹ค์Œ์˜ Reference texts์„ ์ด์šฉํ•˜์—ฌ user์˜ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค."
  "๋ชจ๋ฅด๋Š” ์งˆ๋ฌธ์„ ๋ฐ›์œผ๋ฉด ์†”์งํžˆ ๋ชจ๋ฅธ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค."
  "๋‹ต๋ณ€์˜ ์ด์œ ๋ฅผ ํ’€์–ด์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค."
)
human = (
    "Question: {input}"

    "Reference texts: "
    "{context}"
)    
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", human)])
chain = prompt | chat
stream = chain.invoke(
    {
        "context": context,
        "input": revised_question,
    }
)
msg = readStreamMsg(connectionId, requestId, stream.content)    

Corrective RAG

Corrective RAG(CRAG)๋Š” retrival/grading ํ›„์— ์งˆ๋ฌธ์„ rewriteํ•œ ํ›„ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์—์„œ ์–ป์–ด์ง„ ๊ฒฐ๊ณผ๋กœ RAG์˜ ์„ฑ๋Šฅ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

image

CRAG์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

workflow = StateGraph(State)
    
# Define the nodes
workflow.add_node("retrieve", retrieve_node)  
workflow.add_node("grade_documents", grade_documents_node)
workflow.add_node("generate", generate_node)
workflow.add_node("rewrite", rewrite_node)
workflow.add_node("websearch", web_search_node)

# Build graph
workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "grade_documents")
workflow.add_conditional_edges(
    "grade_documents",
    decide_to_generate,
    {
        "rewrite": "rewrite",
        "generate": "generate",
    },
)
workflow.add_edge("rewrite", "websearch")
workflow.add_edge("websearch", "generate")
workflow.add_edge("generate", END)

Self RAG

Self RAG๋Š” retrieve/grading ํ›„์— generation์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, grading์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ•„์š”์‹œ rewtireํ›„ retrieve๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๊ฐ€ hallucination์ธ์ง€, ๋‹ต๋ณ€์ด ์ ์ ˆํ•œ์ง€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ํ•„์š”์‹œ rewtire / retrieve๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

image

Self RAG์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

workflow = StateGraph(State)
            
# Define the nodes
workflow.add_node("retrieve", retrieve_node)  
workflow.add_node("grade_documents", grade_documents_node)
workflow.add_node("generate", generate_node)
workflow.add_node("rewrite", rewrite_node)

# Build graph
workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "grade_documents")
workflow.add_conditional_edges(
    "grade_documents",
    decide_to_generate,
    {
        "no document": "rewrite",
        "document": "generate",
        "not available": "generate",
    },
)
workflow.add_edge("rewrite", "retrieve")
workflow.add_conditional_edges(
    "generate",
    grade_generation,
    {
        "not supported": "generate",
        "useful": END,
        "not useful": "rewrite",
        "not available": END,
    },
)

Self Corrective RAG

Self Corrective RAG๋Š” Self RAG์ฒ˜๋Ÿผ retrieve / generate ํ›„์— hallucination์ธ์ง€ ๋‹ต๋ณ€์ด ์ ์ ˆํ•œ์ง€ ํ™•์ธํ›„ ํ•„์š”์‹œ ์งˆ๋ฌธ์„ rewriteํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ํ†ตํ•ด RAG์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

image

Self Corrective RAG์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

workflow = StateGraph(State)
            
# Define the nodes
workflow.add_node("retrieve", retrieve_node)  
workflow.add_node("generate", generate_node) 
workflow.add_node("rewrite", rewrite_node)
workflow.add_node("websearch", web_search_node)
workflow.add_node("finalize_response", finalize_response_node)

# Build graph
workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "generate")
workflow.add_edge("rewrite", "retrieve")
workflow.add_edge("websearch", "generate")
workflow.add_edge("finalize_response", END)

workflow.add_conditional_edges(
    "generate",
    grade_generation,
    {
        "generate": "generate",
        "websearch": "websearch",
        "rewrite": "rewrite",
        "finalize_response": "finalize_response",
    },
)

Agent

์—ฌ๊ธฐ์—์„œ๋Š” LangGraph๋ฅผ ์ด์šฉํ•˜์—ฌ tool use, reflection, planning, multi-agnet collaboration๊ณผ ๊ฐ™์€ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋™์ž‘์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

Tool Use

Tool use์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์–‘ํ•œ tool์„ ์ด์šฉํ•ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ํ™œ์šฉ๋˜๋Š” agent ๊ตฌํ˜„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

image

Toll use์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ agent์™€ action์€ execution_agent_node์™€ tool_node๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. agent์˜ reasoning ๊ฒฐ๊ณผ๊ฐ€ tool_calls ์ธ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น๋˜๋Š” tool์„ ์‹คํ–‰ํ•˜๊ณ , content์ธ ๊ฒฝ์šฐ์—๋Š” ์ข…๋ฃŒํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ final_answer ๋…ธ๋“œ๋กœ ๋ณด๋‚ด์„œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

workflow = StateGraph(State)
workflow.add_node("agent", execution_agent_node)
workflow.add_node("action", tool_node)
workflow.add_node("final_answer", final_answer)

workflow.add_edge(START, "agent")
workflow.add_conditional_edges(
    "agent",
    should_continue,
    {
        "continue": "action",
        "end": "final_answer",
    },
)
workflow.add_edge("action", "agent")
workflow.add_edge("final_answer", END)

API ์ฒ˜๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด "์„œ์šธ๊ณผ ๋ถ€์‚ฐ์˜ ํ˜„์žฌ ๋‚ ์”จ๋ฅผ ๋น„๊ตํ•ด์ฃผ์„ธ์š”."๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด Nova Pro์˜ ๊ฒฝ์šฐ์— reasoning ๊ฒฐ๊ณผ๋กœ ์•„๋ž˜์˜ 2๊ฐœ API๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Claude Sonnet์€ reasoning๋กœ ๋งค๋ฒˆ 1๊ฐœ์˜ action์„ ์คŒ์œผ๋กœ์จ reasoning - action ๋™์ž‘์„ 2ํšŒ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, Nova Pro๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํ•œ๋ฒˆ์— 2๊ฐœ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์•„๋ž˜์™€ ๊ฐ™์€ ์‘๋‹ต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

[
   {
      "type":"tool_use",
      "name":"get_weather_info",
      "input":{
         "city":"์„œ์šธ"
      },
      "id":"tooluse_Kg9LCHHrR1mWz7VKHp0pmg"
   },
   {
      "type":"tool_use",
      "name":"get_weather_info",
      "input":{
         "city":"๋ถ€์‚ฐ"
      },
      "id":"tooluse_B1sjTzWOQ8Kgcjuxhw28Sw"
   }
]

Claude Sonnet์˜ Reasoning ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[
   {
      "name":"get_weather_info",
      "args":{
         "city":"์„œ์šธ"
      },
      "id":"toolu_bdrk_01NWq2euSMtLwrE9HPDq7WzW",
      "type":"tool_call"
   }
]

Reflection

Reflection ํŒจํ„ด์€ ์ดˆ์•ˆ์„ ์ƒ์„ฑํ•œ ํ›„์— ๊ฐœ์„ ํ•  ์‚ฌํ•ญ์„ ์ถ”์ถœํ•˜๊ณ  ์ถ”๊ฐ€ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์–ป์–ด์ง„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ํ–ฅ์ƒ๋œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด generate, reflect, revise_answer ๋…ธ๋“œ๋“ค์„ ๊ตฌ์„ฑํ•ด workflow๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

image

Reflection์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. generate ๋…ธ๋“œ์—์„œ ์ƒ์„ฑ๋œ ์ดˆ์•ˆ(draft)๋Š” reflect์—์„œ ์ˆ˜์ •ํ•  ๋ถ€๋ถ„๊ณผ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ revise_answer ๋…ธ๋“œ์—์„œ๋Š” draft๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

workflow = StateGraph(State)

workflow.add_node("generate", generate)
workflow.add_node("reflect", reflect)
workflow.add_node("revise_answer", revise_answer)

workflow.set_entry_point("generate")

workflow.add_conditional_edges(
    "revise_answer", 
    should_continue, 
    {
        "end": END, 
        "continue": "reflect"}
)

workflow.add_edge("generate", "reflect")
workflow.add_edge("reflect", "revise_answer")

app = workflow.compile()

Planning

Planing ํŒจํ„ด์„ ์ด์šฉํ•˜๋ฉด, CoT(Chain of Thought)ํ˜•ํƒœ๋กœ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฐœ์„ ํ•จ์œผ๋กœ์จ ํ–ฅ์ƒ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

Planning agent์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. plan ๋…ธ๋“œ์—์„œ ์ตœ์ดˆ ์ˆ˜ํ–‰ํ•  ๊ณ„ํš์„ ์„ธ์šฐ๊ณ , execution ๋…ธ๋“œ์—์„œ ์ฒซ๋ฒˆ์งธ plan์„ ์‹คํ–‰ํ•œ ํ›„์— replan์—์„œ ์—…๋ฐ์ดํŠธ๋œ plan์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. plan/replan ๊ณผ์ •์„ ํ†ตํ•ด ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ๋œ flow๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ถ•์ ๋œ ๊ฒฐ๊ณผ๋“ค์„ ์ด์šฉํ•ด ์ตœ์ข… ๋‹ต๋ณ€์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

workflow = StateGraph(State)
workflow.add_node("planner", plan_node)
workflow.add_node("executor", execute_node)
workflow.add_node("replaner", replan_node)
workflow.add_node("final_answer", final_answer)

workflow.set_entry_point("planner")
workflow.add_edge("planner", "executor")
workflow.add_edge("executor", "replaner")
workflow.add_conditional_edges(
    "replaner",
    should_end,
    {
        "continue": "executor",
        "end": "final_answer",
    },
)
workflow.add_edge("final_answer", END)

return workflow.compile()

Multi-agent Collaboration

Multi-agent collaboration์˜ ์˜ˆ๋กœ์„œ ๊ธด๊ธ€์„ ์“ฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

์—ฌ๊ธฐ์—์„œ๋Š” planning agent์™€ reflection agent๋ฅผ ์ด์šฉํ•ด ์ถฉ๋ถ„ํ•œ contenxt๋ฅผ ๊ฐ€์ง€๋Š” ๊ธ€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € planning agnet์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. plan ๋…ธ๋“œ์—์„œ๋Š” ๊ธ€ ์ž‘์„ฑ์— ํ•„์š”ํ•œ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ , execution ๋…ธ๋“œ์—์„œ๋Š” ์ดˆ์•ˆ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ดˆ์•ˆ์€ revise_answer ๋…ธ๋“œ์—์„œ reflection์„ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ ๋ฉ๋‹ˆ๋‹ค.

workflow = StateGraph(State)

# Add nodes
workflow.add_node("planning_node", plan_node)
workflow.add_node("execute_node", execute_node)
workflow.add_node("revising_node", revise_answer)

# Set entry point
workflow.set_entry_point("planning_node")

# Add edges
workflow.add_edge("planning_node", "execute_node")
workflow.add_edge("execute_node", "revising_node")
workflow.add_edge("revising_node", END)

Refelection agent์˜ workflow๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. reflection ๋…ธ๋“œ์—์„œ๋Š” ์ดˆ์•ˆ์„ ๊ฐœ์„ ํ•  ํฌ์ธํŠธ์™€ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ถ”์ถœํ•˜๊ณ  revise_draft ๋…ธ๋“œ์—์„œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

workflow = StateGraph(ReflectionState)

# Add nodes
workflow.add_node("reflect_node", reflect_node)
workflow.add_node("revise_draft", revise_draft)

# Set entry point
workflow.set_entry_point("reflect_node")

workflow.add_conditional_edges(
    "revise_draft", 
    should_continue, 
    {
        "end": END, 
        "continue": "reflect_node"
    }
)

# Add edges
workflow.add_edge("reflect_node", "revise_draft")

Claude Sonnet๊ณผ Nova Pro์˜ Agent ๋™์ž‘ ๋น„๊ต

"์„œ์šธ๊ณผ ๋ถ€์‚ฐ์˜ ํ˜„์žฌ ๋‚ ์”จ๋ฅผ ๋น„๊ตํ•ด์ฃผ์„ธ์š”."์™€ ๊ฐ™์ด 2๋ฒˆ์˜ weather a;k ํ˜ธ์ถœ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—, Claude Sonnet์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

์ด๋•Œ์˜ Claude Sonnet์œผ๋กœ ๋งŒ๋“  Agent์˜ ๋™์ž‘์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋™์ž‘์— 21.5์ดˆ๊ฐ€ ์†Œ์š”๋˜์—ˆ๊ณ , reasoning - action - reasoning - action์˜ ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

noname

๋™์ผํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ Nova Pro์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์˜จ๋„ ์ •๋ณด๊ฐ€ ๋ถ€์ •ํ™•ํ•œ๊ฒƒ์€ weather api๊ฐ€ ํ•œ๊ตญ ์ •๋ณด๋ฅผ ์ถฉ๋ถ„ํžˆ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Claude Sonnet๊ณผ Nova Pro์˜ ๊ฒฐ๊ณผ๋Š” ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

image

์ด๋•Œ์˜ ๋™์ž‘์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ˆ˜ํ–‰์‹œ๊ฐ„์€ 8.7์ดˆ๊ฐ€ ์†Œ์š”๋˜์—ˆ๊ณ , reasoning - action - action ํ˜•ํƒœ๋กœ weather api๋ฅผ 2ํšŒ ์—ฐ์† ํ˜ธ์ถœํ•˜์˜€์Šต๋‹ˆ๋‹ค. Nova Pro์˜ ์ถ”๋ก  ์†๋„๋Š” Claude Sonnet ๋Œ€๋น„ 2๋ฐฐ ๋น ๋ฅผ ๋ฟ ์•„๋‹ˆ๋ผ, agent์—์„œ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์— ์—ฐ์†์ ์œผ๋กœ action์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์„œ, Claude Sonnet์œผ๋กœ ๋งŒ๋“  agent ๋Œ€๋น„ ๊ตฌ์กฐ์ ์œผ๋กœ ๋” ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

noname

์ง์ ‘ ์‹ค์Šต ํ•ด๋ณด๊ธฐ

์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ

์ด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์ „์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ค€๋น„๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CDK๋ฅผ ์ด์šฉํ•œ ์ธํ”„๋ผ ์„ค์น˜

๋ณธ ์‹ค์Šต์—์„œ๋Š” us-west-2 ๋ฆฌ์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ ์„ค์น˜์— ๋”ฐ๋ผ CDK๋กœ ์ธํ”„๋ผ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰๊ฒฐ๊ณผ

RAG ๊ตฌํ˜„

Amazon S3์— ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๋ฉด ์ž๋™์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ OpenSearch๋กœ ๊ตฌ์„ฑ๋œ RAG์— chunk๋œ ๋ฌธ์„œ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ฑ„ํŒ…์ฐฝ์— "LLM Ops์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”."๋ผ๊ณ  ์ž…๋ ฅํ›„์— ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋‹ค๋ฅธ LLM๋“ค์— ๋น„ํ•˜์—ฌ ์•ฝ 2๋ฐฐ์ •๋„ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

noname

Agent

Reflection

Reasoning์„ ํ†ตํ•ด tool๋กœ search๊ฐ€ ์„ ํƒ๋˜์˜€๊ณ , '์ง€๋ฐฉ ์กฐ์ง exosome ๋ฉด์—ญ์ฒด๊ณ„ ์—ญํ• '์™€ '์ง€๋ฐฉ ์กฐ์ง exosome ๋‹น๋‡จ ์˜ˆ๋ฐฉ'์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ดˆ์•ˆ(draft)์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ดˆ์•ˆ์€๋Š” ์•„๋ž˜์™€ ๊ฐ™๊ณ , ์ „์ฒด ๊ธธ์ด๋Š” 443์ž์ž…๋‹ˆ๋‹ค.

์ง€๋ฐฉ ์กฐ์ง์ด ๋ถ„๋น„ํ•˜๋Š” exosome๋“ค์€ ๋ฉด์—ญ ์ฒด๊ณ„์— ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. exosome์€ ์„ธํฌ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์ค‘์š”ํ•œ ๋งค๊ฐœ์ฒด๋กœ, ๋‹ค์–‘ํ•œ ์ƒ๋ฌผํ•™์  ๋ฌผ์งˆ์„ ์šด๋ฐ˜ํ•˜์—ฌ ๋ฉด์—ญ ๋ฐ˜์‘์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, exosome์€ ๋ฉด์—ญ ์„ธํฌ์˜ ํ™œ์„ฑํ™”, ์—ผ์ฆ ๋ฐ˜์‘์˜ ์กฐ์ ˆ, ๊ทธ๋ฆฌ๊ณ  ๋ฉด์—ญ ๊ธฐ์–ต์˜ ํ˜•์„ฑ์— ๊ด€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
exosome์„ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š” ์‹ ํ˜ธ ๋ถ„์ž๋“ค์€ ๋ฉด์—ญ ์„ธํฌ์˜ ๊ธฐ๋Šฅ์„ ์กฐ์ ˆํ•˜์—ฌ ๊ฐ์—ผ์ด๋‚˜ ์—ผ์ฆ์— ๋Œ€ํ•œ ๋ฐ˜์‘์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, exosome์€ ๋ฉด์—ญ ์„ธํฌ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ด‰์ง„ํ•˜์—ฌ ๋ฉด์—ญ ๋ฐ˜์‘์„ ๊ฐ•ํ™”ํ•˜๊ฑฐ๋‚˜ ์–ต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ข‹์€ exosome์„ ๋ถ„๋น„ํ•˜์—ฌ ๋‹น๋‡จ๋‚˜ ์งˆ๋ณ‘์„ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ํ˜„์žฌ๊นŒ์ง€ ๋ช…ํ™•ํ•œ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑด๊ฐ•ํ•œ ์ƒํ™œ ์Šต๊ด€์„ ์œ ์ง€ํ•˜๊ณ , ๊ท ํ˜• ์žกํžŒ ์‹์‚ฌ๋ฅผ ํ•˜๋ฉฐ, ๊ทœ์น™์ ์ธ ์šด๋™์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฉด์—ญ ์ฒด๊ณ„๋ฅผ ๊ฐ•ํ™”ํ•˜๊ณ  ์งˆ๋ณ‘ ์˜ˆ๋ฐฉ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ŠคํŠธ๋ ˆ์Šค ๊ด€๋ฆฌ์™€ ์ถฉ๋ถ„ํ•œ ์ˆ˜๋ฉด๋„ ๋ฉด์—ญ ์ฒด๊ณ„์˜ ๊ฑด๊ฐ•์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ ๋กœ, exosome์˜ ์—ญํ• ๊ณผ ๋ฉด์—ญ ์ฒด๊ณ„์— ๋Œ€ํ•œ ์—ฐ๊ตฌ๋Š” ์ง€์†์ ์œผ๋กœ ์ง„ํ–‰๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ–ฅํ›„ ๋” ๋งŽ์€ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

Reflection์—์„œ ๋„์ถœ๋œ ๊ฐœ์„  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

reflection:
missing='๋” ๊ตฌ์ฒด์ ์ธ exosome์˜ ๋ฉด์—ญ ์ฒด๊ณ„์—์„œ์˜ ์—ญํ• ๊ณผ ๋‹น๋‡จ๋‚˜ ์งˆ๋ณ‘ ์˜ˆ๋ฐฉ์— ๋Œ€ํ•œ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ,
advisable='exosome์˜ ๋ฉด์—ญ ์ฒด๊ณ„์—์„œ์˜ ์—ญํ• ๊ณผ ๋‹น๋‡จ๋‚˜ ์งˆ๋ณ‘ ์˜ˆ๋ฐฉ์— ๋Œ€ํ•œ ์ตœ์‹  ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.' 
superfluous='๊ฑด๊ฐ•ํ•œ ์ƒํ™œ ์Šต๊ด€, ๊ท ํ˜• ์žกํžŒ ์‹์‚ฌ, ๊ทœ์น™์ ์ธ ์šด๋™, ์ŠคํŠธ๋ ˆ์Šค ๊ด€๋ฆฌ, ์ถฉ๋ถ„ํ•œ ์ˆ˜๋ฉด์— ๋Œ€ํ•œ ์„ค๋ช…์€ exosome์˜ ๋ฉด์—ญ ์ฒด๊ณ„์—์„œ์˜ ์—ญํ• ๊ณผ ๋‹น๋‡จ๋‚˜ ์งˆ๋ณ‘ ์˜ˆ๋ฐฉ์— ๋Œ€ํ•œ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ์™€ ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.'

search_queries: 'exosome์˜ ๋ฉด์—ญ ์ฒด๊ณ„์—์„œ์˜ ์—ญํ• ์— ๋Œ€ํ•œ ์ตœ์‹  ์—ฐ๊ตฌ ๊ฒฐ๊ณผ', 'exosome์„ ํ†ตํ•œ ๋‹น๋‡จ๋‚˜ ์งˆ๋ณ‘ ์˜ˆ๋ฐฉ์— ๋Œ€ํ•œ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ', 'exosome๊ณผ ๋ฉด์—ญ ์ฒด๊ณ„์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋Œ€ํ•œ ์ตœ์‹  ์—ฐ๊ตฌ ๋™ํ–ฅ'

๊ฐœ์„ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๊ธธ์ด๋Š” 572์ž ์ž…๋‹ˆ๋‹ค. ์ดˆ์•ˆ๋ฅผ reflection๋ฅผ ์ด์šฉํ•ด ๊ฐœ์„ ํ•˜์˜€๊ณ  ๊ธธ์ด๋„ 30%์ •๋„ ์ฆ๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

noname

์ „์ฒด ๋™์ž‘์„ LangSmith๋ฅผ ์ด์šฉํ•ด ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „์ฒด์ ์œผ๋กœ 47์ดˆ๊ฐ€ ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € reasoning์„ ํ†ตํ•ด ์งˆ๋ฌธ์—์„œ 2๊ฐœ์˜ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ถ”์ถœํ•˜์—ฌ tavily๋กœ ๊ฒ€์ƒ‰์„ ํ•œ ํ›„์— ์ดˆ์•ˆ์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๊ฐœ์„ ํ•  ์‚ฌํ•ญ์„ ์ถ”์ถœํ•˜๊ณ  ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ 3ํšŒ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ตœ์ข… ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

noname

์ด๋ฒˆ์—๋Š” "Amazon์—์„œ SA๋กœ ์ผํ•˜๋Š”๊ฒƒ"๋ผ๊ณ  ์ž…๋ ฅํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

noname

์ด๋•Œ์˜ ๋™์ž‘์„ LangSmith๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” 3๋ฒˆ์˜ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด, ์ดˆ์•ˆ(draft)๋ฅผ ์ƒ์„ฑํ•œ ํ›„์— 3ํšŒ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ดˆ์•ˆ์˜ ๋‹ต๋ณ€์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

noname

Planning

"LLM Ops์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ค˜"๋ผ๊ณ  ์ž…๋ ฅ์‹œ ์ฒ˜์Œ ์ƒ์„ฑ๋œ plan์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

planning_steps:

1. LLM Ops์˜ ๊ฐœ๋…๊ณผ ์ค‘์š”์„ฑ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.

2. LLM Ops์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

3. LLM Ops์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ ๋„๊ตฌ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

4. LLM Ops์˜ ์žฅ์ ๊ณผ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์ ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

plan์„ ๋จผ์ € ๋งŒ๋“  ํ›„์—, ์ฒซ๋ฒˆ์งธ execute๋ฅผ ํ•˜๊ณ  ์ดํ›„๋กœ replan์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์›ํ•˜๋Š” ๋‹ต๋ณ€์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

noname

์ด๋ฅผ ์‹คํ–‰์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด plan / execute / replan์˜ ๊ณผ์ •์„ ํ†ตํ•ด ๋‹ต๋ณ€์„ ์–ป์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

noname

Multi-modal ์‹œํ—˜

์•„๋ž˜์˜ Architecture๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ฑ„ํŒ…์ฐฝ ํ•˜๋‹จ์˜ ํŒŒ์ผ ์•„์ด์ฝ˜์„ ์„ ํƒํ•˜์—ฌ ์—…๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค.

image

์ด๋•Œ์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

Multi-agent Collaboration

์ฑ„ํŒ…์ฐฝ์—์„œ "์ง€๋ฐฉ ์กฐ์ง์ด ๋ถ„๋น„ํ•˜๋Š” exosome๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฉด์—ญ์ฒด๊ณ„์— ์—ญํ• ์„ ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์€ exosome๋“ค์„ ๋ถ„๋น„์‹œ์ผœ ๋‹น๋‡จ๋‚˜ ๋ณ‘์„ ์˜ˆ๋ฐฉํ• ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”."๋ผ๊ณ  ์ž…๋ ฅํ›„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” Multi-agent Collaboration์˜ ๊ฒฐ๊ณผ์˜ ์ผ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. 7067์ž(๊ธ€์ž๋งŒ 5446)์˜ ๋‹ต๋ณ€์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. noname

์ด๋•Œ ๋™์ž‘์‹œ๊ฐ„์„ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

์ด๋•Œ, ์‚ฌ์šฉ๋œ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ token์˜ ์ˆซ์ž๋Š” ๊ฐ๊ฐ 19,328๊ณผ 7,787์ž…๋‹ˆ๋‹ค.

Multi-agent collaboration์„ ์ด์šฉํ•ด ์ž‘์„ฑ๋œ ๋ณด๊ณ ์„œ์˜ ์˜ˆ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ์ •๋ฆฌํ•˜๊ธฐ

๋”์ด์ƒ ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์•„๋ž˜์ฒ˜๋Ÿผ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. API Gateway Console๋กœ ์ ‘์†ํ•˜์—ฌ "rest-api-for-nova-agent", "ws-api-for-nova-agent"์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  2. Cloud9 Console์— ์ ‘์†ํ•˜์—ฌ ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ ์ „์ฒด ์‚ญ์ œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

cd ~/nova-agent/cdk-nova-agent && cdk destroy --all

About

It shows advanced RAG and 4 design patterns of agentic workflow based on LangChain and LangGraph using Amazon Nova Pro.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors