์ฌ๊ธฐ์์๋ 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๋ ์๋์ ๊ฐ์ต๋๋ค. ์๋ ํฅ์์ ์ํด 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์ ๊ตฌํํฉ๋๋ค.
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๋ฅผ ํตํด ์ป์ด์ง ๋ฌธ์๋ ์๋์ ๊ฐ์ด 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(CRAG)๋ retrival/grading ํ์ ์ง๋ฌธ์ rewriteํ ํ ์ธํฐ๋ท ๊ฒ์์์ ์ป์ด์ง ๊ฒฐ๊ณผ๋ก RAG์ ์ฑ๋ฅ์ ๊ฐํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
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๋ retrieve/grading ํ์ generation์ ์ํํ๋๋ฐ, grading์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํ์์ rewtireํ retrieve๋ฅผ ์ํํ๋ฉฐ, ์์ฑ๋ ๊ฒฐ๊ณผ๊ฐ hallucination์ธ์ง, ๋ต๋ณ์ด ์ ์ ํ์ง๋ฅผ ํ๋จํ์ฌ ํ์์ rewtire / retrieve๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
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 RAG์ฒ๋ผ retrieve / generate ํ์ hallucination์ธ์ง ๋ต๋ณ์ด ์ ์ ํ์ง ํ์ธํ ํ์์ ์ง๋ฌธ์ rewriteํ๊ฑฐ๋ ์ธํฐ๋ท ๊ฒ์์ ํตํด RAG์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋๋ค.
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",
},
)์ฌ๊ธฐ์์๋ LangGraph๋ฅผ ์ด์ฉํ์ฌ tool use, reflection, planning, multi-agnet collaboration๊ณผ ๊ฐ์ ํจํด์ ๊ตฌํํ๊ณ ๋์์ ๋น๊ตํฉ๋๋ค.
Tool use์ workflow๋ ์๋์ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๋ค์ํ tool์ ์ด์ฉํด ์์ฐ์ค๋ฌ์ด ๋ํ๋ฅผ ์ํํ ์ ์์ด์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ํ์ฉ๋๋ agent ๊ตฌํ ํจํด์ ๋๋ค.
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 ํจํด์ ์ด์์ ์์ฑํ ํ์ ๊ฐ์ ํ ์ฌํญ์ ์ถ์ถํ๊ณ ์ถ๊ฐ ๊ฒ์์ ํตํด ์ป์ด์ง ์ ๋ณด๋ฅผ ์ด์ฉํด ํฅ์๋ ๋ต๋ณ์ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด generate, reflect, revise_answer ๋ ธ๋๋ค์ ๊ตฌ์ฑํด workflow๋ฅผ ์์ฑํฉ๋๋ค.
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()Planing ํจํด์ ์ด์ฉํ๋ฉด, CoT(Chain of Thought)ํํ๋ก ๋ฐ๋ณต์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ํจ์ผ๋ก์จ ํฅ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
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์ ์๋ก์ ๊ธด๊ธ์ ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ ์ ํฉ๋๋ค. ์ด๋์ workflow๋ ์๋์ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์์๋ 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")"์์ธ๊ณผ ๋ถ์ฐ์ ํ์ฌ ๋ ์จ๋ฅผ ๋น๊ตํด์ฃผ์ธ์."์ ๊ฐ์ด 2๋ฒ์ weather a;k ํธ์ถ์ด ํ์ํ ๊ฒฝ์ฐ์, Claude Sonnet์ ์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ด๋์ Claude Sonnet์ผ๋ก ๋ง๋ Agent์ ๋์์ ์๋์ ๊ฐ์ต๋๋ค. ์ ์ฒด ๋์์ 21.5์ด๊ฐ ์์๋์๊ณ , reasoning - action - reasoning - action์ ํํ๋ก ๋์ํ์์ต๋๋ค.
๋์ผํ ์ง๋ฌธ์ ๋ํ Nova Pro์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์ ์จ๋ ์ ๋ณด๊ฐ ๋ถ์ ํํ๊ฒ์ weather api๊ฐ ํ๊ตญ ์ ๋ณด๋ฅผ ์ถฉ๋ถํ ์ ๊ณตํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค. Claude Sonnet๊ณผ Nova Pro์ ๊ฒฐ๊ณผ๋ ์ ์ฌํฉ๋๋ค.
์ด๋์ ๋์์ ์๋์ ๊ฐ์ต๋๋ค. ์ ์ฒด ์ํ์๊ฐ์ 8.7์ด๊ฐ ์์๋์๊ณ , reasoning - action - action ํํ๋ก weather api๋ฅผ 2ํ ์ฐ์ ํธ์ถํ์์ต๋๋ค. Nova Pro์ ์ถ๋ก ์๋๋ Claude Sonnet ๋๋น 2๋ฐฐ ๋น ๋ฅผ ๋ฟ ์๋๋ผ, agent์์ API๋ฅผ ํธ์ถํ ๋์ ์ฐ์์ ์ผ๋ก action์ ์ํํ ์ ์์ด์, Claude Sonnet์ผ๋ก ๋ง๋ agent ๋๋น ๊ตฌ์กฐ์ ์ผ๋ก ๋ ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ด ์๋ฃจ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฌ์ ์ ์๋์ ๊ฐ์ ์ค๋น๊ฐ ๋์ด์ผ ํฉ๋๋ค.
- AWS Account ์์ฑ์ ๋ฐ๋ผ ๊ณ์ ์ ์ค๋นํฉ๋๋ค.
๋ณธ ์ค์ต์์๋ us-west-2 ๋ฆฌ์ ์ ์ฌ์ฉํฉ๋๋ค. ์ธํ๋ผ ์ค์น์ ๋ฐ๋ผ CDK๋ก ์ธํ๋ผ ์ค์น๋ฅผ ์งํํฉ๋๋ค.
Amazon S3์ ํ์ผ ์ ๋ก๋ํ๋ฉด ์๋์ผ๋ก ํ์ฑํ์ฌ OpenSearch๋ก ๊ตฌ์ฑ๋ RAG์ chunk๋ ๋ฌธ์๊ฐ ์ ์ฅ๋ฉ๋๋ค. ์ฑํ ์ฐฝ์ "LLM Ops์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์."๋ผ๊ณ ์ ๋ ฅํ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ค๋ฅธ LLM๋ค์ ๋นํ์ฌ ์ฝ 2๋ฐฐ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
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%์ ๋ ์ฆ๊ฐํ์์ต๋๋ค.
์ ์ฒด ๋์์ LangSmith๋ฅผ ์ด์ฉํด ํ์ธํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค. ์ ์ฒด์ ์ผ๋ก 47์ด๊ฐ ์์๋์์ต๋๋ค. ๋จผ์ reasoning์ ํตํด ์ง๋ฌธ์์ 2๊ฐ์ ๊ฒ์์ด๋ฅผ ์ถ์ถํ์ฌ tavily๋ก ๊ฒ์์ ํ ํ์ ์ด์์ ์์ฑํ์์ต๋๋ค. ์ดํ ๊ฐ์ ํ ์ฌํญ์ ์ถ์ถํ๊ณ ์ด๋ฅผ ๋ฐ์ํ๊ธฐ ์ํ์ฌ 3ํ ์ถ๊ฐ ๊ฒ์์ ์ํํ์ฌ ์ต์ข ๋ต๋ณ์ ์์ฑํ์์ต๋๋ค.
์ด๋ฒ์๋ "Amazon์์ SA๋ก ์ผํ๋๊ฒ"๋ผ๊ณ ์ ๋ ฅํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
์ด๋์ ๋์์ LangSmith๋ก ํ์ธํฉ๋๋ค. ์ฌ๊ธฐ์์๋ 3๋ฒ์ ๊ฒ์์ ํตํด, ์ด์(draft)๋ฅผ ์์ฑํ ํ์ 3ํ ์ถ๊ฐ ๊ฒ์์ ํตํด ์ด์์ ๋ต๋ณ์ ํฅ์์์ผฐ์ต๋๋ค.
"LLM Ops์ ๋ํด ์ค๋ช ํด์ค"๋ผ๊ณ ์ ๋ ฅ์ ์ฒ์ ์์ฑ๋ plan์ ์๋์ ๊ฐ์ต๋๋ค.
planning_steps:
1. LLM Ops์ ๊ฐ๋
๊ณผ ์ค์์ฑ์ ํ์
ํฉ๋๋ค.
2. LLM Ops์ ์ฃผ์ ๊ตฌ์ฑ ์์์ ๊ธฐ๋ฅ์ ์ค๋ช
ํฉ๋๋ค.
3. LLM Ops์ ๊ตฌํ ๋ฐฉ๋ฒ๊ณผ ๋๊ตฌ์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
4. LLM Ops์ ์ฅ์ ๊ณผ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ์ ๋ถ์ํฉ๋๋ค.
plan์ ๋จผ์ ๋ง๋ ํ์, ์ฒซ๋ฒ์งธ execute๋ฅผ ํ๊ณ ์ดํ๋ก replan์ ๋ฐ๋ณตํ๋ฉด์ ์ํ๋ ๋ต๋ณ์ ์ฐพ์ต๋๋ค.
์ด๋์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ด๋ฅผ ์คํ์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด plan / execute / replan์ ๊ณผ์ ์ ํตํด ๋ต๋ณ์ ์ป์์์ ์ ์ ์์ต๋๋ค.
์๋์ Architecture๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์ฑํ ์ฐฝ ํ๋จ์ ํ์ผ ์์ด์ฝ์ ์ ํํ์ฌ ์ ๋ก๋ ํฉ๋๋ค.
์ด๋์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ฑํ
์ฐฝ์์ "์ง๋ฐฉ ์กฐ์ง์ด ๋ถ๋นํ๋ exosome๋ค์ด ์ด๋ป๊ฒ ๋ฉด์ญ์ฒด๊ณ์ ์ญํ ์ ํ๊ณ ์ด๋ป๊ฒ ํ๋ฉด ์ข์ exosome๋ค์ ๋ถ๋น์์ผ ๋น๋จ๋ ๋ณ์ ์๋ฐฉํ ์ ์๋์ง ์๋ ค์ฃผ์ธ์."๋ผ๊ณ ์
๋ ฅํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค. ์๋๋ Multi-agent Collaboration์ ๊ฒฐ๊ณผ์ ์ผ๋ถ๋ถ์
๋๋ค. 7067์(๊ธ์๋ง 5446)์ ๋ต๋ณ์ด ์์ฑ๋์์ต๋๋ค.

์ด๋ ๋์์๊ฐ์ ํ์ธํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์ด๋, ์ฌ์ฉ๋ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ token์ ์ซ์๋ ๊ฐ๊ฐ 19,328๊ณผ 7,787์ ๋๋ค.
Multi-agent collaboration์ ์ด์ฉํด ์์ฑ๋ ๋ณด๊ณ ์์ ์๋ ์๋์ ๊ฐ์ต๋๋ค.
๋์ด์ ์ธํ๋ผ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์ ์๋์ฒ๋ผ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
-
API Gateway Console๋ก ์ ์ํ์ฌ "rest-api-for-nova-agent", "ws-api-for-nova-agent"์ ์ญ์ ํฉ๋๋ค.
-
Cloud9 Console์ ์ ์ํ์ฌ ์๋์ ๋ช ๋ น์ด๋ก ์ ์ฒด ์ญ์ ๋ฅผ ํฉ๋๋ค.
cd ~/nova-agent/cdk-nova-agent && cdk destroy --all



















