언어 모델은 확률 분포에서 다음 토큰을 고릅니다. 두 가지 설정이 분포의 모양을 정합니다.
- 'Top-k: 로짓이 가장 높은 k개의 토큰만 남깁니다 (로짓이 같으면 인덱스가 작은 쪽이 더 높은 순위).'
- '온도 T: 소프트맥스 전에 남긴 로짓을 T로 나눕니다. T가 낮으면 선택이 예측 가능해지고, T가 높으면 더 무작위가 됩니다.'
테스트할 수 있도록 난수가 주어집니다.
- 상위 k개 토큰을 남기고, 원래 인덱스의 오름차순으로 나열합니다.
- 남긴 토큰에 대해 softmax(logit / T)를 계산합니다 (e^x를 계산하기 전에 가장 큰 값을 뺍니다).
- 목록을 따라가며 확률을 더하고, 누적 합이
random_value보다 처음으로 커지는 토큰의 인덱스를 반환합니다. 아무것도 넘지 않으면(반올림 오차) 마지막으로 남긴 토큰을 반환합니다.
k = 1이면 탐욕적 디코딩, 즉 항상 가장 가능성 높은 토큰을 고릅니다.
sample_token(logits, temperature, k, random_value)를 구현하세요.
입력
logits: 어휘의 토큰마다 하나의 점수.
temperature: T, 0보다 큼.
k: 남길 상위 토큰 수.
random_value: [0, 1) 범위의 난수.
출력
선택된 토큰의 인덱스를 반환하세요.
제약 조건
1 ≤ k ≤ 로짓 수 ≤ 1,000
0 < temperature ≤ 100, 0 ≤ random_value < 1
-100 ≤ 각 로짓 ≤ 100
예시
입력:
logits = [1.0, 3.0, 2.0, 0.5]
temperature = 1.0
k = 1
random_value = 0.99
예상 출력:
1
설명
k = 1이면 가장 높은 로짓, 인덱스 1의 3.0만 남습니다. 확률이 1이므로 난수와 상관없이 선택됩니다: 탐욕적 디코딩입니다.
입력:
logits = [2.0, 1.0, 0.0]
temperature = 1.0
k = 2
random_value = 0.8
예상 출력:
1
설명
Top-2는 인덱스 0과 1(로짓 2와 1)을 남깁니다. 소프트맥스는 약 0.731과 0.269입니다. 누적 합은 인덱스 0 다음에 0.731(0.8을 넘지 않음), 인덱스 1 다음에 1이므로 인덱스 1이 선택됩니다.
참고 자료
-
예시 1 미실행입력:
logits = [1.0, 3.0, 2.0, 0.5] temperature = 1.0 k = 1 random_value = 0.99예상 출력:1내 출력 -
예시 2 미실행입력:
logits = [2.0, 1.0, 0.0] temperature = 1.0 k = 2 random_value = 0.8예상 출력:1내 출력
제출 시 4개의 숨겨진 테스트도 실행됩니다. 코드가 하나라도 실패하면 그 테스트를 볼 수 있습니다. 챌린지를 해결하면 모두 볼 수 있습니다.
Online Go Compiler
Write, compile, run, and debug Go code online in a full-featured browser IDE. Work with multiple files, save your workspace, and collaborate in real time - no setup required.
🐹 이 Go 온라인 실행기에 대해
CodeUtility Go Executor는 브라우저에서 바로 Go 코드를 작성하고 실행할 수 있게 해 줍니다 - 설치, 설정, 로컬 환경이 전혀 필요 없습니다. 보안 샌드박스 기반으로 실제 Go 컴파일러 버전 1.19, 1.20, 1.21을 지원합니다.
이 도구는 클라우드에서 실제 Go 프로그램을 컴파일하고 실행하여, 실제와 같은 Go 환경을 제공합니다. 짧은 스니펫을 테스트하고, 패키지를 실험하며, 고루틴과 채널을 활용한 Go의 강력한 동시성 기능을 탐구할 수 있습니다.
변수, 함수, 구조체, 슬라이스, 맵, 인터페이스, 에러 처리 등 Go의 핵심 개념을 학습하고 연습하기에 안성맞춤입니다 - 로컬에 어떤 도구도 설치할 필요가 없습니다.
처음 Go를 접하든, 백엔드 로직을 시험하든, 동시성이 어떻게 동작하는지 배우든, CodeUtility Go Executor는 깔끔하고 빠른 브라우저 기반 환경에서 Go 코드를 즉시 실행하는 방법을 제공합니다.
하나의 실행기에서 다중 파일 편집기, 격리된 실행 터미널, 런타임별 라이브러리, 영구 작업 공간, 공유 및 실시간 협업을 이용하세요.
이 실행기는 어떻게 사용하나요?
런타임을 선택하고 파일을 열거나 만든 다음 코드를 작성하고 실행을 선택하세요. 출력은 터미널에 표시되며, 로그인한 사용자는 작업 공간에 파일을 보관하고 라이브러리를 설치하며 공유를 통해 협업할 수 있습니다.
- 버전을 선택하고 현재 파일을 편집하거나 작업 공간의 다른 파일을 여세요.
- 코드를 실행하고 요청 시 터미널에 입력한 다음 저장된 실행 기록을 확인하세요.
- 작업에 둘 이상의 코드 조각이 필요하면 라이브러리, 작업 공간 도구, 공유 및 채팅을 사용하세요.
💡 위에서 바로 시도해 볼 수 있는 Go 기초와 예제
1. 변수와 상수 선언
var 또는 :=로 변수를 선언합니다. 상수는 const를 사용하세요.
package main
var x int = 10
const Pi = 3.14
func main() {
name := "Alice"
isActive := true
println(x, Pi, name, isActive)
}
2. 조건문 (if / switch)
Go는 간결한 문법의 if-else와 switch 문을 지원합니다.
x := 2
if x == 1 {
println("하나")
} else if x == 2 {
println("둘")
} else {
println("기타")
}
switch x {
case 1:
println("하나")
case 2:
println("둘")
default:
println("기타")
}
3. 반복문
Go에는 for 하나만 있지만, while처럼 사용할 수도 있습니다.
for i := 0; i < 3; i++ {
println(i)
}
n := 3
for n > 0 {
println(n)
n--
}
4. 배열
배열은 크기가 고정입니다. 동적 리스트에는 슬라이스를 사용하세요.
var nums = [3]int{10, 20, 30}
println(nums[1])
5. 슬라이스 다루기
슬라이스와 내장 append, len, copy, 슬라이싱 문법을 사용하세요.
fruits := []string{"apple", "banana"}
fruits = append(fruits, "cherry")
fruits = fruits[1:] // 슬라이스
println(len(fruits))
for _, fruit := range fruits {
println(fruit)
}
6. 콘솔 입출력
fmt.Print, fmt.Scan, fmt.Println을 사용하세요.
import "fmt"
var name string
fmt.Print("이름을 입력하세요: ")
fmt.Scan(&name)
fmt.Println("안녕하세요", name)
7. 함수
함수는 func로 선언하며, 여러 값을 반환할 수 있습니다.
func greet(name string) string {
return "안녕하세요, " + name
}
message := greet("Alice")
println(message)
8. 맵
맵은 키-값 저장소입니다. make()로 선언합니다.
ages := map[string]int{"Alice": 30}
ages["Bob"] = 25
println(ages["Alice"])
9. 에러 처리
Go는 예외 대신 다중 반환값으로 에러를 처리합니다.
import "errors"
func fail() error {
return errors.New("문제가 발생했습니다")
}
err := fail()
if err != nil {
println(err.Error())
}
10. 파일 입출력
파일 읽기/쓰기는 os와 io/ioutil 패키지를 사용하세요.
import (
"fmt"
"os"
"io/ioutil"
)
ioutil.WriteFile("file.txt", []byte("안녕, 파일"), 0644)
data, _ := ioutil.ReadFile("file.txt")
fmt.Println(string(data))
11. 문자열 다루기
strings 패키지로 문자열을 처리하세요.
import "strings"
text := " Hello World "
println(strings.TrimSpace(text))
println(strings.ToUpper(text))
println(strings.ReplaceAll(text, "Hello", "Hi"))
words := strings.Split(text, " ")
fmt.Println(words)
12. 구조체와 객체
구조체를 사용해 메서드를 가진 사용자 정의 타입을 만들 수 있습니다.
type Person struct {
Name string
}
func (p Person) Greet() string {
return "안녕하세요, 저는 " + p.Name
}
p := Person{Name: "Alice"}
println(p.Greet())
13. 참조(포인터)
Go는 *와 &를 이용한 포인터를 지원합니다.
x := 10
ptr := &x
*ptr = 20
println(x) // 20