Skip to content

๊ธฐ์—ฌ ๊ฐ€์ด๋“œ

VLLM ๋ชจ๋ธ ์„ฑ๋Šฅ ์ž๋™ ํ‰๊ฐ€ ์‹œ์Šคํ…œ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ™ ๊ธฐ์—ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํ”„๋กœ์ ํŠธ์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์‹œ๊ณ  ๊ธฐ์—ฌํ•˜๊ณ ์ž ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ํšจ๊ณผ์ ์ด๊ณ  ์ผ๊ด€์„ฑ ์žˆ๋Š” ๊ธฐ์—ฌ๋ฅผ ์œ„ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ

๐Ÿ› ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Python: 3.9+
  • Docker: 24.0+
  • Kubernetes: 1.26+ (๋กœ์ปฌ ํ…Œ์ŠคํŠธ์šฉ)
  • Kind: 0.20+ (๋กœ์ปฌ ํด๋Ÿฌ์Šคํ„ฐ)
  • Helm: 3.12+
  • Git: 2.30+

ํ™˜๊ฒฝ ๊ตฌ์„ฑ

# 1. ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/your-org/vllm-eval.git
cd vllm-eval

# 2. Python ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
python3.11 -m venv venv
source venv/bin/activate

# 3. ๊ฐœ๋ฐœ ์˜์กด์„ฑ ์„ค์น˜
pip install -r requirements-dev.txt
pip install -r requirements-test.txt

# 4. Pre-commit ํ›… ์„ค์น˜
pre-commit install

# 5. ํ…Œ์ŠคํŠธ ์‹คํ–‰์œผ๋กœ ์„ค์ • ํ™•์ธ
pytest eval/deepeval_tests/

IDE ์„ค์ •

  • Interpreter: ./venv/bin/python
  • Code style & Linter: Ruff
  • Test runner: pytest

๐Ÿ”„ ๊ธฐ์—ฌ ํ”„๋กœ์„ธ์Šค

1. ์ด์Šˆ ํ™•์ธ ๋˜๋Š” ์ƒ์„ฑ

  • ๊ธฐ์กด ์ด์Šˆ๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด์„ธ์š”
  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ๋Š” ์ด์Šˆ๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”
  • ์ด์Šˆ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”

2. ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

# ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ์‹œ์ž‘
git checkout main
git pull origin main

# ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
git checkout -b feature/your-feature-name
# ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •
git checkout -b fix/bug-description

3. ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ

# ์ฝ”๋“œ ๋ณ€๊ฒฝ ํ›„ ํ…Œ์ŠคํŠธ
pytest

# ๋ฆฐํŒ… ๋ฐ ํฌ๋งทํŒ…
ruff check . --fix
ruff format .

4. ์ปค๋ฐ‹

# ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ (Conventional Commits ๊ทœ์น™ ์ค€์ˆ˜)
git add .
git commit -m "feat: add new evaluation metric for hallucination detection"

5. Pull Request ์ƒ์„ฑ

# ๋ธŒ๋žœ์น˜ ํ‘ธ์‹œ
git push origin feature/your-feature-name

# GitHub์—์„œ PR ์ƒ์„ฑ

๐ŸŽจ ์ฝ”๋”ฉ ํ‘œ์ค€

Python ์ฝ”๋“œ ์Šคํƒ€์ผ

Ruff๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฆฐํŒ… ๋ฐ ํฌ๋งทํŒ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

# โœ… ์ข‹์€ ์˜ˆ
from typing import Dict, List, Optional

import torch
from deepeval import BaseMetric


class HallucinationMetric(BaseMetric):
    """ํ™˜๊ฐ ํƒ์ง€๋ฅผ ์œ„ํ•œ ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ.

    Args:
        threshold: ํ™˜๊ฐ ํŒ์ • ์ž„๊ณ„๊ฐ’ (0.0-1.0)
        model_name: ์‚ฌ์šฉํ•  ๋ชจ๋ธ๋ช…

    Returns:
        HallucinationScore: ํ™˜๊ฐ ์ ์ˆ˜ ๊ฒฐ๊ณผ
    """

    def __init__(self, threshold: float = 0.5, model_name: str = "gpt-4") -> None:
        self.threshold = threshold
        self.model_name = model_name

    def measure(self, test_case: Dict[str, str]) -> float:
        """ํ™˜๊ฐ ์ ์ˆ˜๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค."""
        # ๊ตฌํ˜„ ๋‚ด์šฉ
        pass

