LangChain과 LangGraph를 활용한 프롬프트 최적화 시스템입니다. 사용자의 질의를 로컬 LLM(Ollama, LM Studio)에 전달하기 전에 자동으로 개선하고, 최적화 과정을 실시간으로 시각화합니다.
- 🤖 로컬 LLM 지원: Ollama와 LM Studio 모두 사용 가능
- 🔄 자동 프롬프트 최적화: 질의를 분석하고 개선하여 더 나은 응답 생성
- 📊 실시간 시각화: 최적화 과정의 각 단계를 색상과 타임스탬프로 표시
- 🔗 LangGraph 워크플로우: 명확한 단계별 처리 구조
- 🔒 프라이버시 보장: 모든 처리가 로컬에서 실행
╔══════════════════════════════════════════════════════════════╗
║ LangChain Prompt Optimizer ║
║ 프롬프트 최적화 시스템 ║
╚══════════════════════════════════════════════════════════════╝
[10:30:15] ℹ️ LLM 서비스 연결 중...
[10:30:16] ✅ LLM 서비스 연결 성공!
🔧 LLM 설정:
• Provider: ollama
• Model: llama2
• Base URL: http://localhost:11434
============================================================
[10:30:16] 📝 원본 질의
============================================================
파이썬으로 웹 스크래핑하는 방법
============================================================
────────────────────────────────────────────────────────────
[10:30:17] 🔄 1단계: 질의 분석
────────────────────────────────────────────────────────────
사용자 질의의 명확성과 완전성을 분석합니다...
📊 분석 결과:
• 명확성: 7/10 - 기본적인 의도는 명확하나 구체성 부족
• 완전성: 5/10 - 어떤 라이브러리, 어떤 종류의 웹사이트인지 불명확
• 컨텍스트: BeautifulSoup, Selenium 등 도구 선택 필요
────────────────────────────────────────────────────────────
[10:30:20] 🔄 2단계: 프롬프트 최적화
────────────────────────────────────────────────────────────
분석 결과를 바탕으로 프롬프트를 개선합니다...
============================================================
[10:30:22] ✨ 최적화된 프롬프트
============================================================
Python을 사용하여 웹 스크래핑을 수행하는 방법을 단계별로 설명해주세요.
다음 내용을 포함해주세요:
1. 필요한 라이브러리 (BeautifulSoup, requests 등)
2. 기본적인 HTML 파싱 방법
3. 실제 예제 코드
4. 주의사항 및 베스트 프랙티스
============================================================
────────────────────────────────────────────────────────────
[10:30:23] 🔄 3단계: LLM 호출
────────────────────────────────────────────────────────────
최적화된 프롬프트로 LLM에 질의합니다...
============================================================
[10:30:28] 🤖 LLM 응답 (소요 시간: 5.23초)
============================================================
[LLM의 상세한 응답...]
============================================================
[10:30:28] ✅ 프롬프트 최적화 완료!
============================================================
⏱️ 전체 소요 시간: 12.45초
============================================================
langchain-prompt-optimizer/
├── README.md
├── requirements.txt
├── .gitignore
├── config/
│ ├── ollama_config.yaml
│ └── lmstudio_config.yaml
├── src/
│ ├── __init__.py
│ ├── main.py
│ ├── llm_provider.py
│ ├── prompt_optimizer.py
│ ├── workflow.py
│ ├── display.py
│ └── config_manager.py
├── examples/
│ ├── basic_usage.py
│ └── custom_optimization.py
└── tests/
├── __init__.py
├── test_llm_provider.py
├── test_optimizer.py
└── test_workflow.py
Python 3.9 이상이 필요합니다.
# 가상 환경 생성
python -m venv venv
# 가상 환경 활성화
# macOS/Linux:
source venv/bin/activate
# Windows:
venv\Scripts\activate
# 의존성 설치
pip install -r requirements.txt- Ollama 공식 사이트에서 다운로드
- 설치 후 모델 다운로드:
ollama pull llama2
# 또는 다른 모델
ollama pull mistral- Ollama 서비스 실행 (자동으로 실행되지 않는 경우):
ollama serve- LM Studio 공식 사이트에서 다운로드
- 앱 실행 후 원하는 모델 다운로드
- "Local Server" 탭에서 서버 시작
python src/main.py --config config/ollama_config.yaml --query "파이썬으로 웹 스크래핑하는 방법"python src/main.py --config config/ollama_config.yaml --interactivepython src/main.py --config config/lmstudio_config.yaml --query "머신러닝 기초 설명"llm:
provider: "ollama"
model: "llama2"
base_url: "http://localhost:11434"
optimization:
max_iterations: 3
temperature: 0.7
display:
show_timestamps: true
color_output: truellm:
provider: "lmstudio"
model: "local-model"
base_url: "http://localhost:1234"
optimization:
max_iterations: 3
temperature: 0.7
display:
show_timestamps: true
color_output: truefrom src.main import PromptOptimizerApp
app = PromptOptimizerApp(config_path="config/ollama_config.yaml")
result = app.run("파이썬으로 API 만드는 방법")
print(result)더 많은 예제는 examples/ 디렉토리를 참조하세요.
시스템은 LangGraph를 사용한 명확한 워크플로우 구조로 설계되었습니다:
사용자 입력
↓
[입력 검증]
↓
[LangGraph 워크플로우]
├─ 질의 분석 노드 (analyze)
│ └─ 명확성, 완전성, 컨텍스트 평가
├─ 프롬프트 최적화 노드 (optimize)
│ └─ 분석 결과 기반 프롬프트 개선
└─ LLM 호출 노드 (invoke_llm)
└─ 최적화된 프롬프트로 응답 생성
↓
[결과 표시]
- ConfigManager: YAML 설정 파일 로드 및 검증
- LLMProviderManager: Ollama/LM Studio 연결 관리
- PromptOptimizer: 질의 분석 및 프롬프트 최적화
- PromptOptimizationWorkflow: LangGraph 기반 워크플로우
- DisplayManager: 색상 코딩된 실시간 출력
증상: LLMConnectionError: ollama 서비스에 연결할 수 없습니다
해결 방법:
-
Ollama가 설치되어 있는지 확인:
ollama --version
-
Ollama 서비스 실행:
ollama serve
-
모델이 다운로드되어 있는지 확인:
ollama list
-
모델 다운로드 (필요시):
ollama pull llama2 # 또는 ollama pull mistral -
포트 확인 (기본: 11434):
curl http://localhost:11434/api/tags
증상: LLMConnectionError: lmstudio 서비스에 연결할 수 없습니다
해결 방법:
- LM Studio 앱이 실행 중인지 확인
- LM Studio에서 모델을 다운로드하고 로드
- "Local Server" 탭으로 이동
- "Start Server" 버튼 클릭
- 포트 확인 (기본: 1234)
- 설정 파일의
base_url이 올바른지 확인
증상: ModuleNotFoundError: No module named 'src'
해결 방법:
# 프로젝트 루트에서 실행
export PYTHONPATH="${PYTHONPATH}:$(pwd)"
# 또는 Python 경로를 직접 지정
python -m src.main --query "테스트"증상: ImportError: cannot import name 'X' from 'langchain'
해결 방법:
# 의존성 재설치
pip install --upgrade -r requirements.txt
# 특정 패키지 업데이트
pip install --upgrade langchain langgraph langchain-community원인: 로컬 LLM 모델의 크기와 하드웨어 성능에 따라 다름
개선 방법:
- 더 작은 모델 사용 (예:
llama2:7b대신llama2:3b) - GPU 가속 활성화 (Ollama는 자동으로 GPU 사용)
temperature값 조정 (낮을수록 빠름)max_tokens값 감소
증상: 시스템이 느려지거나 프로세스가 종료됨
해결 방법:
- 더 작은 모델 사용
- 다른 애플리케이션 종료
- Ollama/LM Studio 재시작
- 시스템 메모리 확인 및 업그레이드 고려
# 모든 테스트 실행
pytest
# 커버리지 포함
pytest --cov=src
# 특정 테스트 파일
pytest tests/test_workflow.pyblack src/ tests/
flake8 src/ tests/from src.main import PromptOptimizerApp
# 앱 초기화
app = PromptOptimizerApp(config_path="config/ollama_config.yaml")
# 질의 실행
result = app.run("파이썬으로 API 만드는 방법")
if result['success']:
print(f"원본: {result['original_query']}")
print(f"최적화: {result['optimized_prompt']}")
print(f"응답: {result['llm_response']}")from src.config_manager import ConfigManager
from src.llm_provider import LLMProviderManager
from src.prompt_optimizer import PromptOptimizer
from src.workflow import PromptOptimizationWorkflow
from src.display import DisplayManager
# 커스텀 설정
custom_config = {
'llm': {
'provider': 'ollama',
'model': 'mistral',
'base_url': 'http://localhost:11434',
'temperature': 0.5,
'max_tokens': 1000
}
}
# 컴포넌트 초기화
config_manager = ConfigManager()
config_manager.config = custom_config
llm_config = config_manager.get_llm_config()
llm_provider = LLMProviderManager(
provider=llm_config.provider,
model=llm_config.model,
base_url=llm_config.base_url
)
prompt_optimizer = PromptOptimizer(llm_provider)
display = DisplayManager()
workflow = PromptOptimizationWorkflow(llm_provider, prompt_optimizer, display)
# 실행
final_state = workflow.run("질의 내용")app = PromptOptimizerApp(config_path="config/ollama_config.yaml")
queries = [
"React 컴포넌트 설계",
"SQL 쿼리 최적화",
"마이크로서비스 아키텍처"
]
results = []
for query in queries:
result = app.run(query)
results.append(result)
# 다음 질의 전에 히스토리 초기화
app.workflow.clear_history()
app.prompt_optimizer.clear_steps()-
모델 선택: 작업에 적합한 크기의 모델 선택
- 간단한 질의:
llama2:7b,mistral:7b - 복잡한 질의:
llama2:13b,mixtral:8x7b
- 간단한 질의:
-
Temperature 조정:
- 결정적 출력:
0.1-0.3 - 창의적 출력:
0.7-0.9
- 결정적 출력:
-
캐싱: 동일한 질의는 결과를 캐싱하여 재사용
-
병렬 처리: 여러 질의를 동시에 처리 (주의: 메모리 사용량 증가)
이 프로젝트는 다음과 같이 확장할 수 있습니다:
- 추가 LLM 제공자: OpenAI, Anthropic, HuggingFace 등
- RAG 통합: 벡터 데이터베이스를 사용한 컨텍스트 검색
- 웹 인터페이스: Streamlit 또는 Gradio UI
- 프롬프트 템플릿: 도메인별 최적화 전략
- 평가 메트릭: 최적화 품질 측정
- 로깅 및 모니터링: 성능 추적 및 분석
기여를 환영합니다! 다음 단계를 따라주세요:
- 이 저장소를 Fork
- 기능 브랜치 생성 (
git checkout -b feature/amazing-feature) - 변경사항 커밋 (
git commit -m 'Add amazing feature') - 브랜치에 Push (
git push origin feature/amazing-feature) - Pull Request 생성
- 코드 스타일: Black 포맷터 사용
- 린팅: Flake8
- 테스트: pytest로 테스트 작성
- 문서화: 모든 함수에 docstring 추가
Jeong Jaewoo
- GitHub: @ez2sarang
프로젝트 관련 비즈니스 문의는 아래 이메일로 연락주세요:
- 기술적 질문이나 이슈: GitHub Issues
- 비즈니스 문의: sales@com.dooray.com