LLM Action
English | 繁體中文 | 簡體中文
LLM Action
Lint and Testing
Trivy Security Scan
Go Report Card
A GitHub Action으로, 사용자 지정 엔드포인트, 자체 호스팅 모델(Ollama, LocalAI, vLLM), SSL/CA 인증서, Go 템플릿 프롬프트 및 함수 호출을 통한 구조화된 출력을 지원하는 OpenAI와 호환되는 LLM 서비스와 상호 작용합니다.
발표 자료 (Presentation)
이 액션을 사용하여 AI 기반 GitHub 자동화 워크플로우를 구축하는 방법을 알아보세요:
왜 LLM Action인가?
AI 기반 개발이 주류가 되면서, CI/CD 파이프라인에 LLM을 통합하는 것이 현대 소프트웨어 팀에게 필수적입니다. 하지만 기존 솔루션들은 종종 다음과 같은 문제에 직면합니다:
- 벤더 종속성 (Vendor Lock-in): 대부분의 GitHub Actions은 단일 LLM 제공업체만 지원하여, 서비스 전환이나 모델 비교가 어렵습니다.
- 제한된 유연성 (Limited Flexibility): 하드코딩된 프롬프트와 경직된 구성은 다양한 프로젝트 요구 사항에 적응하지 못합니다.
- 보안 문제 (Security Concerns): 자체 호스팅 또는 에어 갭 환경에서는 많은 액션이 지원하지 않는 사용자 지정 엔드포인트 및 인증서 관리가 필요합니다.
- 비구조화된 출력 (Unstructured Output): 원시 LLM 응답은 파싱하고 자동화 워크플로우에서 사용하기 어렵습니다.
LLM Action은 다음을 제공함으로써 이러한 문제를 해결하기 위해 만들어졌습니다:
- 범용 호환성 (Universal Compatibility) - 모든 OpenAI 호환 서비스(OpenAI, Azure, Ollama, LocalAI, vLLM 등)에서 작동하는 단일 액션
- 동적 프롬프트 (Dynamic Prompts) - Go 템플릿을 사용하여 환경 변수를 주입하고 컨텍스트 인식 프롬프트를 구축할 수 있습니다.
- 구조화된 출력 (Structured Output) - 도구 스키마(Tool schema, 함수 호출)를 통해 자동화를 위한 일관되고 파싱 가능한 JSON 응답을 보장합니다.
- 엔터프라이즈 준비 완료 (Enterprise Ready) - 보안 배포를 위해 사용자 지정 CA 인증서, SSL 구성 및 HTTP 헤더에 대한 전체 지원을 제공합니다.
자동화된 코드 리뷰, PR 요약, 이슈 분류 또는 모든 AI 기반 워크플로우를 구축하든, LLM Action은 워크플로우의 이식성과 유지보수성을 유지하면서 어떤 LLM 서비스든 사용할 수 있는 유연성을 제공합니다.
목차 (Table of Contents)
기본 구조화된 출력 (Basic Structured Output)
로컬/자체 호스팅 LLM 사용 (Self-Hosted / Local LLM)
Azure OpenAI 사용 (Using with Azure OpenAI)
사용자 지정 CA 인증서 사용 (Using Custom CA Certificate)
Ollama 사용 (Using with Ollama)
여러 LLM 호출 연결하기 (Chain Multiple LLM Calls)
디버그 모드 (Debug Mode)
지원되는 서비스 (Supported Services)
보안 고려 사항 (Security Considerations)
라이선스 (License)
기여하기 (Contributing)
기능 (Features)
- 🔌 모든 OpenAI 호환 API 엔드포인트에 연결 가능
- 🔐 사용자 지정 API 키 지원
- 🔧 자체 호스팅 서비스용 구성 가능한 기본 URL
- 🚫 선택적 SSL 인증서 검증 건너뛰기
- 🔒 자체 서명된 인증서를 위한 사용자 지정 CA 인증서 지원
- 🎯 컨텍스트 설정을 위한 시스템 프롬프트 지원
- 📝 후속 작업을 위해 사용 가능한 출력 응답
- 🎛️ 구성 가능한 온도(temperature) 및 최대 토큰 수(max tokens)
- 🐛 안전한 API 키 마스킹이 적용된 디버그 모드
- 🎨 환경 변수를 사용한 동적 프롬프트용 Go 템플릿 지원
- 🛠️ 함수 호출을 통한 구조화된 출력 (도구 스키마 지원)
- 📋 로그 분석 및 사용자 지정 인증을 위한 사용자 지정 HTTP 헤더 지원
| Input | Description | Required | Default |
|---|
base_url | OpenAI 호환 API 엔드포인트의 기본 URL | No | https://api.openai.com/v1 |
| ... | | | |
For 새로운 설정에서는 max_completion_tokens를 선호하세요: | | | |
with:
max_completion_tokens: "2000"
이는 max_tokens보다 우선합니다. max_tokens는 해당 필드만 지원하는 레거시 서비스에 사용하세요. max_completion_tokens가 설정되지 않은 경우, Action은 인식된 추론 모델(o1/o3/o4/gpt-5 시리즈)의 경우 자동으로 max_tokens를 max_completion_tokens로 전송합니다.
Outputs
| Output | Description |
|---|
response | LLM의 원본 응답 (항상 사용 가능) |
| ... | |
| 출력 동작: | |
response 출력은 항상 사용 가능하며, 원본 LLM 응답을 포함합니다.
tool_schema를 사용할 경우, 함수 인수가 파싱되어 response 외에 각 필드가 개별 출력으로 추가됩니다.
- 예약된 필드: 도구 스키마가
response라는 이름의 필드를 정의하는 경우, 이는 건너뛰어지며 경고 메시지가 표시됩니다. 이는 response가 원본 LLM 출력을 위해 예약되었기 때문입니다.
예시: 스키마에 city와 country 필드가 정의된 경우, 출력은 다음과 같습니다:
steps.<id>.outputs.response - 원시 JSON 응답
steps.<id>.outputs.city - 도시 필드 값
steps.<id>.outputs.country - 국가 필드 값
사용 예시
기본 예시
name: LLM Workflow
on: [push]
...
버전 고정 (Version Pinning)
이 액션의 특정 버전에 고정할 수 있습니다:
uses: appleboy/LLM-action@v1
...
권장 사항: 메이저 버전 태그(예: @v1)를 사용하여 하위 호환성 업데이트와 버그 수정 사항을 자동으로 받으세요.
시스템 프롬프트 사용 시 (With System Prompt)
- name: LLM을 이용한 코드 검토
id: review
uses: appleboy/LLM-action@v1
...
```python
def add(a, b):
return a + b
```
temperature: "0.3"
max_tokens: "2000"
...
여러 줄 시스템 프롬프트 사용 시 (With Multiline System Prompt)
- name: 고급 코드 검토
id: review
uses: appleboy/LLM-action@v1
...
파일에서 가져오는 시스템 프롬프트 (System Prompt from File)
YAML에 긴 프롬프트를 임베딩하는 대신, 파일에서 로드할 수 있습니다:
- name: 프롬프트 파일을 이용한 코드 검토
id: review
uses: appleboy/LLM-action@v1
...
```python
def calculate(x, y):
return x / y
```
또는 file:// 접두사를 사용합니다:
- name: 파일 URI를 이용한 코드 검토
uses: appleboy/LLM-action@v1
with:
...
URL에서 가져오는 시스템 프롬프트 (System Prompt from URL)
원격 URL에서 프롬프트를 로드합니다:
- name: 원격 프롬프트를 이용한 코드 검토
id: review
uses: appleboy/LLM-action@v1
...
입력 프롬프트도 파일에서 로드할 수 있습니다:
- name: 파일로부터 코드 분석
uses: appleboy/LLM-action@v1
with:
...
원격 URL에서 입력 콘텐츠를 로드합니다:
- name: 원격 콘텐츠 분석
uses: appleboy/LLM-action@v1
with:
...
프롬프트에 Go 템플릿 사용하기 (Using Go Templates in Prompts)
both system_prompt와 input_prompt 모두 Go 템플릿을 지원하여 환경 변수를 프롬프트에 동적으로 삽입할 수 있습니다. 이는 리포지토리 이름, 브랜치 이름 또는 사용자 정의 변수와 같은 컨텍스트를 포함하려는 GitHub Actions 워크플로우에서 특히 유용합니다.
주요 기능:
{{.VAR_NAME}}을 사용하여 모든 환경 변수에 접근할 수 있습니다.
INPUT_ 접두사가 붙은 환경 변수는 접두사 유무와 관계없이 사용할 수 있습니다.
- 예시:
INPUT_MODEL은 {{.MODEL}} 또는 {{.INPUT_MODEL}}로 접근할 수 있습니다.
- 모든 GitHub Actions 기본 환경 변수(예:
GITHUB_REPOSITORY, GITHUB_REF_NAME)를 사용할 수 있습니다.
- 조건문 및 함수를 포함한 전체 Go 템플릿 구문을 지원합니다.
예시 1: GitHub Actions 변수 사용
- name: Analyze Repository with Context
uses: appleboy/LLM-action@v1
with:
...
예시 2: 사용자 정의 환경 변수 사용
- name: Set Custom Variables
run: |
echo "INPUT_PROJECT_TYPE=web-application" >> $GITHUB_ENV
...
예시 3: 파일 내 템플릿
.github/prompts/review-template.txt라는 템플릿 파일을 생성합니다:
Please review this pull request for {{.GITHUB_REPOSITORY}}.
Repository: {{.GITHUB_REPOSITORY}}
...
그런 다음 워크플로우에서 사용합니다:
- name: Code Review with Template File
uses: appleboy/LLM-action@v1
with:
...
예시 4: 조건부 로직
- name: Conditional Prompt
uses: appleboy/LLM-action@v1
with:
...
사용 가능한 GitHub Actions 환경 변수
템플릿에서 사용할 수 있는 일반적인 변수들:
{{.GITHUB_REPOSITORY}} - Repository 이름 (예: owner/repo)
{{.GITHUB_REF_NAME}} - 브랜치 또는 태그 이름
{{.GITHUB_ACTOR}} - 워크플로우를 트리거한 사람의 사용자 이름
{{.GITHUB_SHA}} - 커밋 SHA
{{.GITHUB_EVENT_NAME}} - 워크플로우를 트리거한 이벤트
{{.GITHUB_WORKFLOW}} - 워크플로우 이름
{{.GITHUB_RUN_ID}} - 고유한 워크플로우 실행 ID
{{.GITHUB_RUN_NUMBER}} - 고유한 워크플로우 실행 번호
그리고 워크플로우에서 사용할 수 있는 다른 모든 환경 변수들
함수 호출(function calling)을 사용하여 LLM으로부터 구조화된 JSON 출력을 얻는 데 tool_schema를 사용합니다. 이는 LLM이 후속 워크플로우 단계에서 쉽게 파싱되고 사용될 수 있는 특정 형식의 데이터로 반환해야 할 때 유용합니다.
기본 구조화된 출력 (Basic Structured Output)
- name: Extract City Information
id: extract
uses: appleboy/LLM-action@v1
...
구조화된 출력을 사용한 코드 검토 (Code Review with Structured Output)
- name: Structured Code Review
id: review
uses: appleboy/LLM-action@v1
...
```python
def divide(a, b):
return a / b
```
tool_schema: |
{
"name": "code_review",
...
```