๋ช…๋ช… ๊ทœ์น™

  • ํŒŒ์ผ๋ช…: snake_case.py
  • ํด๋ž˜์Šค๋ช…: PascalCase
  • ํ•จ์ˆ˜/๋ณ€์ˆ˜๋ช…: snake_case
  • ์ƒ์ˆ˜๋ช…: UPPER_SNAKE_CASE
  • Private ๋ฉค๋ฒ„: _leading_underscore

ํƒ€์ž… ํžŒํŒ…

๋ชจ๋“  ํ•จ์ˆ˜์—๋Š” ํƒ€์ž… ํžŒํŒ…์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

from typing import Dict, List, Optional, Union

def evaluate_model(
    model_endpoint: str,
    dataset_path: str,
    metrics: List[str],
    config: Optional[Dict[str, Union[str, int]]] = None
) -> Dict[str, float]:
    """๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค."""
    pass

์—๋Ÿฌ ์ฒ˜๋ฆฌ

import logging
from typing import Optional

logger = logging.getLogger(__name__)

class EvaluationError(Exception):
    """ํ‰๊ฐ€ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ."""
    pass

def safe_evaluate(model_endpoint: str) -> Optional[Dict[str, float]]:
    """์•ˆ์ „ํ•œ ๋ชจ๋ธ ํ‰๊ฐ€."""
    try:
        result = evaluate_model(model_endpoint)
        return result
    except ConnectionError as e:
        logger.error(f"๋ชจ๋ธ ์—ฐ๊ฒฐ ์‹คํŒจ: {e}")
        return None
    except EvaluationError as e:
        logger.error(f"ํ‰๊ฐ€ ์‹คํŒจ: {e}")
        raise

๐Ÿงช ํ…Œ์ŠคํŒ… ๊ฐ€์ด๋“œ๋ผ์ธ

ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ

  • Deepeval ํ…Œ์ŠคํŠธ: eval/deepeval_tests/ ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— Pytest ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ ํ…Œ์ŠคํŠธ: eval/deepeval_tests/test_custom_metric.py
    • RAG ํ‰๊ฐ€ ํ…Œ์ŠคํŠธ: eval/deepeval_tests/test_llm_rag.py

ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๊ทœ์น™

import pytest
from unittest.mock import Mock, patch

from eval.deepeval_tests.metrics.rag_precision import RAGPrecisionMetric


class TestRAGPrecisionMetric:
    """RAG Precision ๋ฉ”ํŠธ๋ฆญ ํ…Œ์ŠคํŠธ."""

    @pytest.fixture
    def metric(self) -> RAGPrecisionMetric:
        """ํ…Œ์ŠคํŠธ์šฉ ๋ฉ”ํŠธ๋ฆญ ์ธ์Šคํ„ด์Šค."""
        return RAGPrecisionMetric(threshold=0.8)

    def test_init_with_default_params(self) -> None:
        """๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ดˆ๊ธฐํ™” ํ…Œ์ŠคํŠธ."""
        metric = RAGPrecisionMetric()
        assert metric.threshold == 0.7
        assert metric.name == "rag_precision"

    @patch('eval.deepeval_tests.metrics.rag_precision.openai_client')
    def test_measure_high_precision(self, mock_client: Mock, metric: RAGPrecisionMetric) -> None:
        """๋†’์€ ์ •๋ฐ€๋„ ์ผ€์ด์Šค ํ…Œ์ŠคํŠธ."""
        # Given
        mock_client.return_value = {"score": 0.9}
        test_case = {
            "query": "ํ…Œ์ŠคํŠธ ์งˆ๋ฌธ",
            "context": "๊ด€๋ จ ๋ฌธ๋งฅ",
            "answer": "์ •๋‹ต"
        }

        # When
        score = metric.measure(test_case)

        # Then
        assert score > 0.8
        mock_client.assert_called_once()

ํ…Œ์ŠคํŠธ ์‹คํ–‰

# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
pytest

# ํŠน์ • ํ…Œ์ŠคํŠธ ํŒŒ์ผ
pytest tests/unit/test_metrics.py

# ์ปค๋ฒ„๋ฆฌ์ง€ ํฌํ•จ
pytest --cov=eval --cov-report=html

# ๋ณ‘๋ ฌ ์‹คํ–‰
pytest -n auto

๐Ÿ“š ๋ฌธ์„œํ™”

Docstring ๊ทœ์น™

Google ์Šคํƒ€์ผ docstring์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

