[랭체인] LangGraph를 활용한 AI 에세이 작성 시스템 구축하기steemCreated with Sketch.

in #kr-dev2 years ago

안녕하세요, 여러분! 오늘은 LangGraph를 사용하여 AI 기반 에세이 작성 시스템을 어떻게 구축하는지 살펴보겠습니다. 이 시스템은 에세이 주제를 입력받아 계획을 세우고, 초안을 작성하며, 자체 평가와 수정을 거쳐 최종 에세이를 완성하는 과정을 자동화합니다.

1. 시스템 구조 개요

우리의 AI 에세이 작성 시스템은 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  1. 계획 수립 (Planner)
  2. 연구 수행 (Research)
  3. 초안 작성 (Generation)
  4. 자체 평가 (Reflection)
  5. 수정 및 개선 (Revision)

이 구성 요소들은 LangGraph의 StateGraph를 사용하여 연결되어 있으며, 각 단계는 OpenAI의 GPT 모델을 활용하여 처리됩니다.

2. 시스템 구현 단계

2.1. 필요한 라이브러리 및 모듈 임포트

먼저, 필요한 라이브러리와 모듈을 임포트합니다:

from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated, List
import operator
from langgraph.checkpoint.sqlite import SqliteSaver
from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage, AIMessage, ChatMessage
from langchain_openai import ChatOpenAI
from langchain_core.pydantic_v1 import BaseModel
from tavily import TavilyClient

2.2. 상태 정의

에세이 작성 과정의 상태를 정의합니다:

class AgentState(TypedDict):
    task: str
    plan: str
    draft: str
    critique: str
    content: List[str]
    revision_number: int
    max_revisions: int

2.3. 프롬프트 설정

각 단계에 대한 프롬프트를 정의합니다:

PLAN_PROMPT = """You are an expert writer tasked with writing a high level outline of an essay. 
Write such an outline for the user provided topic. Give an outline of the essay along with any relevant notes 
or instructions for the sections."""

WRITER_PROMPT = """You are an essay assistant tasked with writing excellent 5-paragraph essays.
Generate the best essay possible for the user's request and the initial outline. 
If the user provides critique, respond with a revised version of your previous attempts. 
Utilize all the information below as needed: 

------

{content}"""

REFLECTION_PROMPT = """You are a teacher grading an essay submission. 
Generate critique and recommendations for the user's submission. 
Provide detailed recommendations, including requests for length, depth, style, etc."""

RESEARCH_PLAN_PROMPT = """You are a researcher charged with providing information that can 
be used when writing the following essay. Generate a list of search queries that will gather 
any relevant information. Only generate 3 queries max."""

RESEARCH_CRITIQUE_PROMPT = """You are a researcher charged with providing information that can 
be used when making any requested revisions (as outlined below). 
Generate a list of search queries that will gather any relevant information. Only generate 3 queries max."""

2.4. 노드 함수 정의

각 단계를 처리할 노드 함수를 정의합니다:

def plan_node(state: AgentState):
    # 계획 수립 로직
    messages = [
        SystemMessage(content=PLAN_PROMPT), 
        HumanMessage(content=state['task'])
    ]
    response = model.invoke(messages)
    return {"plan": response.content}

def research_plan_node(state: AgentState):
    # 연구 계획 수립 및 실행 로직
    queries = model.with_structured_output(Queries).invoke([
        SystemMessage(content=RESEARCH_PLAN_PROMPT),
        HumanMessage(content=state['task'])
    ])
    content = state['content'] or []
    for q in queries.queries:
        response = tavily.search(query=q, max_results=2)
        for r in response['results']:
            content.append(r['content'])
    return {"content": content}
    

def generation_node(state: AgentState):
    # 에세이 초안 작성 로직
    content = "\n\n".join(state['content'] or [])
    user_message = HumanMessage(
        content=f"{state['task']}\n\nHere is my plan:\n\n{state['plan']}")
    messages = [
        SystemMessage(
            content=WRITER_PROMPT.format(content=content)
        ),
        user_message
        ]
    response = model.invoke(messages)
    return {
        "draft": response.content, 
        "revision_number": state.get("revision_number", 1) + 1
    }

def reflection_node(state: AgentState):
    # 자체 평가 로직
    messages = [
        SystemMessage(content=REFLECTION_PROMPT), 
        HumanMessage(content=state['draft'])
    ]
    response = model.invoke(messages)
    return {"critique": response.content}

def research_critique_node(state: AgentState):
    # 평가 기반 추가 연구 로직
    queries = model.with_structured_output(Queries).invoke([
        SystemMessage(content=RESEARCH_CRITIQUE_PROMPT),
        HumanMessage(content=state['critique'])
    ])
    content = state['content'] or []
    for q in queries.queries:
        response = tavily.search(query=q, max_results=2)
        for r in response['results']:
            content.append(r['content'])
    return {"content": content}

def should_continue(state):
    # 추가 수정 여부 결정 로직
    if state["revision_number"] > state["max_revisions"]:
        return END
    return "reflect"

2.5. 그래프 구성

LangGraph의 StateGraph를 사용하여 워크플로우를 구성합니다:

builder = StateGraph(AgentState)

builder.add_node("planner", plan_node)
builder.add_node("generate", generation_node)
builder.add_node("reflect", reflection_node)
builder.add_node("research_plan", research_plan_node)
builder.add_node("research_critique", research_critique_node)

builder.set_entry_point("planner")

builder.add_conditional_edges(
    "generate", 
    should_continue, 
    {END: END, "reflect": "reflect"}
)

builder.add_edge("planner", "research_plan")
builder.add_edge("research_plan", "generate")
builder.add_edge("reflect", "research_critique")
builder.add_edge("research_critique", "generate")

graph = builder.compile()

3. 시스템 사용

구축된 시스템을 사용하여 에세이를 작성하는 방법은 다음과 같습니다:

thread = {"configurable": {"thread_id": "1"}}
for s in graph.stream({
    'task': "what is the difference between langchain and langsmith",
    "max_revisions": 2,
    "revision_number": 1,
}, thread):
    print(s)

이 코드는 "langchain과 langsmith의 차이점"에 대한 에세이를 작성하고, 최대 2번의 수정을 거치도록 설정합니다.

4. 사용자 인터페이스

마지막으로, 이 시스템을 위한 간단한 GUI를 제공하여 사용자가 쉽게 에세이 주제를 입력하고 결과를 확인할 수 있도록 합니다:

from helper import ewriter, writer_gui

MultiAgent = ewriter()
app = writer_gui(MultiAgent.graph)
app.launch()

결론

이렇게 LangGraph를 활용하여 AI 기반 에세이 작성 시스템을 구축해 보았습니다. 이 시스템은 계획 수립, 연구, 초안 작성, 자체 평가, 수정의 과정을 자동화하여 높은 품질의 에세이를 생성할 수 있습니다. 물론 이 시스템은 계속해서 개선될 수 있으며, 더 많은 기능을 추가하거나 성능을 향상시킬 수 있습니다.

AI와 자연어 처리 기술의 발전으로, 이러한 시스템은 교육, 콘텐츠 생성, 연구 등 다양한 분야에서 활용될 수 있을 것입니다. 여러분도 이 예제를 바탕으로 자신만의 AI 작문 시스템을 만들어보는 것은 어떨까요?

행운을 빕니다!

#LangChain

Posted using Obsidian Steemit plugin

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.098
BTC 63162.59
ETH 1821.63
USDT 1.00
SBD 0.38