[AI Paper] π Toolformer: Language Models Can Teach Themselves to Use Tools
π Toolformer: Language Models Can Teach Themselves to Use Tools
π λ©ν μ 보
- μ μ: Timo Schick, Jane Dwivedi-Yu, Roberto Dessi, Roberta Raileanu, Maria Lomeli, Luke Zettlemoyer, Nicola Cancedda, Thomas Scialom
- κΈ°κ΄: Meta AI Research, Universitat Pompeu Fabra (Roberto Dessi)
- λ°νμ²: NeurIPS 2023 (Oral Presentation)
- μ°λ: 2023 (arXiv: 2023λ 2μ 9μΌ)
- arXiv: https://arxiv.org/abs/2302.04761
- OpenReview: https://openreview.net/forum?id=Yacmpz84TH
- NeurIPS Proceedings: https://proceedings.neurips.cc/paper_files/paper/2023/hash/d842425e4bf79ba039352da0f658a906-Abstract-Conference.html
π― νμ€ μμ½
μκΈ°μ§λνμ΅(Self-supervised Learning) λ°©μμΌλ‘ μΈμ΄ λͺ¨λΈμ΄ μ€μ€λ‘ μΈλΆ API λꡬ(κ³μ°κΈ°, κ²μμμ§, QA μμ€ν λ±)λ₯Ό μΈμ , μ΄λ»κ² μ¬μ©ν μ§ νμ΅νμ¬, 6.7B λͺ¨λΈλ‘λ 175B GPT-3λ₯Ό λ₯κ°νλ μ±λ₯μ λ¬μ±ν μ΅μ΄μ λ²μ©μ λꡬ νμ΅ μ°κ΅¬.
π μ°κ΅¬ λ°°κ²½ λ° λκΈ°
κΈ°μ‘΄ λ¬Έμ μ
- LLMμ μμ€μ νκ³: λκ·λͺ¨ μΈμ΄ λͺ¨λΈ(LLM)μ few-shot νμ΅μμ λ°μ΄λ λ₯λ ₯μ 보μ΄μ§λ§, μμ€μ μΌλ‘ λ¨μν μ°μ μ°μ°μ΄λ μ¬μ€ κ²μ(factual lookup)μμλ ν¨μ¬ μκ³ λ¨μν νΉν λͺ¨λΈλ³΄λ€ μ±λ₯μ΄ λ¨μ΄μ§
- κΈ°μ‘΄ λꡬ μ¬μ© λ°©μμ νκ³:
- λλμ μΈκ° κ°λ (human supervision) νμ
- νΉμ νμ€ν¬μ λ§μΆ€νλ few-shot ν둬νν λ°©μ
- μ΄λ€ λꡬλ₯Ό μ¬μ©ν΄μΌ νλμ§ μ¬μ μ μκ³ μμ΄μΌ ν¨
- μ€μΌμΌ μμ‘΄μ±: κ³μ°μ΄λ λ²μ κ°μ μμ μ LLMμ΄ μννλ €λ©΄ λ§€μ° ν° κ·λͺ¨μ λͺ¨λΈμ΄ νμ
μ μ΄ μ°κ΅¬κ° νμνκ°
- λꡬ μ¬μ©μ ν΅ν΄ μμ λͺ¨λΈλ‘λ ν° λͺ¨λΈ μμ€μ μ±λ₯ λ¬μ± κ°λ₯
- μΈκ° κ°λ μμ΄ μμ¨μ μΌλ‘ λꡬ μ¬μ©λ² νμ΅
- λ€μν λꡬλ₯Ό μν©μ λ§κ² μ νμ μΌλ‘ νμ©νλ λ²μ©μ μ κ·Όλ² νμ
ν΅μ¬ μ€κ³ μμΉ (μ μ μΈμ©)
“λꡬ μ¬μ©μ λλμ μΈκ° μ£Όμ μμ΄ μκΈ°μ§λ λ°©μμΌλ‘ νμ΅λμ΄μΌ νλ€. μ΄λ λΉμ© λ¬Έμ λΏλ§ μλλΌ, μΈκ°μ΄ μ μ©νλ€κ³ μκ°νλ κ²κ³Ό λͺ¨λΈμ΄ μ μ©νλ€κ³ νλ¨νλ κ²μ΄ λ€λ₯Ό μ μκΈ° λλ¬Έμ΄λ€.”
“LMμ μΌλ°μ±μ μμ§ μμμΌ νλ©°, μΈμ μ΄λ€ λꡬλ₯Ό μ΄λ»κ² μ¬μ©ν μ§ μ€μ€λ‘ κ²°μ ν μ μμ΄μΌ νλ€.”
π‘ ν΅μ¬ μμ΄λμ΄
μκΈ°μ§λ νμ΅ κΈ°λ° λꡬ μ¬μ©
Toolformerμ ν΅μ¬μ μΈμ΄ λͺ¨λΈμ΄ μ€μ€λ‘ API νΈμΆμ μμ±νκ³ , μ΄ μ€ μ μ©ν κ²λ§ νν°λ§νμ¬ νμ΅νλ κ²μ΄λ€.
μ£Όμ κ°λ
1. API νΈμΆ νν (API Call Representation)
[API_name(input) β output]
- νΉμ ν ν°
[μ]λ‘ API νΈμΆμ μμκ³Ό λμ νμ - API νΈμΆμ νν νν: (API μ΄λ¦, μ λ ₯ νλΌλ―Έν°)
- μ λ ₯κ³Ό μΆλ ₯ λͺ¨λ ν μ€νΈ μνμ€λ‘ νν
- μ€μ ꡬνμμλ
[,],->λ₯Ό κ°κ°<API>,</API>,βλ‘ μ¬μ©
μμ:
"From this, we have 10 - 5 minutes = [Calculator(10 - 5) β 5] 5 minutes."
"The capital of France is [QA(What is the capital of France?) β Paris] Paris."
2. 5κ°μ§ ν΅ν© λꡬ
| λꡬ | μ€λͺ | μ©λ | μ¬μ© λΉμ¨ (LAMA) |
|---|---|---|---|
| Calculator | μν μ°μ° μν | μ°μ κ³μ° | 98% (Math) |
| Q&A System | Atlas κΈ°λ° μ§μμλ΅ | μ¬μ€ νμΈ | 98.1% (LAMA) |
| Wikipedia Search | μν€νΌλμ κ²μ | μ 보 κ²μ | QA νμ€ν¬ |
| Machine Translation | κΈ°κ³ λ²μ | λ€κ΅μ΄ μ²λ¦¬ | MLQA |
| Calendar | λ μ§/μκ° μ 보 | μκ° κ΄λ ¨ μ§μ | TempLAMA |
3. μ μ©μ± κΈ°λ° νν°λ§ (Fitness Score) β ν΅μ¬ κΈ°μ¬
- API νΈμΆμ΄ λ―Έλ ν ν° μμΈ‘μ λμμ΄ λλμ§ νκ°
- Perplexity(νΌλλ) κ°μλ₯Ό κΈ°μ€μΌλ‘ μ μ©ν API νΈμΆλ§ μ λ³
- λ Όλ¬Έμ κ°μ₯ μ€μν κΈ°μ¬: λͺ¨λΈμκ² μ€μ λ‘ λμμ΄ λλ API νΈμΆλ§ νμ΅ λ°μ΄ν°μ ν¬ν¨
ποΈ μν€ν μ² / λ°©λ²λ‘
κΈ°λ³Έ λͺ¨λΈ λ° λ°μ΄ν°
- Base Model: GPT-J (6.7B parameters) – EleutherAI
- νμ΅ λ°μ΄ν°: CCNet (Common Crawlμ μ μ λ λ²μ )μ λΆλΆμ§ν©
μ 체 νμ΄νλΌμΈ (4λ¨κ³)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Toolformer Training Pipeline β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Step 1: Sampling β
β βββββββββββββββ ββββββββββββββββ βββββββββββββββββββ β
β β CCNet β -> β Few-shot β -> β Candidate API β β
β β Dataset C β β Prompting β β Calls Generated β β
β βββββββββββββββ ββββββββββββββββ βββββββββββββββββββ β
β β
β Step 2: Executing β
β βββββββββββββββββββ ββββββββββββββββββββββββββββββββββ β
β β Candidate APIs β -> β Execute APIs & Get Results β β
β βββββββββββββββββββ ββββββββββββββββββββββββββββββββββ β
β β
β Step 3: Filtering β
β βββββββββββββββββββ ββββββββββββββββββββββββββββββββββ β
β β API + Results β -> β Filter by Loss Reduction β β
β β β β (Lβ» - LβΊ β₯ Ο_f) β β
β βββββββββββββββββββ ββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββ β
β β Augmented β β
β β Dataset C* β β
β ββββββββββββββββββ β
β β β
β Step 4: Fine-tuning β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β GPT-J Fine-tuned on C* β Toolformer β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Step 1: API νΈμΆ μνλ§ (Sampling)
κ³Όμ
- CCNet λ°μ΄ν°μ μμ ν μ€νΈ μΆμΆ
- κ° λκ΅¬λ³ ν΄λ¦¬μ€ν±μΌλ‘ κ΄λ ¨ ν μ€νΈ νν°λ§
- Few-shot ν둬νν μΌλ‘ API νΈμΆ ν보 μμ±
μμΉ μνλ§ λ©μ»€λμ¦
- κ° μμΉμμ API νΈμΆ μμ ν ν°μ νλ₯ κ³μ°
- μκ³κ°(
Ο_s) μ΄μμΈ μμΉλ€μ νλ³΄λ‘ μ μ - κ° μμΉμμ μ΅λ mκ°μ API νΈμΆ μμ±
ν΄λ¦¬μ€ν± μμ (Calculator)
# Calculator λκ΅¬μ© ν
μ€νΈ μ λ³ μ‘°κ±΄
def is_calculator_relevant(text, window_size=100):
# 100 ν ν° μλμ° λ΄ 3κ° μ΄μμ μ«μ ν¬ν¨
# AND "=", "equals", "equal to", "total of", "average of" λ± ν¬ν¨
return (count_numbers(text, window_size) >= 3 and
contains_math_keywords(text))
Few-shot ν둬ννΈ μμ
Input: The population of Tokyo is approximately 14 million people.
Output: The population of Tokyo is approximately [QA(What is the population of Tokyo?) β 14 million] 14 million people.
Input: Calculate the total: 15 + 27 = 42
Output: Calculate the total: 15 + 27 = [Calculator(15 + 27) β 42] 42
Step 2: API μ€ν (Executing)
μμ±λ λͺ¨λ API νΈμΆμ μ€μ λ‘ μ€ννμ¬ κ²°κ³Ό νλ
def execute_api_call(api_name, input_params):
if api_name == "Calculator":
return eval_math_expression(input_params)
elif api_name == "QA":
return qa_system.answer(input_params) # Atlas κΈ°λ°
elif api_name == "WikiSearch":
return wikipedia.search(input_params)
elif api_name == "MT":
return translation_system.translate(input_params)
elif api_name == "Calendar":
return get_current_date()
Step 3: νν°λ§ (Filtering) β ν΅μ¬ κΈ°μ¬
ν΅μ¬ μμ: Loss κΈ°λ° νν°λ§
L^+ = \sum_{j=i}^{n} w_j \cdot \log P(x_j | x_1, \ldots, x_{i-1}, c, r) L^- = \min(L^-_{\text{empty}}, L^-_{\text{no\_result}})νν°λ§ 쑰건: L^- - L^+ \geq \tau_f
μ¬κΈ°μ:
– L+: API νΈμΆκ³Ό κ²°κ³Όλ₯Ό ν¬ν¨νμ λμ μμ€
– L-_empty: API νΈμΆ μμ λμ μμ€
– L-_no_result: API νΈμΆμ μμ§λ§ κ²°κ³Όκ° μμ λμ μμ€
– Ο_f: νν°λ§ μκ³κ°
– w_j: μμΉ κΈ°λ° κ°μ€μΉ (API νΈμΆ μμΉμ κ°κΉμΈμλ‘ λμ)
μ§κ΄μ ν΄μ
“λΉ λ¬Έμμ΄μ΄λ API κ²°κ³Ό μμ΄λ λ€μ λ¨μ΄ μμΈ‘μ΄ κ°λ₯νλ€λ©΄, κ·Έ API νΈμΆμ λΆνμνλ€. μ€μ§ λͺ¨λΈμκ² μ€μ λ‘ λμμ΄ λλ API νΈμΆλ§ νμ΅ λ°μ΄ν°μ ν¬ν¨νλ€.”
Pseudo Code
def filter_api_calls(text, api_call, result, threshold=Ο_f):
# L+: API νΈμΆ + κ²°κ³Ό ν¬ν¨ μ μμ€
L_plus = compute_loss(text_with_api_and_result)
# L-_empty: API νΈμΆ μμ λ μμ€
L_minus_empty = compute_loss(text_without_api)
# L-_no_result: API νΈμΆλ§ μκ³ κ²°κ³Ό μμ λ μμ€
L_minus_no_result = compute_loss(text_with_api_no_result)
# L-λ λ μ€ μ΅μκ°
L_minus = min(L_minus_empty, L_minus_no_result)
# νν°λ§ 쑰건: μμ€ κ°μκ° μκ³κ° μ΄μμ΄λ©΄ μ μ§
return (L_minus - L_plus) >= threshold
Step 4: νμΈνλ (Fine-tuning)
νμ΅ μ€μ
| νμ΄νΌνλΌλ―Έν° | κ° |
|---|---|
| λ² μ΄μ€ λͺ¨λΈ | GPT-J (6.7B) |
| λ°°μΉ ν¬κΈ° | 128 (effective) |
| νμ΅λ₯ | 1e-5 |
| μμ | μ²μ 10% linear warmup |
| μ΅λ μνμ€ κΈΈμ΄ | 1,024 |
| APIλΉ μ΅λ μμ μ | 25,000 |
| λ°μ΄ν°μ | CCNet λΆλΆμ§ν© (API νΈμΆλ‘ augmented) |
μΆλ‘ (Inference) λ°©μ
- API ν ν°μ΄ μμ 10κ° νλ₯ ν ν°μ ν¬ν¨λλ©΄ API νΈμΆ μμ
- μ λ ₯λΉ μ΅λ 1κ°μ API νΈμΆλ‘ μ ν
- Zero-shot μ€μ , Greedy decoding μ¬μ©
π μ€ν λ° κ²°κ³Ό
νκ° λ°μ΄ν°μ
| μΉ΄ν κ³ λ¦¬ | λ°μ΄ν°μ | μ€λͺ |
|---|---|---|
| LAMA | SQuAD, GoogleRE, T-REx | μ¬μ€ μμ± νμ€ν¬ |
| Math | ASDiv, SVAMP, MAWPS | μν λ¬Έμ νμ΄ |
| QA | Web Questions, Natural Questions, TriviaQA | μ§μμλ΅ |
| Language Modeling | WikiText, CCNet subset | μΈμ΄ λͺ¨λΈλ§ |
| Multilingual QA | MLQA | λ€κ΅μ΄ μ§μμλ΅ |
| Temporal | TempLAMA | μκ° κ΄λ ¨ μΆλ‘ |
λΉκ΅ λͺ¨λΈ ꡬμ±
| λͺ¨λΈ | μ€λͺ |
|---|---|
| GPT-J | κΈ°λ³Έ GPT-J, λ―ΈμΈμ‘°μ μμ |
| GPT-J + CC | CCNetμΌλ‘ λ―ΈμΈμ‘°μ , API νΈμΆ μμ |
| Toolformer | CCNet + API νΈμΆλ‘ λ―ΈμΈμ‘°μ |
| Toolformer (disabled) | Toolformerμ λμΌ, μΆλ‘ μ API λΉνμ±ν |
μ£Όμ κ²°κ³Ό
LAMA λ²€μΉλ§ν¬ μ±λ₯
- Toolformerλ QA λꡬλ₯Ό 98.1% μΌμ΄μ€μμ μ¬μ©
- 0.7%λ§ λ€λ₯Έ λꡬ μ¬μ©, 1.2%λ λꡬ λ―Έμ¬μ©
- λμΌ ν¬κΈ°μ λͺ¨λ λ² μ΄μ€λΌμΈμ λͺ νν λ₯κ°
- GPT-3 (175B)μ κ²½μμ μΈ μ±λ₯ λ¬μ±
μν λ²€μΉλ§ν¬ μ±λ₯ (ASDiv λ±)
- Calculator λꡬλ₯Ό 98%μ μνμμ μ¬μ©
- OPT (66B)μ GPT-3 (175B)λ₯Ό ν° μ°¨μ΄λ‘ λ₯κ°
- λ² μ΄μ€λΌμΈ λλΉ κ°κ° 11.7, 5.2, 18.6 ν¬μΈνΈ ν₯μ
Question Answering (WebQ, NQ, TriviaQA)
- Wikipedia Search APIλ₯Ό μ¬μ©ν΄ 99.3% μ νλ λ¬μ±
- GPT-J κΈ°λ° λͺ¨λΈλ€ λλΉ μ°μ
- λ¨, GPT-3 (175B)μλ λ―Έλ¬ (κ²μ μμ§μ λ¨μμ±κ³Ό μνΈμμ© λΆκ° λλ¬Έ)
λͺ¨λΈ ν¬κΈ°λ³ λꡬ μ¬μ© λ₯λ ₯
| λͺ¨λΈ ν¬κΈ° | λꡬ μ¬μ© ν¨κ³Ό |
|---|---|
| 124M | ν¨κ³Ό μμ |
| 355M | λ―Έλ―Έν ν¨κ³Ό |
| 775M | λꡬ μ¬μ© λ₯λ ₯ emergence |
| 1.6B+ | λͺ νν μ±λ₯ ν₯μ |
ν΅μ¬ λ°κ²¬: λꡬ μ¬μ© λ₯λ ₯μ μ½ 775M νλΌλ―Έν°μμ μΆν(emerge)ν¨
μΈμ΄ λͺ¨λΈλ§ μ±λ₯ μ μ§
- WikiTextμ CCNet subsetμμ perplexity νκ°
- Toolformerκ° κΈ°μ‘΄ μΈμ΄ λͺ¨λΈλ§ λ₯λ ₯μ μμμν€μ§ μμ
πͺ κ°μ λ° κΈ°μ¬
1. μκΈ°μ§λ νμ΅ (Self-Supervised Learning)
- μΈκ° κ°λ μ΅μν: κ° APIλΉ μμμ demonstrationλ§ νμ
- μλ λ°μ΄ν° μμ±: λͺ¨λΈμ΄ μ€μ€λ‘ νμ΅ λ°μ΄ν° μμ± λ° νν°λ§
2. λ²μ©μ± (Generalizability)
- λ¨μΌ λͺ¨λΈμ΄ λ€μν λꡬλ₯Ό μν©μ λ§κ² μ ν
- νΉμ νμ€ν¬μ μ’ μλμ§ μλ λ²μ©μ μ κ·Ό
3. ν¨μ¨μ± (Efficiency)
- 6.7B λͺ¨λΈλ‘ 175B λͺ¨λΈ μ±λ₯ λ¬μ±
- λꡬ μ¬μ©μ ν΅ν compute-performance trade-off κ°μ
4. νμ₯μ± (Extensibility)
- μλ‘μ΄ λꡬ μΆκ°κ° μ©μ΄
- ν μ€νΈ κΈ°λ° API μΈν°νμ΄μ€λ‘ λ€μν λꡬ ν΅ν© κ°λ₯
5. μΈμ΄ λ₯λ ₯ 보쑴
- λꡬ μ¬μ© νμ΅ νμλ κΈ°μ‘΄ μΈμ΄ λͺ¨λΈλ§ λ₯λ ₯ μ μ§
6. λ°©λ²λ‘ μ νμ (Fitness Score)
- λ Όλ¬Έμ κ°μ₯ μ€μν κΈ°μ¬: μμ€ κ°μ κΈ°λ° API νΈμΆ νν°λ§
- λͺ¨λΈ κ΄μ μμ μ μ©ν λꡬ μ¬μ© ν¨ν΄λ§ νμ΅
β οΈ νκ³μ λ° ν₯ν μ°κ΅¬
μ£Όμ νκ³μ
1. λꡬ 체μ΄λ λΆκ° (No Tool Chaining)
λΆκ°λ₯ν μμ:
[Search(query)] β result β [Calculator(result)]
- API νΈμΆμ΄ λ 립μ μΌλ‘ μμ±λμ΄ μ²΄μ΄λ λΆκ°
- ν λꡬμ μΆλ ₯μ λ€λ₯Έ λꡬμ μ λ ₯μΌλ‘ μ¬μ©ν μ μμ
2. μΈν°λν°λΈ λͺ¨λ λΆμ¬
- κ²μ κ²°κ³Ό λΈλΌμ°μ§ λΆκ°
- 쿼리 μμ /κ°μ λΆκ°
- μ¬λ¬ κ²μ κ²°κ³Ό μ€ μ ν λΆκ°
3. μ λ ₯ λ―Όκ°μ± (Input Sensitivity)
- μ νν 문ꡬ(wording)μ λ°λΌ λꡬ μ¬μ© κ²°μ μ΄ λ¬λΌμ§ μ μμ
4. λΉμ© μΈμ λΆμ¬
- API νΈμΆμ κ³μ° λΉμ©μ κ³ λ €νμ§ μμ
- λΉμ© λλΉ ν¨μ© μ΅μ ν λ―Έμ§μ
5. λͺ¨λΈ ν¬κΈ° μ μ½
- μ΅μ 775M νλΌλ―Έν° μ΄μμμλ§ ν¨κ³Όμ
- λ μμ λͺ¨λΈμμλ λꡬ μ¬μ© λ₯λ ₯ λΆμ¬
6. μΌλ°ν νκ³
- νμ΅ μ μ ν λꡬμ κ΅νλ μ¬μ© κ²½ν₯
- μλ‘μ΄ λꡬλ‘μ μΌλ°ν λ―Έκ²μ¦
7. μΈμ΄λ³ μ±λ₯ μ°¨μ΄
- CCNet λ―ΈμΈμ‘°μ μ΄ μΌλΆ μΈμ΄μμ μ±λ₯ μ ν μ λ°
ν₯ν μ°κ΅¬ λ°©ν₯ (μ μ μΈν°λ·° κΈ°λ°)
1. λ€λ¨κ³ λꡬ νΈμΆ (Multi-step Tool Calling)
“λ€μ λͺ λ°±ν λ¨κ³λ μ¬λ¬ λꡬμ μ¬λ¬ λ¨κ³μ νΈμΆμ κ°λ κ²μ΄λ€.” – Thomas Scialom
2. κΈ΄ λ¬Έλ§₯ μ²λ¦¬λ₯Ό μν λꡬ νμ©
- Transformerμ 컨ν μ€νΈ μλμ° νκ³(4K-8K ν ν°)λ₯Ό λκ΅¬λ‘ κ·Ήλ³΅
3. λͺ¨λΈ μ체λ₯Ό λκ΅¬λ‘ μ¬μ© (Self-Reasoning)
“λͺ¨λΈ μ체λ₯Ό λκ΅¬λ‘ μΌμ μΆλ‘ λͺ¨λμμ μκΈ° μμ μ νΈμΆνλ κ²μ κ΄μ¬μ΄ μλ€.” – Timo Schick
4. μΈν°λν°λΈ λꡬ μ¬μ©
- κ²μ κ²°κ³Ό νμ λ° μΏΌλ¦¬ κ°μ μ§μ
π κ΄λ ¨ λ Όλ¬Έ
μ§μ κ΄λ ¨ μ°κ΅¬ (μ ν)
| λ Όλ¬Έ | μ°λ | νΉμ§ |
|---|---|---|
| TALM (Parisi et al.) | 2022 | Toolformerμ κ°μ₯ μ μ¬, μκΈ°μ§λ λͺ©μ ν¨μ μ¬μ©, λ€μ΄μ€νΈλ¦Ό λ―ΈμΈμ‘°μ μ€μ νꡬ |
| WebGPT (Nakano et al.) | 2021 | μΉ λΈλΌμ°μ§μ ν΅ν μ§μμλ΅ |
| LaMDA (Thoppilan et al.) | 2022 | λνν AIμ λꡬ μ¬μ© |
| PAL (Gao et al.) | 2022 | Program-Aided Language Models |
νμ μ°κ΅¬ λ° κ΄λ ¨ μ°κ΅¬
| λ Όλ¬Έ | μ°λ | νΉμ§ |
|---|---|---|
| ReAct | 2023 (ICLR) | Thought-Act-Observe μ¬μ΄ν΄, Zero-shot ν둬ννΈ κΈ°λ° |
| Gorilla | 2024 (NeurIPS) | 1,600+ API νΈμΆ μ§μ, LLaMA κΈ°λ° λ―ΈμΈμ‘°μ , ν 루μλ€μ΄μ κ°μ |
| ToolLLM/ToolBench (Qin et al.) | 2023 | 16,000+ API μ€μΌμΌμ , DFSDT μΆλ‘ μ λ΅ |
| HuggingGPT (Shen et al.) | 2023 | HuggingFace λͺ¨λΈ μ€μΌμ€νΈλ μ΄μ |
| Chameleon (Lu et al.) | 2023 | Plug-and-Play λꡬ μ‘°ν© |
| ToolkenGPT | 2023 | λꡬλ₯Ό ν ν°μΌλ‘ νννλ μ κ·Ό |
| ART | 2023 | μλ λ€λ¨κ³ μΆλ‘ λ° λꡬ μ¬μ© |
λΆλ₯ 체κ³
| μΉ΄ν κ³ λ¦¬ | λ Όλ¬Έ |
|---|---|
| Fine-tuning κΈ°λ° | Toolformer, TALM, Gorilla, ToolRL, ToolkenGPT |
| Tuning-free (Zero-shot) | ReAct, ToolAlpaca |
| RAG μ¦κ° | Gorilla (retrieval-augmented), ToolLLM |
π» μ€λ¬΄ μ μ© ν¬μΈνΈ
ꡬν μ κ³ λ €μ¬ν
1. API νΈμΆ νμ μ μ
# API νΈμΆ ν ν° μ μ
SPECIAL_TOKENS = {
"api_start": "[",
"api_end": "]",
"result_sep": "β"
}
# μμ ν¬λ§·
def format_api_call(api_name, input_text, result=None):
if result:
return f"[{api_name}({input_text}) β {result}]"
return f"[{api_name}({input_text})]"
2. μλ‘μ΄ λꡬ μΆκ° κ°μ΄λ
- Few-shot Prompt μμ±: ν΄λΉ APIμ μ¬μ© μμ 5-10κ° μμ±
- λ°μ΄ν° μνλ§: μ½νΌμ€μμ API νΈμΆ μ½μ μμΉ μνλ§
- νν°λ§: μμ€ κ°μ κΈ°μ€μΌλ‘ μ μ©ν API νΈμΆλ§ μ λ³
- λ―ΈμΈμ‘°μ : μ λ³λ λ°μ΄ν°λ‘ λͺ¨λΈ νμ΅
3. νν°λ§ μκ³κ° μ€μ
# λ
Όλ¬Έμμ μ μν κΈ°λ³Έκ°
FILTER_THRESHOLD = 1.0 # Ο_f
def should_keep_api_call(L_minus, L_plus, threshold=FILTER_THRESHOLD):
return (L_minus - L_plus) >= threshold
4. λκ΅¬λ³ ν΄λ¦¬μ€ν± ꡬν
TOOL_HEURISTICS = {
"Calculator": {
"min_numbers": 3,
"window_size": 100,
"keywords": ["=", "equals", "equal to", "total of", "average of"]
},
"QA": {
"question_words": ["who", "what", "when", "where", "why", "how"]
},
# ... κΈ°ν λꡬ
}
5. μΆλ‘ μ API νΈμΆ μ²λ¦¬
def inference_with_tools(model, prompt, tools):
generated = model.generate(prompt)
# API νΈμΆ ν ν° κ°μ§ (μμ 10κ° νλ₯ ν ν°μ ν¬ν¨ μ)
if "[" in generated:
api_call = extract_api_call(generated)
result = execute_tool(api_call, tools)
# κ²°κ³Ό μ½μ
ν κ³μ μμ±
generated = generated.replace(
f"[{api_call}]",
f"[{api_call} β {result}]"
)
generated += model.continue_generation(generated)
return generated
μ€νμμ€ κ΅¬ν체
- lucidrains/toolformer-pytorch: https://github.com/lucidrains/toolformer-pytorch
- conceptofmind/toolformer: https://github.com/conceptofmind/toolformer
νλ‘λμ μ μ© μ μ£Όμμ
- μ΅μ λͺ¨λΈ ν¬κΈ°: 775M νλΌλ―Έν° μ΄μ νμ (λꡬ μ¬μ© λ₯λ ₯ λ°ν μκ³μ )
- API λ μ΄ν΄μ: μΈλΆ API νΈμΆλ‘ μΈν μλ΅ μ§μ° κ³ λ €
- μλ¬ νΈλ€λ§: API μ€ν¨ μ fallback μ λ΅ νμ
- λΉμ© κ΄λ¦¬: API νΈμΆ νμ λ° λΉμ© λͺ¨λν°λ§
- μΊμ±: λμΌ μΏΌλ¦¬μ λν κ²°κ³Ό μΊμ±μΌλ‘ ν¨μ¨μ± ν₯μ
- ν ν° μ€κ³: κΈ°μ‘΄ ν ν¬λμ΄μ μ μΆ©λνμ§ μλ νΉμ ν ν° μ μ
νλ μμ΄μ νΈ νλ μμν¬μμ μ°κ²°
- LangChain: ReAct ν¨ν΄ ꡬν, λꡬ ν΅ν©
- MetaGPT: λ€μ€ μμ΄μ νΈ λꡬ μ¬μ©
- Toolformerμ μμ΄λμ΄κ° νλ LLM μμ΄μ νΈμ Function Calling κΈ°μ΄κ° λ¨
π·οΈ Tags
#AIAgent #ToolUse #SelfSupervised #LLM #MetaAI #NeurIPS2023 #APIIntegration #LanguageModel #GPT-J #ZeroShot #ToolLearning #Toolformer #FunctionCalling #Calculator #Search #QA #FineTuning #DataAugmentation #LossFiltering
π References
- Schick, T., et al. (2023). Toolformer: Language Models Can Teach Themselves to Use Tools. NeurIPS 2023.
- arXiv: https://arxiv.org/abs/2302.04761
- OpenReview: https://openreview.net/forum?id=Yacmpz84TH
- Meta AI Publication: https://ai.meta.com/research/publications/toolformer-language-models-can-teach-themselves-to-use-tools/