def evaluate_dataset(
    dataset_path: str, 
    metrics: List[str],
    batch_size: int = 32
) -> Dict[str, float]:
    """๋ฐ์ดํ„ฐ์…‹์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    Args:
        dataset_path: ๋ฐ์ดํ„ฐ์…‹ ํŒŒ์ผ ๊ฒฝ๋กœ
        metrics: ์‚ฌ์šฉํ•  ๋ฉ”ํŠธ๋ฆญ ๋ฆฌ์ŠคํŠธ
        batch_size: ๋ฐฐ์น˜ ํฌ๊ธฐ

    Returns:
        ๋ฉ”ํŠธ๋ฆญ๋ณ„ ์ ์ˆ˜ ๋”•์…”๋„ˆ๋ฆฌ

    Raises:
        FileNotFoundError: ๋ฐ์ดํ„ฐ์…‹ ํŒŒ์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ
        EvaluationError: ํ‰๊ฐ€ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

    Example:
        >>> results = evaluate_dataset("data.json", ["accuracy", "f1"])
        >>> print(results["accuracy"])
        0.85
    """
    pass

README ๋ฐ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๊ด€๋ จ ๋ฌธ์„œ๋„ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•ด์ฃผ์„ธ์š”:

  • README.md: ์ฃผ์š” ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ
  • docs/: ์ƒ์„ธ ๊ฐ€์ด๋“œ
  • API ๋ฌธ์„œ: ์ƒˆ๋กœ์šด API ์ถ”๊ฐ€ ์‹œ

๐Ÿ› ์ด์Šˆ ๋ฆฌํฌํŒ…

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ

์ด์Šˆ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์ฃผ์„ธ์š”:

  • ํ™˜๊ฒฝ ์ •๋ณด: OS, Python ๋ฒ„์ „, ์˜์กด์„ฑ ๋ฒ„์ „
  • ์žฌํ˜„ ๋‹จ๊ณ„: ๋‹จ๊ณ„๋ณ„ ์ƒ์„ธ ์„ค๋ช…
  • ์˜ˆ์ƒ ๋™์ž‘: ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€
  • ์‹ค์ œ ๋™์ž‘: ์‹ค์ œ๋กœ ๋ฌด์—‡์ด ์ผ์–ด๋‚ฌ๋Š”์ง€
  • ๋กœ๊ทธ: ๊ด€๋ จ ์—๋Ÿฌ ๋กœ๊ทธ๋‚˜ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค

๊ธฐ๋Šฅ ์š”์ฒญ

  • ๋™๊ธฐ: ์™œ ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ์ง€
  • ์ œ์•ˆ: ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š”์ง€
  • ๋Œ€์•ˆ: ๊ณ ๋ ค๋œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค
  • ์˜ํ–ฅ๋„: ๊ธฐ์กด ๊ธฐ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

๐Ÿ” Pull Request ๊ฐ€์ด๋“œ๋ผ์ธ

PR ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • [ ] ์ด์Šˆ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค
  • [ ] ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค
  • [ ] ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ์œ ์ง€๋˜๊ฑฐ๋‚˜ ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค
  • [ ] ๋ฌธ์„œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
  • [ ] CHANGELOG๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (ํ•„์š”์‹œ)
  • [ ] Breaking changes๊ฐ€ ๋ช…์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (ํ•ด๋‹น์‹œ)

PR ํ…œํ”Œ๋ฆฟ

## ๋ณ€๊ฒฝ์‚ฌํ•ญ ์š”์•ฝ
<!-- ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ๊ฐ„๋‹จํžˆ ์„ค๋ช… -->

## ๊ด€๋ จ ์ด์Šˆ
<!-- ํ•ด๊ฒฐํ•˜๋Š” ์ด์Šˆ ๋ฒˆํ˜ธ -->
Closes #123

## ๋ณ€๊ฒฝ ์œ ํ˜•
- [ ] ๋ฒ„๊ทธ ์ˆ˜์ •
- [ ] ์ƒˆ ๊ธฐ๋Šฅ
- [ ] Breaking change
- [ ] ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ

## ํ…Œ์ŠคํŠธ
<!-- ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ–ˆ๋Š”์ง€ ์„ค๋ช… -->

## ์ฒดํฌ๋ฆฌ์ŠคํŠธ
- [ ] ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€/์—…๋ฐ์ดํŠธ
- [ ] ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ
- [ ] ๋ฆฐํŒ… ํ†ต๊ณผ

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™

Conventional Commits์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

Types: - feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ - fix: ๋ฒ„๊ทธ ์ˆ˜์ • - docs: ๋ฌธ์„œ ๋ณ€๊ฒฝ - style: ์ฝ”๋“œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ - refactor: ๋ฆฌํŒฉํ† ๋ง - test: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€/์ˆ˜์ • - chore: ๊ธฐํƒ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ

