Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,17 +119,16 @@ $ uv run langgraph dev

#### pre-commit 설정

1. pre-commit 설치 및 초기화:
1. pre-commit 초기화:

```bash
$ uv pip install pre-commit
$ pre-commit install
$ uv run pre-commit install
```

2. 모든 파일에 대해 수동으로 실행:

```bash
$ pre-commit run --all-files
$ uv run pre-commit run --all-files
```

3. 커밋 시 자동 실행:
Expand All @@ -147,4 +146,4 @@ $ git commit -m "your commit message"
### 💡 **NOTE**:

- 형식 및 가이드에 맞춰서 Commit Message, Issue, Pull Request를 작성해주세요. 상세 설명은 [여기(내부 링크)](https://www.notion.so/hon2ycomb/Git-Commit-Message-Convention-1b000c82b1388185aa3cf88a7e57f24c?pvs=4)를 참조하세요 :)
- 본 프로젝트에서 PR 후 merge하는 경우, github action으로 포맷팅 검사를 진행합니다. vscode 및 cursor에서 포맷팅 세팅은 [여기](https://gamchan.notion.site/vscode-9b61026771cb4121bbb80d4d4f289bc2)를 참조하세요 :)
- 본 프로젝트에서 PR 후 merge하는 경우, github action으로 포맷팅 검사를 진행합니다. vscode 및 cursor에서 포맷팅 세팅은 [여기](https://gamchan.notion.site/vscode-9b61026771cb4121bbb80d4d4f289bc2)를 참조하세요 :)
2 changes: 0 additions & 2 deletions agents/focus_group_interview/modules/chains.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
기본적으로 modules.prompt 템플릿과 modules.models 모듈을 사용하여 LangChain 체인을 생성합니다.
"""

from typing import List

# from agents.focus_group_interview.modules.models import get_openai_model
# from agents.focus_group_interview.modules.prompts import (
# get_question_generation_prompt,
Expand Down
15 changes: 8 additions & 7 deletions agents/focus_group_interview/modules/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@
각 노드는 execute 메서드를 구현하여 상태(state)를 입력받아 처리하고, 처리 결과를 새로운 상태 업데이트로 반환합니다.
"""

from agents.base_node import BaseNode
# from agents.base_node import BaseNode

# from agents.focus_group_interview.modules.chains import set_question_generation_chain, set_response_analysis_chain


# class QuestionGenerationNode(BaseNode):
# """
# 인터뷰 주제와 대상 청중에 적합한 질문을 생성하는 노드
#
#
# 이 노드는 LangChain의 질문 생성 체인을 활용하여 포커스 그룹 인터뷰에 적합한 질문을 생성합니다.
# 주어진 인터뷰 주제와 대상 청중에 맞게 질문을 생성하여 Workflow의 다음 단계로 전달합니다.
# """
Expand All @@ -26,10 +27,10 @@
# def execute(self, state) -> dict:
# """
# 주어진 상태(state)에서 필요한 정보를 추출하여 질문을 생성하고 결과를 반환합니다.
#
#
# Args:
# state (dict): Workflow의 현재 상태. interview_topic과 target_audience 정보를 포함함.
#
#
# Returns:
# dict: 새로 생성된 질문들을 포함한 상태 업데이트
# """
Expand All @@ -48,7 +49,7 @@
# class ResponseAnalysisNode(BaseNode):
# """
# 인터뷰 응답을 분석하는 노드
#
#
# 이 노드는 LangChain의 응답 분석 체인을 활용하여 포커스 그룹 인터뷰에서 수집된 응답들을 분석합니다.
# 응답을 분석하여 주요 통찰과 패턴을 추출하고, 이를 Workflow의 다음 단계로 전달합니다.
# """
Expand All @@ -61,10 +62,10 @@
# def execute(self, state) -> dict:
# """
# 주어진 상태(state)에서 인터뷰 응답을 추출하여 분석하고 결과를 반환합니다.
#
#
# Args:
# state (dict): Workflow의 현재 상태. responses, interview_topic, target_audience 정보를 포함함.
#
#
# Returns:
# dict: 분석된 결과를 포함한 상태 업데이트
# """
Expand Down
10 changes: 5 additions & 5 deletions agents/focus_group_interview/modules/prompts.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
각 함수는 특정 작업에 맞는 프롬프트 템플릿을 생성합니다.
"""

from langchain_core.prompts import PromptTemplate
# from langchain_core.prompts import PromptTemplate

# def get_question_generation_prompt() -> PromptTemplate:
# """
Expand All @@ -19,20 +19,20 @@
# template = """
# 당신은 교육 분야의 포커스 그룹 인터뷰 전문가입니다.
# 아래 주제와 대상 청중에 맞는 효과적인 포커스 그룹 인터뷰 질문 목록을 생성해주세요.

# # 인터뷰 주제
# {interview_topic}

# # 대상 청중
# {target_audience}

# # 지침
# - 개방형 질문을 사용하여 참가자들이 자유롭게 의견을 표현할 수 있도록 합니다.
# - 교육적 맥락에 맞는 질문을 구성합니다.
# - 최소 5개, 최대 10개의 질문을 생성합니다.
# - 질문은 논리적 순서로 배열되어야 합니다.
# - 질문은 명확하고 이해하기 쉬워야 합니다.

# 다음 JSON 형식으로 질문 목록을 반환해주세요:
# ```json
# {
Expand Down
9 changes: 4 additions & 5 deletions agents/focus_group_interview/modules/state.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from __future__ import annotations

from typing import Annotated, TypedDict, List
from dataclasses import dataclass
from typing import Annotated, List, TypedDict

from langchain_core.messages import AIMessage, HumanMessage
from langgraph.graph.message import add_messages
from langchain_core.messages import HumanMessage, AIMessage

from dataclasses import dataclass


@dataclass
Expand All @@ -15,7 +14,7 @@ class FocusGroupInterviewState(TypedDict):

포커스 그룹 인터뷰를 위한 Workflow에서 사용되는 상태 정보를 정의합니다.
LangGraph의 상태 관리를 위한 클래스로, Workflow 내에서 처리되는 데이터의 형태와 구조를 지정합니다.

아래는 예시 상태 변수들입니다. 실제 구현 시 필요에 따라 수정해서 사용해주세요!
"""

Expand Down
6 changes: 3 additions & 3 deletions agents/focus_group_interview/modules/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@
# """
# 포커스 그룹 인터뷰 녹취록을 분석합니다.
#
# 이 함수는 자연어 처리 기술을 사용하여 인터뷰 녹취록에서 주요 테마,
# 이 함수는 자연어 처리 기술을 사용하여 인터뷰 녹취록에서 주요 테마,
# 감정 분석, 키워드 빈도 등을 추출합니다.
# """
# # 실제 구현에서는 NLP 라이브러리를 사용하여 분석 수행
# # 예: spaCy, NLTK, HuggingFace Transformers 등
#
#
# # 예시 결과
# return {
# "themes": ["학습 경험", "교육 콘텐츠 품질", "상호작용성"],
Expand All @@ -50,7 +50,7 @@
# 응답 데이터를 가져옵니다.
# """
# # 실제 구현에서는 설문조사 플랫폼 API를 호출하여 데이터 수집
#
#
# # 예시 결과
# return {
# "response_count": 42,
Expand Down
38 changes: 19 additions & 19 deletions agents/focus_group_interview/modules/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,81 +28,81 @@
# def extract_themes_from_responses(responses: List[str]) -> List[str]:
# """
# 인터뷰 응답에서 주요 테마를 추출합니다.
#
# 이 함수는 간단한 키워드 빈도 분석을 사용하여 응답에서
#
# 이 함수는 간단한 키워드 빈도 분석을 사용하여 응답에서
# 반복적으로 언급되는 주요 테마를 식별합니다.
#
#
# Args:
# responses: 인터뷰 응답 목록
#
#
# Returns:
# 추출된 주요 테마 목록
# """
# # 실제 구현에서는 더 정교한 NLP 기법을 사용할 수 있음
# # 예시 구현
# all_text = " ".join(responses).lower()
#
#
# # 불용어 제거 및 단어 빈도 계산 로직
# # ...
#
#
# # 예시 결과
# return ["학습 경험", "교육 콘텐츠 품질", "상호작용성"]


# def format_interview_report(
# themes: List[str],
# insights: List[str],
# themes: List[str],
# insights: List[str],
# recommendations: List[str]
# ) -> str:
# """
# 포커스 그룹 인터뷰 결과를 보고서 형식으로 포맷팅합니다.
#
#
# Args:
# themes: 식별된 주요 테마 목록
# insights: 도출된 통찰 목록
# recommendations: 권장사항 목록
#
#
# Returns:
# 포맷팅된 보고서 문자열
# """
# report = "# 포커스 그룹 인터뷰 결과 보고서\n\n"
#
#
# report += "## 주요 테마\n"
# for i, theme in enumerate(themes, 1):
# report += f"{i}. {theme}\n"
#
#
# report += "\n## 주요 통찰\n"
# for i, insight in enumerate(insights, 1):
# report += f"{i}. {insight}\n"
#
#
# report += "\n## 권장사항\n"
# for i, recommendation in enumerate(recommendations, 1):
# report += f"{i}. {recommendation}\n"
#
#
# return report


# def parse_structured_response(response: str) -> Dict[str, Any]:
# """
# LLM의 구조화된 응답을 파싱합니다.
#
#
# 이 함수는 LLM이 생성한 텍스트에서 JSON 형식의 데이터를 추출합니다.
#
#
# Args:
# response: LLM의 응답 텍스트
#
#
# Returns:
# 파싱된 구조화 데이터
# """
# # JSON 블록 찾기
# json_match = re.search(r"```json\s*([\s\S]*?)\s*```", response)
#
#
# if json_match:
# try:
# return json.loads(json_match.group(1))
# except json.JSONDecodeError:
# # JSON 파싱 실패 시 빈 딕셔너리 반환
# return {}
#
#
# # JSON 블록을 찾지 못한 경우 빈 딕셔너리 반환
# return {}
6 changes: 3 additions & 3 deletions agents/focus_group_interview/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ def build(self):
CompiledStateGraph: 컴파일된 상태 그래프 객체
"""
builder = StateGraph(self.state)

# 노드 추가 예시
# builder.add_node("generate_questions", QuestionGenerationNode())
# builder.add_node("analyze_responses", ResponseAnalysisNode())

# 에지 추가 예시 - 아래 코드는 참고용이며 실제 구현 시 주석을 해제하고 사용할 수 있습니다
# 1. 단순 에지: 시작 노드에서 need_more_questions 함수로 연결
# builder.add_edge("__start__", need_more_questions)
Expand All @@ -57,4 +57,4 @@ def build(self):


# 포커스 그룹 인터뷰 Workflow 인스턴스 생성
focus_group_interview_workflow = FocusGroupInterviewWorkflow(FocusGroupInterviewState)
focus_group_interview_workflow = FocusGroupInterviewWorkflow(FocusGroupInterviewState)
3 changes: 1 addition & 2 deletions agents/main_state.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@

from __future__ import annotations

from dataclasses import dataclass
from typing import Annotated, TypedDict

from langgraph.graph.message import add_messages

from dataclasses import dataclass

@dataclass
class MainState(TypedDict):
Expand Down
2 changes: 0 additions & 2 deletions agents/marketing/modules/chains.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
기본적으로 modules.prompt 템플릿과 modules.models 모듈을 사용하여 LangChain 체인을 생성합니다.
"""

from typing import List

# from langchain.schema.runnable import RunnablePassthrough, RunnableSerializable
# from langchain_core.output_parsers import JsonOutputParser, StrOutputParser
# from langchain_core.pydantic_v1 import BaseModel, Field
Expand Down
14 changes: 7 additions & 7 deletions agents/marketing/modules/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
각 노드는 execute 메서드를 구현하여 상태(state)를 입력받아 처리하고, 처리 결과를 새로운 상태 업데이트로 반환합니다.
"""

from agents.base_node import BaseNode
# from agents.base_node import BaseNode

# from agents.marketing.modules.chains import set_campaign_generation_chain, set_content_creation_chain

Expand All @@ -15,7 +15,7 @@
# class CampaignGenerationNode(BaseNode):
# """
# 교육 제품/서비스에 적합한 마케팅 캠페인을 생성하는 노드
#
#
# 이 노드는 LangChain의 캠페인 생성 체인을 활용하여 교육 제품이나 서비스에 적합한 마케팅 전략을 생성합니다.
# 대상 청중, 제품 정보, 캠페인 목표 등을 고려하여 전략을 수립하고 Workflow의 다음 단계로 전달합니다.
# """
Expand All @@ -28,10 +28,10 @@
# def execute(self, state) -> dict:
# """
# 주어진 상태(state)에서 필요한 정보를 추출하여 캠페인 전략을 생성하고 결과를 반환합니다.
#
#
# Args:
# state (dict): Workflow의 현재 상태. target_audience, product_name, product_description 등의 정보를 포함함.
#
#
# Returns:
# dict: 생성된 캠페인 전략을 포함한 상태 업데이트
# """
Expand All @@ -53,7 +53,7 @@
# class ContentCreationNode(BaseNode):
# """
# 마케팅 캠페인에 필요한 콘텐츠를 생성하는 노드
#
#
# 이 노드는 LangChain의 콘텐츠 생성 체인을 활용하여 마케팅 캠페인에 필요한 다양한 콘텐츠를 생성합니다.
# 이전 단계에서 생성된 캠페인 전략을 기반으로 각 마케팅 채널에 적합한 콘텐츠를 생성하여 Workflow의 다음 단계로 전달합니다.
# """
Expand All @@ -66,10 +66,10 @@
# def execute(self, state) -> dict:
# """
# 주어진 상태(state)에서 필요한 정보를 추출하여 마케팅 콘텐츠를 생성하고 결과를 반환합니다.
#
#
# Args:
# state (dict): Workflow의 현재 상태. target_audience, product_name, marketing_channels, messages 등의 정보를 포함함.
#
#
# Returns:
# dict: 생성된 마케팅 콘텐츠를 포함한 상태 업데이트
# """
Expand Down
Loading