Spaces:
Sleeping
Sleeping
| title: CodeWeaver | |
| emoji: π€ | |
| colorFrom: blue | |
| colorTo: purple | |
| sdk: gradio | |
| sdk_version: "4.44.1" | |
| app_file: ui/app.py | |
| pinned: false | |
| license: mit | |
| # CodeWeaver | |
| LangGraph κΈ°λ°μ **κ°λ°μ Q&A μμ΄μ νΈ**μ λλ€. μ§λ¬Έμ λΆμνκ³ (νμ/λ 립), **μΊμ(Qdrant)**λ₯Ό μ°μ νμΈν λ€ μΊμ λ―Έμ€μΌ λ **3κ° μμ€(Stack Overflow / GitHub / 곡μ λ¬Έμ(Tavily))λ₯Ό λ³λ ¬ κ²μ**ν΄ λ΅λ³μ μμ±ν©λλ€. μλ‘ λ 립μ μΈ μ§λ¬Έμ΄ 2κ° λ€μ΄μ€λ©΄ **λμ μΌλ‘ 2κ° νμ΄νλΌμΈμ λ³λ ¬ μ€ν**ν΄ ν΅ν© λ΅λ³μ μ 곡ν©λλ€. | |
| ## ν΅μ¬ κΈ°λ₯(νμ¬ μ½λ κΈ°μ€) | |
| - **μ§λ¬Έ κ°μ κ°μ§**: 1κ°(λ¨μΌ μ£Όμ ) / 2κ°(λ 립 μ§λ¬Έ 2κ°) / 3κ° μ΄μ(κ±°μ μλ΄) | |
| - **μ§λ¬Έ νμ λΆμ**: `clarification`μ΄λ©΄ κ²μ/μΊμ μμ΄ **λν νμ€ν 리 κΈ°λ° λ΅λ³** | |
| - **μλ―Έμ μΊμ±**: Qdrantμ μ§λ¬Έ-λ΅λ³μ μ μ₯νκ³ μ μ¬ μ§λ¬Έμ λΉ λ₯΄κ² μ¬μ¬μ©(μκ³κ° 0.85) | |
| - **λ³λ ¬ κ²μ**: Stack Overflow / GitHub / Tavily(곡μ λ¬Έμ λλ©μΈ μ ν) λμ κ²μ | |
| - **κ²μ νμ§ λ³΄μ **: κ²°κ³Όκ° λΆμ‘±νλ©΄ **쿼리 κ°μ μ μ΅λ 1ν** μν | |
| - **μλΈκ·Έλν μ²λ¦¬**: κ²μ κ²°κ³Όλ₯Ό νν°λ§/μ μν ν μμ½ β μ΅μ’ λ΅λ³ μμ± | |
| ## λ¬Έμ | |
| - μν€ν μ²/λμ μ리: `../ARCHITECTURE.md` | |
| - λ€μ€ μ§λ¬Έ λ³λ ¬ μ²λ¦¬ μ€κ³(λ°°κ²½ μ€λͺ ): `../DYNAMIC_PARALLEL_SEARCH.md` | |
| ## λΉ λ₯Έ μμ | |
| ### 1) μ€μΉ | |
| μλλ μ μ₯μ 루νΈκ° μλλΌ **`CodeWeaver/` λλ ν°λ¦¬ κΈ°μ€** μμμ λλ€. | |
| ```bash | |
| cd CodeWeaver | |
| # uv μ¬μ©(κΆμ₯) | |
| uv sync | |
| # λλ pip μ¬μ© | |
| pip install -r requirements.txt | |
| ``` | |
| > `sentence-transformers`κ° μ΅μ΄ μ€ν μ `BAAI/bge-m3` λͺ¨λΈμ λ€μ΄λ‘λν μ μμ΅λλ€(λ€νΈμν¬ νμ). | |
| ### 2) νκ²½ λ³μ μ€μ (.env) | |
| `CodeWeaver/.env` νμΌμ λ§λ€κ³ μλλ₯Ό μ€μ νμΈμ(νμ/μ ν ꡬλΆ). | |
| ```bash | |
| # νμ: Gemini (LLM) | |
| GOOGLE_API_KEY=your_google_api_key | |
| # νμ: Tavily (곡μ λ¬Έμ κ²μ) | |
| TAVILY_API_KEY=your_tavily_api_key | |
| # νμ: Qdrant Cloud (μΊμ) | |
| QDRANT_URL=https://xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.us-east-1-0.aws.cloud.qdrant.io | |
| QDRANT_API_KEY=your_qdrant_api_key | |
| # μ ν: GitHub API rate limit μν | |
| GITHUB_TOKEN=your_github_token | |
| # μ ν: LangSmith νΈλ μ΄μ± | |
| LANGCHAIN_TRACING_V2=true | |
| LANGCHAIN_API_KEY=your_langsmith_api_key | |
| ``` | |
| ### 3) μ€ν(Gradio UI) | |
| ```bash | |
| cd CodeWeaver | |
| python ui/app.py | |
| ``` | |
| κΈ°λ³Έ μ£Όμ: `http://localhost:7860` | |
| ## νμ¬ ν΄λ ꡬ쑰 | |
| ``` | |
| CodeWeaver/ | |
| βββ main.py | |
| βββ pyproject.toml | |
| βββ requirements.txt | |
| βββ src/ | |
| β βββ agent/ | |
| β β βββ graph.py # LangGraph λ©μΈ κ·Έλν(λΌμ°ν /λ³λ ¬ν) | |
| β β βββ nodes.py # κ° λ Έλ ꡬν | |
| β β βββ state.py # AgentState + reducer μ μ | |
| β βββ tools/ | |
| β β βββ search_tools.py # StackOverflow/GitHub/Tavily κ²μ | |
| β βββ utils/ | |
| β β βββ tracing.py # trace_node λ°μ½λ μ΄ν°(LangSmith μ°λ) | |
| β βββ vector_db/ | |
| β βββ qdrant_client.py # Qdrant μΊμ κ΄λ¦¬ | |
| β βββ local_embeddings.py # bge-m3 λ‘컬 μλ² λ© | |
| βββ ui/ | |
| βββ app.py # Gradio UI (μ€μ μνΈλ¦¬) | |
| ``` | |
| ## λμ νλ¦(μμ½) | |
| - `START β create_plan` | |
| - **3κ° μ΄μ**μ΄λ©΄ μλ΄ λ©μμ§ λ°ν | |
| - **2κ°**λ©΄ κ° μ§λ¬Έμ workerμμ λ¨μΌ νμ΄νλΌμΈμΌλ‘ μ€ν ν κ²°ν© | |
| - **1κ°**λ©΄ μλ λ¨μΌ νμ΄νλΌμΈ μν | |
| - λ¨μΌ νμ΄νλΌμΈ: | |
| - `analyze_question` | |
| - `clarification`μ΄λ©΄ `generate_with_history`λ‘ μ¦μ λ΅λ³ | |
| - κ·Έ μΈ: `check_cache` β hitλ©΄ λ°ν, missλ©΄ `classify_intent` | |
| - `classify_intent` β 3μμ€ λ³λ ¬ κ²μ β `collect_results` β `evaluate_results` | |
| - νμ μ `refine_search` 1ν β μ¬κ²μ | |
| - `filter_and_score β summarize_results β generate_answer`(+μ‘°κ±΄λΆ μΊμ μ μ₯) | |
| μμΈν μ리λ `../ARCHITECTURE.md`λ₯Ό μ°Έκ³ νμΈμ. | |