Examples:

feat(metrics): add hallucination detection metric

fix(deepeval): resolve memory leak in evaluation loop

docs(readme): update installation instructions

test(rag): add integration tests for RAG metrics

๐Ÿ‘ฅ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค

๋ฆฌ๋ทฐ์–ด ๊ฐ€์ด๋“œ๋ผ์ธ

๋ฆฌ๋ทฐ ํฌ์ธํŠธ: - ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๊ฐ€๋…์„ฑ - ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ - ์„ฑ๋Šฅ ์˜ํ–ฅ - ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ - API ์ผ๊ด€์„ฑ

๋ฆฌ๋ทฐ ์˜ˆ์‹œ:

### ๐Ÿ’ก ์ œ์•ˆ
`evaluate_model` ํ•จ์ˆ˜์—์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

### ๐Ÿ› ์ด์Šˆ
L45: ์ด ๋ถ€๋ถ„์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

### โœ… ์Šน์ธ
LGTM! ํ…Œ์ŠคํŠธ๋„ ์ž˜ ์ž‘์„ฑ๋˜์—ˆ๋„ค์š”.

์ž‘์„ฑ์ž ๊ฐ€์ด๋“œ๋ผ์ธ

  • ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ์— ์‹ ์†ํ•˜๊ฒŒ ์‘๋‹ต
  • ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์„ค๋ช…
  • ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๊ณต์œ 
  • ์˜๊ฒฌ ๋ถˆ์ผ์น˜ ์‹œ ๊ฑด์„ค์  ํ† ๋ก 

๐Ÿท๏ธ ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค

๋ฒ„์ „ ๊ด€๋ฆฌ

  • Semantic Versioning ์‚ฌ์šฉ: MAJOR.MINOR.PATCH
  • Pre-release: 1.0.0-alpha.1, 1.0.0-beta.1, 1.0.0-rc.1

๋ฆด๋ฆฌ์Šค ๋‹จ๊ณ„

  1. Feature freeze: ์ƒˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์ค‘๋‹จ
  2. ํ…Œ์ŠคํŒ…: ์ „์ฒด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ์‹คํ–‰
  3. ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ: README, CHANGELOG ์—…๋ฐ์ดํŠธ
  4. ํƒœ๊ทธ ์ƒ์„ฑ: git tag v1.0.0
  5. ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ: GitHub ๋ฆด๋ฆฌ์Šค ํŽ˜์ด์ง€ ์ž‘์„ฑ

๐Ÿ”’ ๋ณด์•ˆ ๊ฐ€์ด๋“œ๋ผ์ธ

๋ณด์•ˆ ์ด์Šˆ ๋ฆฌํฌํŒ…

๋ณด์•ˆ ์ทจ์•ฝ์ ์€ public ์ด์Šˆ๊ฐ€ ์•„๋‹Œ ์ด๋ฉ”์ผ๋กœ ์‹ ๊ณ ํ•ด์ฃผ์„ธ์š”: - ์ด๋ฉ”์ผ: security@company.com - PGP Key: [๊ณต๊ฐœํ‚ค ๋งํฌ]

๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋ฏผ๊ฐํ•œ ์ •๋ณด ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€
  • ์˜์กด์„ฑ ์ทจ์•ฝ์  ์ •๊ธฐ ๊ฒ€์‚ฌ
  • API ์—”๋“œํฌ์ธํŠธ ์ธ์ฆ/์ธ๊ฐ€ ํ™•์ธ
  • ๋กœ๊ทธ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ถœ๋ ฅ ๊ธˆ์ง€

๐ŸŽ‰ ์ธ์ •๊ณผ ๊ฐ์‚ฌ

๋ชจ๋“  ๊ธฐ์—ฌ์ž๋Š” README์˜ Contributors ์„น์…˜์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์—์„œ ๊ธฐ์—ฌ ๋‚ด์šฉ์ด ์–ธ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ž ๋„์›€ ๋ฐ ๋ฌธ์˜

  • ์ผ๋ฐ˜ ์งˆ๋ฌธ: GitHub Discussions
  • ๊ธฐ์ˆ  ์ง€์›: #vllm-eval Slack ์ฑ„๋„
  • ๊ธด๊ธ‰ ๋ฌธ์˜: tech-support@company.com

๋‹ค์‹œ ํ•œ๋ฒˆ ๊ธฐ์—ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™

์งˆ๋ฌธ์ด๋‚˜ ์ œ์•ˆ์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ์—ฐ๋ฝํ•ด์ฃผ์„ธ์š”.