OSSCA: LLM 쑰사, Continue 뢄석 및 정리

2024. 10. 24. 18:04Β·What I Learn

3~4μ£Όμ°¨κ°„ μ§„ν–‰λλ˜ νŒ€ 과제λ₯Ό λ¬Άμ–΄μ„œ ν•˜λ‚˜μ˜ λ¬Έμ„œλ‘œ μ •λ¦¬ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 

1. AI Coding Assitant 도ꡬ 쑰사 및 비ꡐ 뢄석

  • Amazon CodeWhisperer
  • Code
  • Cursor
  • Tablin
  • Codeium
  • GitHub Copilot
  • replit GhostWriter

1-1. Amazon CodeWhisperer

AWS ν™˜κ²½μ—μ„œμ˜ κ°œλ°œμ„ μ΅œμ ν™”ν•œλ‹€λŠ” νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€.

μ£Όμš” νŠΉμ§• : μžλ™ μ™„μ„±, λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ 지원, 주석 기반 μ½”λ“œ 생성, AWS μ„œλΉ„μŠ€μ™€μ˜ 톡합

1-2. Codex

ν˜„μž¬ Github Copilot, TabNineλ“±κ³Ό 같은 AI coding assistant도 Third-party extensionsλ‘œμ„œ Codexλ₯Ό μ‚¬μš©(leverage)ν•˜κ³  μžˆλ‹€.

μ£Όμš” νŠΉμ§• : Coding assistant에 νŠΉν™”λœ λͺ¨λΈμ„ μ‚¬μš©, 12개 μ΄μƒμ˜ μ–Έμ–΄, μžμ—°μ–΄ 처리

1-3. Cursor

CursorλŠ” κΈ°μ‘΄ ν”ŒλŸ¬κ·ΈμΈ 방식이 μ•„λ‹Œ VS Codeλ₯Ό 기반으둜 λ§Œλ“€μ–΄μ§„ νŽΈμ§‘κΈ°μ΄λ‹€.

μ£Όμš” νŠΉμ§• : μžλ™ μ™„μ„±, μ½”λ“œ 생성, νŽΈμ§‘ 및 λ¦¬νŒ©ν† λ§, Chat, μ‹€μ‹œκ°„ 였λ₯˜ 감지 및 μˆ˜μ •, λ©€ν‹° 파일 뢄석

1-4. Tabnine

Tabnine은 μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” μ½”λ“œλ₯Ό κ³΅κ°œν•˜μ§€ μ•Šκ³  μ •ν•΄μ§„ λ²”μœ„ μ•ˆμ—μ„œ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ„ 쉽고 λΉ λ₯΄κ²Œ ν•  수 μžˆλ‹€.

제λͺ© μ£Όμš” κΈ°λŠ₯ 가격
PRO 졜고의 AIλͺ¨λΈ 적용, AIμ±„νŒ… μ—μ΄μ „νŠΈ, λ³΄μ•ˆμ·¨μ•½μ  필터링, κ°œμΈμ •λ³΄λ³΄ν˜Έ, μ˜μ—… μ‹œκ°„ 지원 μ›” $12
Enterprise SaaS λ˜λŠ” On-premiseμ—μ„œ ꡬ좕 κ°€λŠ₯, κ°œμΈν™” AI μ±„νŒ… μ—μ΄μ „νŠΈ, Confluence 톡합, μ˜μ—…μ‹œκ°„ 지원 및 κ΄€λ ¨ ꡐ윑 μ›” $39
Basic 무료, AIμ±„νŒ…(속도 μ œν•œ) μ›” $0

1-5. Codeium

μ „λ°˜μ μœΌλ‘œ Github Copilot와 μœ μ‚¬ν•œ κΈ°λŠ₯듀을 μ œκ³΅ν•˜λ©΄μ„œ 무료 ν‹°μ–΄λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

μ£Όμš” νŠΉμ§• : μžλ™ μ™„μ„±, μžμ—°μ–΄λ‘œ Command μž‘μ„±, Chat, 우클릭으둜 μ˜΅μ…˜ μ ‘κ·Ό κ°€λŠ₯

1-6. GitHub Copilot

μ£Όμš” νŠΉμ§• : μžλ™ μ™„μ„±, Chat, Pull request μš”μ•½

1-7. replit GhostWriter

Replit ν”Œλž«νΌμ—μ„œλ§Œ μ‚¬μš©ν•  수 있으며, 둜컬 개발 ν™˜κ²½μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λŠ” λŒ€μ‹  νŒ€μ›κ³Ό μ‹€μ‹œκ°„ ν˜‘μ—…μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

μ£Όμš” νŠΉμ§• : μžλ™ μ™„μ„±, νŽΈμ§‘ 및 λ¦¬νŒ©ν† λ§, 디버깅, μ‹€μ‹œκ°„ ν˜‘μ—…

 

2. Continue의 특μž₯점

ContinueλŠ” VSCode, JetBrains λ“±μ˜ 개발 ν™˜κ²½κ³Ό ν†΅ν•©λ˜μ–΄ μ‚¬μš©μžμ˜ μ½”λ”© μž‘μ—…μ„ μ§€μ›ν•˜λŠ” 도ꡬ이닀.
GitHub Copilotκ³Ό μœ μ‚¬ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λ©΄μ„œλ„, μ™„μ „ν•œ μ˜€ν”ˆμ†ŒμŠ€ ν˜•νƒœλ‘œ μ‚¬μš©μžκ°€ AI λͺ¨λΈμ„ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆλŠ” 점이 νŠΉμ§•μ΄λ‹€.

 

μ£Όμš” νŠΉμ§• : λ¬Έλ§₯ 인식 λŒ€ν™”, Chat, Command, Customize code, μžλ™ μ™„μ„±
μž₯점 : μžλ™ 데이터 μˆ˜μ§‘, μ˜€ν”ˆμ†ŒμŠ€, 무료, λͺ¨λΈ μ„ νƒμ˜ μœ μ—°μ„±, μ»¨ν…μŠ€νŠΈ λ‹€μ–‘μ„±, ν™•μž₯μ„±

[!TIP] 도ꡬ 선택 κ°€μ΄λ“œλΌμΈ 및 μΆ”μ²œ

  1. ꡐ윑 및 기술 지원 ν•„μš”μ„±
    • νšŒμ‚¬μ—μ„œ λ„μž…ν•˜κ³ μž ν•  λ•Œμ—λŠ” μ½”λ“œ μ–΄μ‹œμŠ€ν„΄νŠΈ μ‚¬μš© 방법에 λŒ€ν•œ ꡐ윑 및 이슈 지원을 받을 수 μžˆλŠ” μ½”λ“œ μ–΄μ‹œμŠ€ν„΄νŠΈλ₯Ό 선택해야 ν•œλ‹€.

   2. λ³΄μ•ˆ μˆ˜μ€€ κ²€ν† 

  •  κ°œμΈμ΄ μ·¨λ―Έ λ“±μœΌλ‘œ μ‚¬μš© μ‹œμ—λŠ” λ³΄μ•ˆ μ΄μŠˆκ°€ μ—†μ–΄ 자유둭게 선택이 κ°€λŠ₯ν•˜κ² μ§€λ§Œ κΈ°μ—…μ—μ„œ λ„μž…ν•˜λŠ” 경우 μ½”λ“œμ˜ μ™ΈλΆ€ 유좜 μš°λ €κ°€ μžˆμœΌλ―€λ‘œ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…λ¦½μ μœΌλ‘œ ꡬ성이 κ°€λŠ₯ν•΄μ•Ό ν•˜κ³ , νšŒμ‚¬μ—μ„œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ €μž₯ 및 곡유 λ˜κ±°λ‚˜ ν•™μŠ΅μ— μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ–΄μ‹œμŠ€ν„΄νŠΈλ₯Ό 선택해야 ν•œλ‹€.

 

3. Continue μ„€μΉ˜/μ„€μ •

VSCode/JetBrains 쀑 μ‚¬μš©ν•˜λŠ” IDEμ—μ„œ 각 μ΅μŠ€ν…μ…˜/ν”ŒλŸ¬κ·ΈμΈ νƒ­μ—μ„œ μ„€μΉ˜κ°€ κ°€λŠ₯ν•˜λ‹€.

3-1. Continueμ—μ„œ μ‚¬μš©ν•˜λŠ” Model μœ ν˜•/연동 μœ ν˜•

  • Autocomplete Model
  • Chat Model
  • Embeddings Model
  • Reranking Model

3-1-1. Autocomplete Model

쀑간 μ±„μš°κΈ°-FIM-κΈ°λ²•μœΌλ‘œ ν›ˆλ ¨λœ νŠΉμˆ˜ν•œ μ–Έμ–΄ λͺ¨λΈ. μ½”λ“œ 파일의 μ‹œμž‘κ³Ό 끝 뢀뢄이 μ£Όμ–΄μ‘Œμ„ λ•Œ 쀑간에 λ“€μ–΄κ°ˆ λ‚΄μš©μ„ μ˜ˆμΈ‘ν•˜λ„λ‘ μ„€κ³„λœ 덕뢄에 μƒλŒ€μ μœΌλ‘œ μž‘μ€ 규λͺ¨-3B λ§€κ°œλ³€μˆ˜-의 λͺ¨λΈλ‘œλ„ μš°μˆ˜ν•œ μ„±λŠ₯을 λ°œνœ˜ν•  수 μžˆλ‹€. (반면, 일반적인 λŒ€ν™”ν˜• λͺ¨λΈμ€ 규λͺ¨κ°€ 더 크더라도 이 νŠΉμ • μž‘μ—…μ—μ„œλŠ” μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.)

Continueμ—μ„œλŠ” 주둜 μ½”λ“œ μž‘μ„± μ‹œ μ‹€μ‹œκ°„μœΌλ‘œ 인라인 μ œμ•ˆμ„ μ œκ³΅ν•˜λŠ” 데 ν™œμš©λœλ‹€.

[!TIP] μΆ”μ²œ λͺ¨λΈ

Continueμ—μ„œλŠ” μžλ™ μ™„μ„± λͺ¨λΈλ‘œ Mistral의 Codestral λͺ¨λΈμ„ μΆ”μ²œν•˜λ©°, 둜컬 λͺ¨λΈλ‘œλŠ” Ollama Provider와 ν•¨κ»˜ Starcoder2-3B λͺ¨λΈμ„ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

3-1-2. Chat model

  • λŒ€ν™” ν˜•μ‹μœΌλ‘œ μ‘λ‹΅ν•˜λ„λ‘ ν•™μŠ΅λœ LLM.
  • 일반적인 μ§ˆλ¬Έμ— λ‹΅λ³€ν•˜κ³  λ³΅μž‘ν•œ μ½”λ“œλ₯Ό 생성할 수 μžˆμ–΄μ•Ό ν•΄μ„œ 졜고 μ„±λŠ₯의 μ±„νŒ… λͺ¨λΈμ€ 보톡 405B μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§„ λŒ€ν˜• λͺ¨λΈμ΄λ‹€.
  • Chat, Edit, Action κΈ°λŠ₯에 μ‚¬μš©ν•œλ‹€.

[!TIP] μΆ”μ²œ λͺ¨λΈ

Claude 3.5 Sonnet을 κ°€μž₯ μΆ”μ²œν•˜λ©°, λ‹€λ₯Έ μ˜΅μ…˜μœΌλ‘œλŠ” GPT-4o, Gemini 1.5 Pro, Llama3.1 405Bλ₯Ό ꢌμž₯ν•œλ‹€.

3-1-3. Embeddings model

  • ν…μŠ€νŠΈλ₯Ό λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λ„λ‘ ν›ˆλ ¨λœ λͺ¨λΈ.
  • μƒμ„±λœ λ²‘ν„°λŠ” λ‚˜μ€‘μ— λ‹€λ₯Έ 벑터듀과 λΉ λ₯΄κ²Œ λΉ„κ΅ν•˜μ—¬ ν…μŠ€νŠΈ κ°„μ˜ μœ μ‚¬μ„±μ„ νŒλ‹¨ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
  • μž„λ² λ”© λͺ¨λΈμ€ 일반적으둜 LLM보닀 훨씬 μž‘μ€ λͺ¨λΈμ΄λ©°, λ”°λΌμ„œ λΉ„κ΅μ μœΌλ‘œ 맀우 λΉ λ₯΄κ³  μ €λ ΄ν•˜λ‹€.

Continueμ—μ„œλŠ” 인덱싱 κ³Όμ • 쀑에 μž„λ² λ”©μ„ μƒμ„±ν•˜κ³ , 이λ₯Ό @codebase κΈ°λŠ₯μ—μ„œ ν™œμš©ν•˜μ—¬ μ½”λ“œλ² μ΄μŠ€ 전체에 λŒ€ν•œ μœ μ‚¬μ„± 검색을 μˆ˜ν–‰ν•˜λŠ” 것을 톡해 κ°€μž₯ κ΄€λ ¨μ„± μžˆλŠ” μ»¨ν…μŠ€νŠΈλ₯Ό μ›Œν¬μŠ€νŽ˜μ΄μŠ€μ—μ„œ μžλ™μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆλ‹€.

[!TIP] μΆ”μ²œ λͺ¨λΈ

μ–΄λ–€ λͺ¨λΈμ΄λ“  μ“Έ 수 μžˆλ‹€λ©΄ voyage-code-2λ₯Ό μΆ”μ²œν•˜λ©°, 둜컬 ν™˜κ²½μ—μ„œ μž„λ² λ”©μ„ μƒμ„±ν•˜κ³  μ‹Άλ‹€λ©΄ Ollama와 ν•¨κ»˜ nomic-embed-textλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

이외에 Transformers.jsλ₯Ό μ‚¬μš©ν•΄ 둜컬 μž„λ² λ”©μ„ 생성할 수 있으며, 자체 μž„λ² λ”© μ—”λ“œν¬μΈνŠΈλ₯Ό κ΅¬μΆ•ν•˜κ³  싢을 경우 Hugging Face Text Embeddings Inferenceλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

3-1-4. Reranking model

  • 두 개의 ν…μŠ€νŠΈ-주둜 μ‚¬μš©μžμ˜ 질문과 λ¬Έμ„œ-λ₯Ό μž…λ ₯λ°›μ•„ ν•΄λ‹Ή λ¬Έμ„œκ°€ μ§ˆλ¬Έμ— λ‹΅λ³€ν•˜λŠ” 데 μ–Όλ§ˆλ‚˜ μœ μš©ν• μ§€ 0μ—μ„œ 1 μ‚¬μ΄μ˜ κ΄€λ ¨μ„± 점수λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν›ˆλ ¨λœ λͺ¨λΈ.
  • 일반적으둜 LLM보닀 훨씬 μž‘κ³  λΉ λ₯΄κ³  μ €λ ΄ν•˜λ‹€.
  • @codebase κΈ°λŠ₯μ—μ„œ λ¦¬λž­ν‚Ή λͺ¨λΈμ„ μ‚¬μš©ν•œλ‹€.

[!TIP] μΆ”μ²œ λͺ¨λΈ

μ–΄λ–€ λͺ¨λΈμ΄λ“  μ‚¬μš©ν•  수 μžˆλ‹€λ©΄, Voyage AI의 rerank-1을 μΆ”μ²œν•œλ‹€. ν˜Ήμ€ Cohereμ—μ„œ μ œκ³΅ν•˜λŠ” λ¦¬λž­ν‚Ή λͺ¨λΈμ„ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

λ§Œμ•½ LLM만 μ‚¬μš©ν•  수 μžˆλŠ” μƒνƒœλΌλ©΄ LLM λͺ¨λΈμ„ λ¦¬λž­ν‚Ή λͺ¨λΈλ‘œ μ‚¬μš©ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, 훨씬 λΉ„μ‹Έκ³  정확도가 λ–¨μ–΄μ§€λ―€λ‘œ κΌ­ ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 그리고 λ„ˆλ¬΄ λ§Žμ€ 병렬 μš”μ²­μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— Ollama와 같은 둜컬 λͺ¨λΈμ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

3-2. Continue λͺ¨λΈ 연동 μœ ν˜•

Continueμ—μ„œ μ‚¬μš©μžλŠ” Providerλ₯Ό μ„€μ •ν•˜μ—¬ λͺ¨λΈκ³Ό 연동할 ν”Œλž«νΌμ„ μ„ νƒν•˜κ³ , 각 Providerκ°€ μ œκ³΅ν•˜λŠ” AI λͺ¨λΈμ„ 선택할 수 μžˆλ‹€.

μ„œλΉ„μŠ€μ˜ μ£Όμš” κΈ°λŠ₯, μ‹€ν–‰ ν™˜κ²½, νŠΉν™”λœ κΈ°λŠ₯을 κΈ°μ€€μœΌλ‘œ λ‹€μŒκ³Ό 같이 μ—¬μ„― κ°€μ§€ μœ ν˜•μœΌλ‘œ λΆ„λ₯˜ν–ˆλ‹€.

  • AI λͺ¨λΈ 제곡 및 개발 ν”Œλž«νΌ
  • ν΄λΌμš°λ“œ AI μ„œλΉ„μŠ€
  • AI λͺ¨λΈ 배포 및 관리 도ꡬ
  • 둜컬 AI μ‹€ν–‰ 도ꡬ
  • AI μ›Œν¬ν”Œλ‘œμš° 및 톡합 도ꡬ
  • νŠΉν™”λœ AI μ„œλΉ„μŠ€

3-2-1. AI λͺ¨λΈ 제곡 및 개발 ν”Œλž«νΌ

자체 AI λͺ¨λΈμ„ κ°œλ°œν•˜κ³  κ°œλ°œν•œ λͺ¨λΈμ— λŒ€ν•œ APIλ₯Ό μ œκ³΅ν•œλ‹€.

  1. Mistral
    • Mistral Large: λ³΅μž‘ν•œ μž‘μ—…μ— κ°€μž₯ 쒋은 좔둠이 κ°€λŠ₯ν•œ λͺ¨λΈλ‘œ ν•œκ΅­μ–΄λ₯Ό 포함해 λ‹€μ–‘ν•œ μ–Έμ–΄λ₯Ό μ§€μ›ν•˜κ³  128K 토큰을 ν•œλ²ˆμ— μ²˜λ¦¬ν•  수 μžˆλ‹€.(Context window)
    • Codestra Codestra: μ½”λ“œ μž‘μ—…μ„ μœ„ν•΄ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ 80개 이상에 λŒ€ν•΄ ν•™μŠ΅ν•œ λͺ¨λΈλ‘œ λ‹€λ₯Έ λͺ¨λΈλ³΄λ‹€ 응닡이 λΉ λ₯΄λ‹€. 32K 토큰을 μ²˜λ¦¬ν•  수 μžˆλ‹€.
    • Mistral Embed Mistral Embbed: ν…μŠ€νŠΈλ₯Ό μΆ”μΆœν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λͺ¨λΈλ‘œμ„œ ν˜„μž¬λŠ” μ˜μ–΄λ§Œ μ§€μ›ν•œλ‹€.
  2. Anthropic
    • Haiku: 가볍고 λΉ λ₯΄κ²Œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ λͺ¨λΈ
    • Sonnet: μ„±λŠ₯κ³Ό μ†λ„μ˜ μ μ ˆν•œ μˆ˜μ€€μ˜ λͺ¨λΈ
    • Opus: μ„±λŠ₯이 κ°€μž₯ μš°μˆ˜ν•œ λͺ¨λΈλ‘œ μ–΄λ €μš΄ μˆ˜ν•™κ³Ό ν”„λ‘œκ·Έλž˜λ°μ— μ‚¬μš©ν•˜λŠ” λͺ¨λΈ
  3. Deepseek
    • Continueμ—μ„œλŠ” μ±„νŒ… λͺ¨λΈλ‘œdeepSeek-chat, μžλ™ μ™„μ„± λͺ¨λΈμ—λŠ” deepseek-coder μ‚¬μš©μ„ μΆ”μ²œν•˜λ©° μž„λ² λ”©, re-Ranking λͺ¨λΈμ€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.
  4. Gemini
    • ꡬ글이 λ§Œλ“  AI 챗봇
    • Continueμ—μ„œλŠ” μ±„νŒ… λͺ¨λΈλ‘œ Gemini 1.5 Pro, μž„λ² λ”© λͺ¨λΈμ—λŠ” models/text-embedding-004 μ‚¬μš©μ„ μΆ”μ²œν•˜λ©° μžλ™μ™„μ„±, re-Ranking λͺ¨λΈμ€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.
  5. Ollama
    • OllamaλŠ” λ‘œμ»¬μ—μ„œ LLM을 ꡬ동할 수 μžˆλ„λ‘ ν•˜λŠ” μ˜€ν”ˆμ†ŒμŠ€μ΄λ‹€.
    • Continueμ—μ„œλŠ” μ±„νŒ… λͺ¨λΈλ‘œ llama3.1:8, μžλ™ μ™„μ„± λͺ¨λΈλ‘œ starcoder2:3b, μž„λ² λ”© λͺ¨λΈλ‘œ nomic-embed-textλ₯Ό μΆ”μ²œν•˜λ©° re-Rankig λͺ¨λΈμ€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.
  6. OpenAI
    • Continueμ—μ„œλŠ” μ±„νŒ… λͺ¨λΈλ‘œ GPT-4o, μžλ™ μ™„μ„± λͺ¨λΈλ‘œ starcoder2:3b, μž„λ² λ”© λͺ¨λΈλ‘œ text-embedding-3-largeλ₯Ό μΆ”μ²œν•˜λ©° re-Rankig λͺ¨λΈμ€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

3-2-2. ν΄λΌμš°λ“œ AI μ„œλΉ„μŠ€

λŒ€κ·œλͺ¨ ν΄λΌμš°λ“œ μ œκ³΅μ—…μ²΄κ°€ μ œκ³΅ν•˜λŠ” AI 및 λ¨Έμ‹ λŸ¬λ‹ μ„œλΉ„μŠ€μ΄κ³ , λͺ¨λΈ ν›ˆλ ¨/배포/관리λ₯Ό μœ„ν•œ 쒅합적인 ν”Œλž«νΌμ„ μ œκ³΅ν•΄ μ£ΌλŠ” μ„œλΉ„μŠ€μ΄λ‹€.

λ‹€μŒμ€ λŒ€ν‘œμ μΈ ν”Œλž«νΌ 두 κ°œμ΄λ‹€.

  1. Azure OpenAI
    • Microsoftμ‚¬μ˜ Public Cloud μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” CSP사
    • μ—¬λŸ¬ AI λͺ¨λΈ κ³΅κΈ‰μ‚¬λ‘œλΆ€ν„° λͺ¨λΈμ„ 곡급받아 μ„œλΉ„μŠ€λ₯Ό ν•˜λŠ” ν˜•νƒœμ΄λ‹€.
    • Continueμ—μ„œλŠ” μ±„νŒ… λͺ¨λΈλ‘œ GPT-4o λͺ¨λΈμ„ μΆ”μ²œν•˜λ©° μžλ™ μ™„μ„± λͺ¨λΈλ‘œ Codestral, μž„λ² λ”©μ—λŠ” text-embedding-3-large λͺ¨λΈ μ‚¬μš©μ„ μΆ”μ²œν•œλ‹€. re-Ranking λͺ¨λΈμ€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.
  2. Amazon Bedrock
    • AWS ν™˜κ²½μ—μ„œ LLM을 κ°œλ°œν•˜κ³  배포할 수 μžˆλŠ” ν”Œλž«νΌ
    • Continueμ—μ„œλŠ” μ±„νŒ… λͺ¨λΈλ‘œ Claude 3.5 Sonnet λͺ¨λΈμ„ μΆ”μ²œν•˜λ©° μž„λ² λ”©μ—λŠ” amazon.titan-embed-text-v2:0 λͺ¨λΈ μ‚¬μš©μ„ μΆ”μ²œν•œλ‹€. μžλ™μ™„μ„±, re-Ranking λͺ¨λΈμ€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

ν΄λΌμš°λ“œ AI μ‚¬μš©μ˜ μž₯단점

 

- μž₯점 :

ν΄λΌμš°λ“œ AI Providerλ₯Ό μ‚¬μš©ν•  경우, 물리적인 인프라λ₯Ό ꡬ좕할 ν•„μš”μ—†μ΄ μ‚¬μš©ν•œλ§ŒνΌλ§Œ μ§€λΆˆν•˜λŠ” ꡬ쑰(Pay-as-you-go)λ₯Ό 톡해 초기 투자 λΉ„μš©μ„ 크게 μ ˆκ°ν•  수 μžˆλ‹€.

 

- 단점 :

  • APIλ₯Ό μ΄μš©ν•΄μ„œ 데이터λ₯Ό μ „μ†‘ν•˜κΈ° λ•Œλ¬Έμ— 데이터가 제3μžμ™€ 곡유될 수 μžˆλŠ” μœ„ν—˜μ„±μ΄ μ‘΄μž¬ν•œλ‹€. (λ¬Όλ‘  OpenAI μ—”ν„°ν”„λΌμ΄μ¦ˆ 고객의 데이터λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΉ„μŠ€ κ°œμ„ μ΄λ‚˜ λͺ¨λΈ ν›ˆλ ¨μ— μ‚¬μš©ν•˜μ§€ μ•Šκ² λ‹€κ³  λͺ…μ‹œν•˜λŠ” λ“± 보호 μ‘°μΉ˜κ°€ μ‘΄μž¬ν•œλ‹€.)
  • μž₯κΈ°μ μœΌλ‘œλŠ” μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•˜λ©΄ μ§€μ†μ μœΌλ‘œ λ°œμƒν•˜λŠ” λΉ„μš©μ΄ 더 λ“€ μˆ˜λ„ μžˆλ‹€. 

3-2-3. AI λͺ¨λΈ 배포 및 μ„œλ²„λ¦¬μŠ€ ν”Œλž«νΌ

  • Cloudflare Workers AI
  • HuggingFace Inference Endpoints
  • DeepInfra
  • Together
  • vLLM

3-2-4. 둜컬 AI μ‹€ν–‰ 도ꡬ

  • Ollama
  • LlamaCpp
  • LlamaFile
  • LM Studio
  • TextGenWebUI

3-2-5. AI μ›Œν¬ν”Œλ‘œμš° 및 톡합 도ꡬ

AI λͺ¨λΈμ„ 기쑴의 μ‹œμŠ€ν…œμ΄λ‚˜ μ›Œν¬ν”Œλ‘œμš°μ— μ‰½κ²Œ 톡합할 수 있게 ν•΄μ£ΌλŠ” 도ꡬ이며 ν•΄λ‹Ή μœ ν˜•μ˜ μ„œλΉ„μŠ€λ“€μ€ AI 기술의 접근성을 높이고 ν™œμš©λ„λ₯Ό μ¦κ°€μ‹œν‚¨λ‹€.

  • flowise
  • Kindo

3-2-6. νŠΉν™”λœ AI μ„œλΉ„μŠ€

νŠΉμ • λΆ„μ•Όλ‚˜ κΈ°μˆ μ— νŠΉν™”λœ AI μ„œλΉ„μŠ€. λ©€ν‹°λͺ¨λ‹¬ AI, κ³ μ„±λŠ₯ μΆ”λ‘ , ν•˜λ“œμ›¨μ–΄ μ΅œμ ν™” λ“± νŠΉμ • λ‹ˆμ¦ˆλ₯Ό μΆ©μ‘±μ‹œν‚€λŠ” μ†”λ£¨μ…˜μ„ μ œκ³΅ν•œλ‹€.

  • Gemini
  • Groq
  • IPES LLM
  • Replicate

3-3. Free-Trial

ContinueλŠ” μ•„λž˜ Chat Model에 λŒ€ν•΄ μ΅œλŒ€ 50회 μ‚¬μš© κ°€λŠ₯ν•œ Free-Trial을 μ œκ³΅ν•œλ‹€.

  • Claude 3 Sonnet
  • GPT-4o
  • Llama3 70b
  • Codestral
"models": [
    {
      "title": "Claude 3 Sonnet (Free Trial)",
      "provider": "free-trial",
      "model": "claude-3-sonnet-20240229"
    },
  ],

 

 

4. LLM completion options & continueμ—μ„œ μ„€μ •ν•˜κΈ°, 효과적인 ν”„λ‘¬ν”„νŒ…(system, user)

 

LLM μ΄λž€ ?

"λŒ€κ·œλͺ¨ μ–Έμ–΄ λͺ¨λΈ"둜, ꡉμž₯히 λ§Žμ€ 데이터λ₯Ό ν•™μŠ΅ν•œ AI λͺ¨λΈ. λŒ€ν‘œμ μΈ LLM은 ChatGPTκ°€ μžˆλ‹€.

 

LLM Completion Options λž€ ?

μ–Έμ–΄ λͺ¨λΈμ΄ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” 방식을 μ‘°μ •ν•˜λŠ” μ„€μ •λ“€λ‘œ, 좜λ ₯λ˜λŠ” ν…μŠ€νŠΈμ˜ 길이, λ‹€μ–‘μ„±, 일관성 등에 영ν–₯을 λ―ΈμΉœλ‹€. 단, 각 λͺ¨λΈλ“€μ΄ μ§€μ›ν•˜λŠ” Option듀도 μ•½κ°„μ”© μƒμ΄ν•˜λ©° λ™μΌν•œ 값을 주더라도 λͺ¨λΈλ§ˆλ‹€ 응닡 변화에 νŽΈμ°¨κ°€ μžˆμ„ 수 μžˆλ‹€.

4-1. Continueμ—μ„œ completionOption μ„€μ •ν•˜λŠ” 법

Continueμ—μ„œ Completion Optionsλ₯Ό μˆ˜μ •ν•˜κ³  μ‹Άλ‹€λ©΄ config.jsonλ₯Ό 톡해 μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.

"completionOptions": {
  "stream": "boolean",
  "teperature": "number",
  "topP": "number",
  "topK": "integer",
  "presencePenalty": "number",
  "frequencePenalty": "number",
  "mirostat": "number",
  "stop": "string[]",
  "maxTokens": "number",
  "numThreads": "integer",
  "keepAlive": "integer",
}
  • stream : LLM 응닡을 streaming으둜 받을지 μ„ νƒν•˜λŠ” μ˜΅μ…˜
  • temperature : λͺ¨λΈμ΄ μƒμ„±ν•˜λŠ” μ‘λ‹΅μ˜ μ°½μ˜μ„±μ΄λ‚˜ λžœλ€μ„±μ„ μ‘°μ •
  • topP : LLMμ—μ„œ 생성할 단어λ₯Ό μ„ νƒν•˜λŠ” κ³Όμ •μ—μ„œ ν™•λ₯  뢄포 μƒμœ„ P%의 λ‹¨μ–΄λ“€λ§Œ μ„ νƒν•˜μ—¬ 응닡을 μƒμ„±ν•˜λŠ” 방식.
  • topK : LLMμ—μ„œ 응닡을 생성할 λ•Œ κ³ λ €ν•  후보 λ‹¨μ–΄λ“€μ˜ 개수λ₯Ό μ œν•œν•˜λŠ” μ˜΅μ…˜
  • presencePenalty : λͺ¨λΈμ΄ 이미 μ–ΈκΈ‰ν•œ 단어λ₯Ό λ‹€μ‹œ μ‚¬μš©ν•˜λŠ” 것을 μ–Όλ§ˆλ‚˜ μ–΅μ œν• μ§€ μ‘°μ ˆν•˜λŠ” μ˜΅μ…˜
  • frequencePenalty : λ‹¨μ–΄μ˜ λΉˆλ„λ₯Ό μ–΅μ œν•˜κ±°λ‚˜ ν—ˆμš©ν•  수 있으며, λͺ¨λΈμ΄ 같은 λ‹¨μ–΄λ‚˜ 문ꡬλ₯Ό 반볡적으둜 μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ μ œμ–΄ν•˜λŠ” μ˜΅μ…˜
  • mirostat : LLMμ—μ„œ μ‹€μ‹œκ°„μœΌλ‘œ μ‘λ‹΅μ˜ 일관성과 ν’ˆμ§ˆμ„ μ§€μ†μ μœΌλ‘œ μ‘°μ •ν•˜κΈ° μœ„ν•œ 동적 μƒ˜ν”Œλ§ μ•Œκ³ λ¦¬μ¦˜
  • stop : λͺ¨λΈμ΄ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” 도쀑 νŠΉμ • ν† ν°μ΄λ‚˜ λ¬Έμžμ—΄μ΄ λ“±μž₯ν•˜λ©΄ 응닡 생성을 μ€‘λ‹¨ν•˜λŠ” μ˜΅μ…˜
  • maxTokens : λͺ¨λΈμ΄ ν•˜λ‚˜μ˜ ν”„λ‘¬ν”„νŠΈμ— λŒ€ν•΄ 응닡할 λ•Œ 생성할 ν…μŠ€νŠΈμ˜ 길이λ₯Ό μ œν•œ
  • numThreads : 생성 κ³Όμ •μ—μ„œ μ‚¬μš©λ˜λŠ” μŠ€λ ˆλ“œμ˜ 수λ₯Ό μ‘°μ ˆν•˜λŠ” μ˜΅μ…˜
  • keepAlive : μš”μ²­μ΄ μ—†λŠ” 경우 λͺ¨λΈμ„ λ©”λͺ¨λ¦¬μ—μ„œ μ–Έλ‘œλ“œν•˜κΈ°κΉŒμ§€μ˜ μ‹œκ°„. (κΈ°λ³Έ κ°’: 60 * 30 = 30λΆ„)

4-1-1. config.json > completionOption

μ „μ—­μ μœΌλ‘œ μ„€μ •ν•˜λŠ” 방법. μ—¬κΈ°μ„œ μ„€μ •ν•œ completionOption 값듀은 λͺ¨λΈμ— 상관없이 Continueμ—μ„œ λͺ¨λ“  μž‘μ—…μ— λ™μΌν•˜κ²Œ μ μš©λœλ‹€.

{
  "completionOptions": {
    "temperature": 0.7,
    "topP": 0.9,
    "maxTokens": 150
  }
}

4-1-2. config.json > models > completionOptions

λͺ¨λ“  λͺ¨λΈμ— λŒ€ν•œ 기본값이 μ•„λ‹ˆλΌ νŠΉμ • λͺ¨λΈμ— λŒ€ν•œ 섀정을 λ³„λ„λ‘œ μ •μ˜ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.

예λ₯Ό λ“€λ©΄ Msty와 gpt-4o-mini에 각각 λ‹€λ₯Έ completionOptions 섀정을 λΆ€μ—¬ν•  μˆ˜λ„ μžˆλ‹€.

{
  "models": [
    {
      "title": "Msty",
      "provider": "msty",
      "model": "deepseek-coder:6.7b",
      "completionOptions": {
        "temperature": 0.9,
        "topP": 0.7,
        "maxTokens": 100
      }
    },
    {
      "title": "GPT-4o Mini",
      "provider": "openai",
      "model": "gpt-4o-mini",
      "completionOptions": {
        "temperature": 0.6,
        "topP": 0.8,
        "maxTokens": 200
      }
    }
  ]
}

4-2. Context Provider μ»€μŠ€ν…€ν•˜κΈ°

Context Provider λž€ ?

LLM에 νŠΉμ •ν•œ μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•˜λŠ” κΈ°λŠ₯으둜, @λ₯Ό μž…λ ₯ν•˜λ©΄ LLM에 context둜 μ œκ³΅ν•  수 μžˆλŠ” μ½˜ν…μΈ  λ“œλ‘­λ‹€μš΄-LLMμ—κ²Œ μ œκ³΅λ˜λŠ” μΆ”κ°€ 정보(파일 λ‚΄μš©, ν”„λ‘œμ νŠΈ μ½”λ“œ, κΉƒ λ³€κ²½ 사항, κΉƒ 이슈, 터미널 좜λ ₯, μ›Ή νŽ˜μ΄μ§€ λ‚΄μš©, λ¬Έμ„œ λ“±)-을 λ³Ό 수 μžˆλ‹€.

ContinueλŠ” 기본적으둜 μ•„λž˜μ™€ 같은 built-in context providerλ₯Ό μ œκ³΅ν•œλ‹€.

  "contextProviders": [
    {
      "name": "code",
      "params": {}
    },
    {
      "name": "docs",
      "params": {}
    },
    {
      "name": "diff",
      "params": {}
    },
    { "name": "open", "params": { "onlyPinned": true } },
    {
      "name": "issue",
      "params": {
        "repos": [
          {
            "owner": "continuedev",
            "repo": "continue"
          }
        ],
        "githubToken": "ghp_xxx"
      }
    }
    ...
  ]

 

Built-in Context Providers :

  • @file: ν˜„μž¬ μ›Œν¬μŠ€νŽ˜μ΄μŠ€μ˜ νŒŒμΌμ„ context둜 제곡.
  • @code: ν”„λ‘œμ νŠΈ λ‚΄ νŠΉμ • ν•¨μˆ˜λ‚˜ 클래슀λ₯Ό context둜 제곡.
  • @Git Diff: ν˜„μž¬ 브랜치의 λ³€κ²½ 사항을 context둜 제곡.
  • @terminal: IDE의 터미널 λ‚΄μš©μ„ context둜 제곡.
  • @open: ν˜„μž¬ μ—΄λ € μžˆλŠ” 파일의 λ‚΄μš©λ“€μ„ context둜 제곡.
  • @folder: ν˜„μž¬ μ›Œν¬μŠ€νŽ˜μ΄μŠ€μ˜ 폴더λ₯Ό context둜 제곡. @codebase 와 λ™μΌν•œ 검색 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜μ§€λ§Œ 단일 ν΄λ”μ—μ„œλ§Œ 검색할 수 μžˆλ‹€.
  • @codebase: μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ „μ²΄μ—μ„œ κ°€μž₯ κ΄€λ ¨μ„± 높은 μ½˜ν…μΈ λ₯Ό μžλ™μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆλ„λ‘ codebase λ₯Ό 색인화
  • @url: νŠΉμ • URL의 λ‚΄μš©μ„ markdown ν˜•μ‹μœΌλ‘œ context둜 제곡.
  • @issue: GitHub issue의 λŒ€ν™”λ₯Ό context둜 제곡 (개인 μ ‘κ·Ό 토큰 ν•„μš”).
  • @docs: Continueμ—μ„œ λ¬Έμ„œμ™€ μƒν˜Έ μž‘μš©ν•  수 있게 ν•΄μ€Œ. 정적 μ‚¬μ΄νŠΈλ‚˜ GitHub νŽ˜μ΄μ§€λ₯Ό μƒ‰μΈν™”ν•˜μ—¬ μ‰½κ²Œ μ ‘κ·Ό κ°€λŠ₯.

 

Custom Context Provider

 

λͺ¨λ“  Context ProviderλŠ” ν”ŒλŸ¬κ·ΈμΈμœΌλ‘œ, 기본으둜 μ œκ³΅ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈ 외에도 ν•„μš”ν•œ μ†ŒμŠ€λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ” 경우 μƒˆλ‘œμš΄ Context Providerλ₯Ό μš”μ²­ ν˜Ήμ€ κ°œλ°œν•  수 있고, REST APIλ₯Ό 톡해 μ™ΈλΆ€ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 정보λ₯Ό κ²€μƒ‰ν•˜κ³  κ²°κ³Όλ₯Ό λ°›μ•„ CustomContextProviderλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

context provider의 3κ°€μ§€ μ’…λ₯˜(ContextProviderType) :

  • normal: κΈ°λ³Έ μ„€μ •. λ³„λ„μ˜ 선택(submenu) 및 쿼리 없이 μ‚¬μš© κ°€λŠ₯
  • query: μœ μ €κ°€ ν…μŠ€νŠΈ λ°•μŠ€λ‘œ μž…λ ₯ν•˜μ—¬ context ν•­λͺ© 생성. "type": "query"둜 μ„€μ •
  • submenu: μœ μ €κ°€ 선택할 수 μžˆλŠ” ν•­λͺ©μ„ 제곡. "type": "submenu"둜 μ„€μ •ν•΄μ•Ό ν•˜λ©°, loadSubmenuItems와 getContextItems λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€
// ~/.continue/config.ts
interface CustomContextProvider {
  title: string;
  displayTitle?: string;
  description?: string;
  renderInlineAs?: string;
  type?: ContextProviderType;
  getContextItems(
    query: string,
    extras: ContextProviderExtras
  ): Promise<ContextItem[]>;
  loadSubmenuItems?: (
    args: LoadSubmenuItemsArgs
  ) => Promise<ContextSubmenuItem[]>;
}

const RagContextProvider: CustomContextProvider = {
  title: "rag",
  displayTitle: "RAG",
  description:
    "Retrieve snippets from our vector database of internal documents",

  getContextItems: async (
    query: string,
    extras: ContextProviderExtras
  ): Promise<ContextItem[]> => {
    const response = await fetch("https://internal_rag_server.com/retrieve", {
      method: "POST",
      body: JSON.stringify({ query }),
    });

    const results = await response.json();

    return results.map((result) => ({
      name: result.title,
      description: result.title,
      content: result.contents,
    }));
  },
};

export function modifyConfig(config: Config): Config {
  if (!config.contextProviders) {
    config.contextProviders = [];
  }
  config.contextProviders.push(RagContextProvider);
  return config;
}

4-3. Custom slash commands

4-3-1. .prompt 파일 μƒμ„±ν•˜κΈ°

  • μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ΅œμƒλ‹¨μ— .prompts/ 폴더λ₯Ό 직접 μƒμ„±ν•˜κ±°λ‚˜, chat box λ°‘μ˜ Build a custom promptλ₯Ό λˆ„λ₯΄λ©΄ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ΅œμƒλ‹¨μ— .promptsλΌλŠ” 폴더가 μƒμ„±λœλ‹€.
  • .prompts ν΄λ”μ—μ„œ μƒμ„±ν•œ .prompt 파일의 이름은 ν”„λ‘¬ν”„νŠΈλ₯Ό μƒμ„±ν•˜λŠ” 데 μ‚¬μš©ν•  μŠ¬λž˜μ‹œ λͺ…λ Ήμ–΄μ˜ 이름이 λœλ‹€. ( e.g., test.prompt ⇒ /test )
  • νŒŒμΌμ— ν”„λ‘¬ν”„νŠΈ λ‚΄μš©μ„ μž‘μ„±ν•˜λ©΄ chat ν™”λ©΄μ—μ„œ μŠ¬λž˜μ‹œ(/)+ ν”„λ‘¬ν”„νŠΈνŒŒμΌλͺ… + ENTERλ₯Ό 톡해 ν”„λ‘¬ν”„νŠΈμ—μ„œ μ§€μ‹œν•œ λ‚΄μš©μ„ λ”°λ₯΄κ²Œ λœλ‹€.
temperature: 0.5
maxTokens: 4096
---
<system>
You will be acting as a senior software engineer helping a colleague document their code.
</system>
You will follow the guidelines for writing great code comments:
{{{ url "https://stackoverflow.blog/2021/12/23/best-practices-for-writing-code-comments/" }}}
---
Using this information, write a comment for the following code:
{{{ input }}}
  • μ„œλ¬Έ
  • System νƒœκ·Έ
  • Context Provider
  • λ‚΄μž₯ λ³€μˆ˜ : ν˜„μž¬ μ‚¬μš© κ°€λŠ₯ν•œ κΈ°λ³Έ 제곡 λ³€μˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. {{{ input }}}, {{{ currentFile }}}, {{{ ./path/to/file.js }}}

 

4-3-2. μžμ—°μ–΄ ν”„λ‘¬ν”„νŠΈ (customCommands 속성, config.json)

config.json νŒŒμΌμ— customCommands 속성을 μΆ”κ°€ν•˜λŠ” κ²ƒμœΌλ‘œ, μžμ—°μ–΄λ‘œ μž‘μ„±λœ λͺ…λ Ήμ–΄λ₯Ό μ •μ˜ν•˜λŠ” custom slash commandsλ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

customCommands=[{
  "name": "check",
  "description": "Check for mistakes in my code",
  "prompt": "{{{ input }}}\n\nPlease read the highlighted code and check for any mistakes. You should look for the following, and be extremely vigilant:\n- Syntax errors\n- Logic errors\n- Security vulnerabilities\n- Performance issues\n- Anything else that looks wrong\n\nOnce you find an error, please explain it as clearly as possible, but without using extra words. For example, instead of saying 'I think there is a syntax error on line 5', you should say 'Syntax error on line 5'. Give your answer as one bullet point per mistake found."
}]
  • name : μŠ¬λž˜μ‹œ λͺ…령을 ν˜ΈμΆœν•˜λŠ” 데 μž…λ ₯ν•  이름
  • description : λ“œλ‘­λ‹€μš΄ 메뉴에 ν‘œμ‹œλ˜λŠ” μ„€λͺ…
  • prompt : Handlebars ꡬ문을 μ‚¬μš©ν•œ ν…œν”Œλ¦Ώ μž‘μ„±μ„ 지원
  • input : μŠ¬λž˜μ‹œ λͺ…λ ΉμœΌλ‘œ μž…λ ₯ν•œ μΆ”κ°€ μž…λ ₯.
  • file name: μ ˆλŒ€ κ²½λ‘œλ‚˜ ν˜„μž¬ μž‘μ—… 디렉토리λ₯Ό κΈ°μ€€μœΌλ‘œ ν•œ μƒλŒ€ 경둜λ₯Ό μ œκ³΅ν•˜μ—¬ λͺ¨λ“  νŒŒμΌμ„ μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

4-3-3. ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” ν”„λ‘¬ν”„νŠΈ (slashCommands 속성, config.ts)

 

customCommands둜 μ‚¬μš©μž μ§€μ • λͺ…령을 μž‘μ„±ν•˜λŠ” 것보닀 ν•œ 단계 더 λ‚˜μ•„κ°€λ €λ©΄ 응닡을 λ°˜ν™˜ν•˜λŠ” μ‚¬μš©μž μ§€μ • ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄μ„œλŠ” config.json λŒ€μ‹  config.tsλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”λ°, μ΄κ³³μ—μ„œ slashCommands 배열에 μƒˆλ‘œμš΄ slashCommand 객체λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

export function modifyConfig(config: Config): Config {
  config.slashCommands?.push({
    name: "commit",
    description: "Write a commit message",
    run: async function* (sdk) {
      const diff = await sdk.ide.getDiff();
      for await (const message of sdk.llm.streamComplete(
        `${diff}\n\nWrite a commit message for the above changes. Use no more than 20 tokens to give a brief description in the imperative mood (e.g. 'Add feature' not 'Added feature'):`,
        {
          maxTokens: 20,
        }
      )) {
        yield message;
      }
    },
  });
  return config;
}

 

4-4. 효과적인 ν”„λ‘¬ν”„νŠΈ μ—”μ§€λ‹ˆμ–΄λ§

4-4-1. LLM의 μ‘λ‹΅μ˜ ν’ˆμ§ˆμ„ λ”μš± ν–₯μƒμ‹œν‚€κΈ°

μ‚¬μš©μžλŠ” ν”„λ‘¬ν”„νŠΈ λ””μžμΈμ˜ λ‹€μ–‘ν•œ μ „λž΅κ³Ό 기법을 톡해 효과적으둜 μ§ˆλ¬Έν•¨μœΌλ‘œμ¨, LLM의 μ„±λŠ₯을 μ΅œμ ν™”ν•˜μ—¬ 더 λ‚˜μ€ 응닡 κ²°κ³Όλ₯Ό λ„μΆœν•  수 μžˆλ‹€.

  • μ§ˆλ¬Έν•˜κΈ° μ „ 생각 κ΅¬μ‘°ν™”ν•˜κΈ°
    • μ§ˆλ¬Έμ„ ν•˜κΈ° 전에 μƒκ°μ˜ 연결고리(Chain-of-Thought, CoT)λ₯Ό 톡해 λŒ€λ‹΅μ„ μœ λ„
      • "μ°¨κ·Όμ°¨κ·Ό λ‹¨κ³„μ μœΌλ‘œ 생각해 쀘"
  • ν”„λ‘¬ν”„νŠΈμ—κ²Œ 페λ₯΄μ†Œλ‚˜ λΆ€μ—¬ν•˜κΈ°
    • ν”„λ‘¬ν”„νŠΈμ—κ²Œ μ—­ν• , λ§₯락과 배경을 λΆ€μ—¬
      • "λ„ˆλŠ” ~ 역할이고, λ‚˜λŠ” μ΄λŸ¬ν•œ 닡변이 ν•„μš”ν•œ ~ μ‚¬λžŒμ΄μ•Ό."
    • λ‹΅λ³€ λ‚œμ΄λ„λ₯Ό κ²°μ •ν•˜λŠ” 문체λ₯Ό μ§€μ •
      • "μ‘Έμ—… 논문에 μž‘μ„±ν•  수 μžˆμ„ μ •λ„λ‘œ μ „λ¬Έμ μœΌλ‘œ μ•Œλ €μ€˜" λ˜λŠ” "μ΄ˆλ“±ν•™μƒλ„ μ‰½κ²Œ 이해할 수 μžˆμ„ μ •λ„λ‘œ μ„€λͺ…ν•΄μ€˜"
  • λͺ…ν™•ν•˜κ³  ꡬ체적으둜 μ§€μ‹œν•˜κΈ°
    • λ²”μœ„λ₯Ό μ’ν˜€μ„œ 질문
    • μ–΄λ–€ 포맷으둜 좜λ ₯ν• μ§€ λͺ…μ‹œ
    • μ–΄λ–€ λ°©λ²•μœΌλ‘œ μΆ”μΆœν• μ§€ λͺ…ν™•νžˆ μ§€μ‹œ
      • "300자 μ΄λ‚΄μ˜ μ„œλ‘ , λ³Έλ‘ , 결둠으둜 μ•Œλ €μ€˜", "ν‘œλ‘œ μ•Œλ €μ€˜", "~ κ΄€λ ¨ν•΄μ„œ 10κ°€μ§€λ₯Ό μ•Œλ €μ€˜"
  • μ˜μ–΄λ‘œ λ²ˆμ—­ν•΄μ„œ μ§ˆλ¬Έν•˜κΈ°
    • λŒ€λΆ€λΆ„μ˜ AIκ°€ μ˜μ–΄λ₯Ό 기반으둜 μž‘μ„±λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ˜μ–΄λ‘œ μ§ˆλ¬Έν•  λ•Œ λ‹΅λ³€μ˜ 퀄리티가 더 쒋을 λ•Œκ°€ λ§Žλ‹€.
  • 보상 μ œμ‹œν•˜κΈ°
    • μ§ˆλ¬Έμ— 응닡할 λ•Œ 동기λ₯Ό λΆ€μ—¬ν•˜κΈ° μœ„ν•΄ 보상을 μ œμ•ˆ
      • "이 문제λ₯Ό ν•΄κ²°ν•˜λ©΄ λ‹€μŒ λ‹¨κ³„λ‘œ λ„˜μ–΄κ°ˆ 수 μžˆμ–΄."
  • 처벌 μ–ΈκΈ‰ν•˜κΈ°
    • 응닡이 μ—†κ±°λ‚˜ λΆ€μ •ν™•ν•  경우의 κ²°κ³Όλ₯Ό μ–ΈκΈ‰ν•˜μ—¬ μ •ν™•ν•œ 응닡을 μœ λ„
      • "닡변이 틀리면 μ‹œκ°„μ΄ 낭비될 κ±°μ•Ό."
  • μžμ—°μŠ€λŸ¬μš΄ λŒ€ν™” μœ λ„ν•˜κΈ°
    • 인간적인 λŒ€ν™” μŠ€νƒ€μΌμ„ μœ λ„ν•˜μ—¬ 보닀 더 μžμ—°μŠ€λŸ¬μš΄ 닡변을 μš”μ²­
      • "μΉœκ·Όν•˜κ²Œ μ΄μ•ΌκΈ°ν•˜λ“― μ„€λͺ…ν•΄ 쀘."
  • 정보 μΆ©λΆ„νžˆ μš”κ΅¬ν•˜κΈ°
    • 질문이 λΆˆμ™„μ „ν•  경우 더 λ§Žμ€ 정보λ₯Ό μš”μ²­
      • "더 λ§Žμ€ 세뢀사항을 μ œκ³΅ν•΄ 쀄 수 μžˆμ–΄?"
  • ν…ŒμŠ€νŠΈ 포함 μš”μ²­ν•˜κΈ°
    • μƒμ„±λœ 닡변을 ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ 제곡
      • "이 μ½”λ“œλ₯Ό μ‹€ν–‰ κ°€λŠ₯ν•œ μƒνƒœλ‘œ μ œκ³΅ν•΄ 쀘."
  • ꡬ뢄 기호 μ‚¬μš©ν•˜κΈ°
    • νŠΉμ • 단어λ₯Ό κ°•μ‘°ν•˜κ±°λ‚˜ κ΅¬μ‘°ν™”λœ 닡변을 μš”μ²­ν•  λ•Œ ꡬ뢄 기호λ₯Ό μ‚¬μš©
      • "각 ν•­λͺ©μ„ '•' 기호둜 κ΅¬λΆ„ν•΄μ„œ λ‚˜μ—΄ν•΄ 쀘."
  • 단어 반볡 μ‚¬μš©ν•˜κΈ°
    • νŠΉμ • 단어λ₯Ό κ°•μ‘°ν•˜κ±°λ‚˜ μ£Όμš” κ°œλ…μ„ λ°˜λ³΅ν•˜μ—¬ μ„€λͺ…ν•˜λ„λ‘ μš”μ²­
      • "이 κ°œλ…μ„ μ—¬λŸ¬ 번 λ°˜λ³΅ν•΄μ„œ κ°•μ‘°ν•΄ 쀘."
  • 좜λ ₯λ¬Έ ν¬ν•¨ν•˜κΈ°
    • 닡변이 νŠΉμ • ν˜•μ‹μœΌλ‘œ 좜λ ₯λ˜λ„λ‘ μ§€μ‹œ
      • "이 μ½”λ“œλ₯Ό 좜λ ₯ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•΄ 쀘."
  • μžμ„Έν•œ λ‚΄μš© μš”μ²­ν•˜κΈ°
    • 더 ꡬ체적인 정보λ₯Ό ν¬ν•¨ν•˜μ—¬ 글을 μž‘μ„±ν•˜λ„λ‘ μš”μ²­
      • "μ’€ 더 μžμ„Έν•˜κ²Œ μ„€λͺ…ν•΄ 쀘."
  • μˆ˜μ • μš”μ²­ν•˜κΈ°
    • 이미 μƒμ„±λœ λ‚΄μš©μ„ μˆ˜μ •ν•˜μ—¬ 더 λ‚˜μ€ κ²°κ³Όλ₯Ό μš”κ΅¬
      • "이 λ‚΄μš©μ„ 더 κ°„κ²°ν•˜κ²Œ 닀듬어 쀘."
  • μ½”λ“œ 생성 μš”μ²­ν•˜κΈ°
    • μ—¬λŸ¬ νŒŒμΌμ— 걸친 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ±°λ‚˜ νŠΉμ • ꡬ쑰둜 제곡
      • "이 μ½”λ“œμ˜ 각 ν•¨μˆ˜λŠ” λ³„λ„μ˜ 파일둜 뢄리해 쀘."
  • νŠΉμ • ν…μŠ€νŠΈλ‘œ μ‹œμž‘ν•˜κΈ°
    • μ£Όμ–΄μ§„ ν…μŠ€νŠΈλ‚˜ 문ꡬλ₯Ό λ°”νƒ•μœΌλ‘œ 닡변을 μš”μ²­
      • "이 λ¬Έμž₯을 λ°”νƒ•μœΌλ‘œ μΆ”κ°€ μ„€λͺ…을 μž‘μ„±ν•΄ 쀘."
  • μš”κ΅¬ 사항 λͺ…μ‹œν•˜κΈ°
    • ν…μŠ€νŠΈλ‚˜ μ½”λ“œ 생성에 ν•„μš”ν•œ νŠΉμ • μš”κ΅¬ 사항을 λͺ…ν™•νžˆ μ§€μ‹œ
      • "이 μš”κ΅¬ 사항에 맞좰 ν…μŠ€νŠΈλ₯Ό μž‘μ„±ν•΄ 쀘."
  • 제곡된 μ˜ˆμ‹œ 기반 ν…μŠ€νŠΈ 생성
    • 제곡된 μ˜ˆμ‹œμ™€ μœ μ‚¬ν•œ μŠ€νƒ€μΌμ΄λ‚˜ ν˜•μ‹μœΌλ‘œ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λ„λ‘ μš”μ²­
      • "이 μ˜ˆμ‹œμ™€ 같은 ν˜•μ‹μœΌλ‘œ ν…μŠ€νŠΈλ₯Ό μž‘μ„±ν•΄ 쀘."

4-4-2. Continue와 ν•¨κ»˜ κ°œλ°œμ— ν™œμš©ν•˜λŠ” 법

  • @Codebases, @Files
    • νŠΉμ • ν•¨μˆ˜ λ‚΄μš© λ“± μ½”λ“œ 뢄석
    • λ²„κ·Έλ‚˜ μ—λŸ¬ μ°ΎκΈ°
  • Comment
    • 주석 μž‘μ„±
  • @Docs
    • 곡식 λ¬Έμ„œ 예제λ₯Ό λ°”λ‘œ μ°Έκ³ ν•˜μ—¬ μž‘μ„±
  • /Build a custom propmpt or command
    • ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„± 및 검사
    • λ°˜λ³΅ν•΄μ•Ό ν•˜λŠ” μž‘μ—…μ„ μžλ™ν™”
  • /Chat, /Autocomplete
    • 개발 λ¬Έμ„œλ‚˜ 양식 μ΄ˆμ•ˆ μž‘μ„±

초기 질문 μ§€μ‹œμ‚¬ν•­μ„ μ–΄λ–»κ²Œ μ£ΌλŠλƒμ— 따라 μ‹œκ°„κ³Ό λΉ„μš©μ΄ 크게 μ°¨μ΄λ‚˜κΈ° λ•Œλ¬Έμ— λ‚΄κ°€ λͺ¨λ₯΄λŠ” 것이 무엇이고, μ–΄λ–»κ²Œ 잘 도움을 받을 수 μžˆμ„μ§€μ— λŒ€ν•œ '메타 인지'κ°€ ν•„μš”ν•˜λ‹€.

 

참고 자료

  • ChatGPTμ—κ²Œμ„œ 쒋은 λŒ€λ‹΅μ„ μ΄λŒμ–΄ λ‚΄λŠ” 방법 7κ°€μ§€
  • 쒋은 μ§ˆλ¬Έμ„ ν•˜λŠ” 방법, ꡬ쑰화 방법
  • Principled Instructions Are All You Need for Questioning
  • ATLAS: An LLM Inquiry Principle Benchmark

 

5. Chat, Autocomplete

5-1. Chat

5-1-1. Chat_μ½”λ“œ ν•˜μ΄λΌμ΄νŒ…

μ½”λ“œ 블둝이 ν•„μš”ν•œ ꡬ문을 λ“œλž˜κ·Έν•œ λ’€, cmd/ctrl+L(VS Code) ν˜Ήμ€ md/ctrl+L(JetBrains)λ₯Ό μ΄μš©ν•˜μ—¬ λŒ€ν™” μ•ˆμ— ν¬ν•¨ν•œλ‹€.

[!TIP] πŸ’₯ ν‚€λ³΄λ“œ 숏컷 좩돌둜 cmd+L 인식이 μ•ˆ λ˜λŠ” 경우

  • 1) shift+cmd+Lλ₯Ό μ‹œλ„
  • 2) μ½”λ“œ λ“œλž˜κ·Έ ν›„ → 우클릭 → Continue → Add Highlighted Code to Context μ‹œλ„

5-1-2. λ ˆνΌλŸ°μŠ€ν•˜κΈ°

@λ₯Ό μ΄μš©ν•΄ μ½”λ“œλ² μ΄μŠ€, λ¬Έμ„œ, IDE, ν˜Ήμ€ third-party의 정보λ₯Ό μ»¨ν…μŠ€νŠΈμ— ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€.

5-1-3. μ œμ•ˆ μ½”λ“œ μ μš©ν•˜κΈ°

적용 방식은 μ½”λ“œ λΈ”λŸ­ 우츑 상단 μ•„μ΄μ½˜μ— 따라 선택할 수 μžˆλ‹€.

  • Apply to current file
  • Insert at cursor
  • Copy

5-1-4. μƒˆλ‘œμš΄ μ„Έμ…˜ μ‹œμž‘ν•˜κΈ°

cmd/ctrl+L(VS Code) ν˜Ήμ€ md/ctrl+L(JetBrains)으둜 μƒˆλ‘œμš΄ μ„Έμ…˜μ΄ μ‹œμž‘λœλ‹€.

5-1-5. λͺ¨λΈ λ³€κ²½ν•˜κΈ°

λ“œλ‘­λ‹€μš΄μ„ μ‚¬μš©ν•˜κ±°λ‚˜ cmd/ctrl + ’ 을 μž…λ ₯ν•˜μ—¬ μ„€μΉ˜ν•œ λͺ¨λΈμ„ μ „ν™˜ν•  수 μžˆλ‹€.

5-1-6. Chat_Model Setup

[!NOTE]
μ „λ°˜μ μΈ μ±„νŒ… ν™˜κ²½μ„ μ΅œμ ν™”ν•˜λ €λ©΄ 400B+ 맀개 λ³€μˆ˜ λͺ¨λΈ λ˜λŠ” ν”„λ‘ ν‹°μ–΄ λͺ¨λΈ 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€.

  • ν”„λ‘ ν‹°μ–΄ AI: κ³ λ„ν™”λœ, κ³ μ„±λŠ₯ λͺ¨λΈ
  • Continue 곡식 ꢌμž₯ λͺ¨λΈ: Claude Sonnet 3.5 (Anthropic)

 

open-weight/open-source model

  • open-weight model: λ§Œλ“œλŠ” 법, λͺ¨λΈ ꡬ쑰, μ‚¬μš©ν•œ 데이터 제반 λ‚΄μš© λͺ¨λ‘λ₯Ό κ³΅κ°œν•˜μ§€ μ•Šκ³  μ™„μ„±λœ λͺ¨λΈ
  • open source model: λ§Œλ“œλŠ” 법, λͺ¨λΈ ꡬ쑰, μ‚¬μš©ν•œ 데이터 λ“± λͺ¨λΈκ³Ό κ΄€λ ¨λœ λŒ€λΆ€λΆ„μ˜ λ‚΄μš©μ„ κ³΅κ°œν•˜μ—¬ κ³΅μœ ν•˜λŠ” λͺ¨λΈ

5-1-7. Chat_Context Selection

[!NOTE]

μ±„νŒ…μ€ μ‚¬μš©μžκ°€ ν˜„μž¬ μž‘μ—… 쀑인 μ»¨ν…μŠ€νŠΈ(context)λ₯Ό 선택할 수 μžˆλ‹€. μ±„νŒ…μ˜ 응닡 정확도λ₯Ό 높이렀면 μ»¨ν…μŠ€νŠΈλ₯Ό 잘 관리해야 ν•œλ‹€.

  • μ»¨ν…μŠ€νŠΈ 관리
    • μžλ™ μ»¨ν…μŠ€νŠΈ: ν”„λ‘œμ νŠΈ 파일, μ½”λ“œλ² μ΄μŠ€ λ“±μ˜ 정보λ₯Ό μžλ™μœΌλ‘œ μ»¨ν…μŠ€νŠΈλ‘œ 포함할 수 μžˆλ‹€.
    • μˆ˜λ™ μ»¨ν…μŠ€νŠΈ: ν•„μš”ν•œ 경우 μ‚¬μš©μžκ°€ 직접 μ»¨ν…μŠ€νŠΈλ₯Ό μ§€μ •ν•΄ AI의 응닡을 μ‘°μ •ν•  수 μžˆλ‹€.
    μ»¨ν…μŠ€νŠΈ μ΅œμ ν™” 방법
  • μž‘μ—… 쀑인 νŒŒμΌμ΄λ‚˜ μ½”λ“œλ² μ΄μŠ€λ₯Ό μ •ν™•νžˆ μ„€μ •ν•΄ 두면 κ΄€λ ¨λœ λ‚΄μš©μ— 더 μ •ν™•ν•˜κ²Œ λ‹΅ν•  수 μžˆλ‹€.
  • λΆˆν•„μš”ν•œ μ»¨ν…μŠ€νŠΈλ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 μ€‘μš”

μž…λ ₯ 심볼

[!NOTE]

μž…λ ₯창에 μ§ˆλ¬Έν•˜λŠ” 것이 μœ μΌν•œ ν•„μˆ˜ μ»¨ν…μŠ€νŠΈμ΄κ³  κ·Έ 외에 λ‚˜λ¨Έμ§€λŠ” 선택 사항

 

  • ν•˜μ΄λΌμ΄νŒ… μ½”λ“œ λΈ”λŸ­: cmd/ctrl + L(VS Code) λ˜λŠ” cmd/ctrl + J(JetBrains)
  • ν˜„μž¬ μ‹€ν–‰ 파일: cmd/ctrl + opt + enter
  • νŠΉμ • 파일: @files
  • νŠΉμ • 폴더: @directory
  • 전체 μ½”λ“œλ² μ΄μŠ€: @codebase
  • λ¬Έμ„œ μ‚¬μ΄νŠΈ: @docs
  • IDE λ‚΄ 터미널: @terminal
  • Git diff: @diff

5-1-8. Chat_How it works

챗은 μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ?

  1. 에디터 μ°½μ—μ„œ cmd + L λ˜λŠ” μ‚¬μ΄λ“œλ°” μ±„νŒ…μ°½μ—μ„œ @둜 Contextλ₯Ό μ „λ‹¬ν•œλ‹€.
  2. μ‚¬μ΄λ“œ λ°”μ—μ„œ 좔가적인 Promptλ₯Ό μ „λ‹¬ν•œλ‹€.
  3. LLM λͺ¨λΈμ€ 전달받은 Context와 Promptλ₯Ό 기반으둜 응닡을 μŠ€νŠΈλ¦¬λ°ν•œλ‹€.

5-1-9. FAQ

'그게 μ•„λ‹ˆκ³ ~' μ‹μœΌλ‘œ μ½”λ“œλŠ” μ•ˆ 보내고 후속 쑰치만 보내면 μ–΄λ–»κ²Œ 될까?

  • 이전 μ„Έμ…˜ μ»¨ν…μŠ€νŠΈλ„ 일뢀 ν¬ν•¨λœλ‹€.
  • μΆ”κ°€ μ»¨ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•˜μ§€ μ•Šμ•„λ„ λͺ¨λΈμ΄ λŒ€ν™”μ˜ 흐름과 λ§₯락을 κΈ°μ–΅ν•œλ‹€.

받은 응닡을 μ–΄λ–»κ²Œ μ μš©ν• κΉŒ?

  • 응닡에 ν¬ν•¨λœ μ½”λ“œλŠ” ν•΄λ‹Ή 블둝에 배치되며 ν˜„μž¬ νŒŒμΌμ— 적용, μ»€μ„œμ— μ‚½μž…, 볡사λ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ§€κΈˆκΉŒμ§€ λ§₯락을 λ¬΄νš¨ν™”ν•˜κ³  μƒˆλ‘œμš΄ μ„Έμ…˜μ„ μ‹œμž‘ν•˜κ³  μ‹Άλ‹€λ©΄?

  • cmd + L λ˜λŠ” μ‚¬μ΄λ“œλ°” μ±„νŒ…μ°½μ—μ„œ μƒˆλ‘œμš΄ μ±„νŒ…μ„ ν΄λ¦­ν•©λ‹ˆλ‹€.

μ±„νŒ… λͺ¨λΈ 쀑에 μ „μ†‘λœ ν”„λ‘¬ν”„νŠΈλ₯Ό λ³Ό 수 μžˆμ„κΉŒ?

  • A. 터미널 μ˜†μ— Output μ—΄κΈ°
  • B. λ“œλ‘­λ‹€μš΄μ—μ„œ Continue - LLM Prompts/Completions 선택
  • C. μ „μ†‘λœ ν”„λ‘¬ν”„νŠΈ 확인

개발과 λ¬΄κ΄€ν•œ λ‚΄μš©μ„ μš”μ²­ν•˜λ©΄? (e.g., κΉ€μΉ˜μ°Œκ°œ λ ˆμ‹œν”Ό μ•Œλ €μ€˜)

  • ContinueλŠ” 맀우 μ„±μ‹€ν•˜κ²Œ μ•Œλ €μ€λ‹ˆλ‹€.
  • 반면, Copilot은 "Sorry, I can't assist with that." 라고 μ‘λ‹΅ν•©λ‹ˆλ‹€.

5-2. Autocomplete

  • νƒ€μ΄ν•‘ν•˜λŠ” λ™μ•ˆ 인라인 μ½”λ“œ μ œμ•ˆμ„ μ œκ³΅ν•œλ‹€.
  • ν™œμ„±ν™”ν•˜λ €λ©΄ IDE ν•˜λ‹¨ 였λ₯Έμͺ½μ˜ μƒνƒœ ν‘œμ‹œμ€„μ— μžˆλŠ” "Continue" λ²„νŠΌμ„ ν΄λ¦­ν•˜κ±°λ‚˜ IDE μ„€μ •μ—μ„œ "Enable Tab Autocomplete" μ˜΅μ…˜μ„ μ²΄ν¬ν•œλ‹€.
  • Accepting a full suggestion (press TAB key)
  • Rejecting a full suggestion (press ESC key)
  • Partially accepting a suggestion (cmd/ctrl + →)

5-2-1. Autocomplete_Model setup

Continue κ³΅μ‹λ¬Έμ„œμ—μ„œλŠ” μžλ™μ™„μ„± κΈ°λŠ₯을 μ‚¬μš©ν•  λ•Œ Mistral API μ—μ„œ μ œκ³΅ν•˜λŠ” Codestral λͺ¨λΈμ„ μ‚¬μš©ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€.

λ§Œμ•½ νŒ€κ³Ό api keyλ₯Ό κ³΅μœ ν•˜κ±°λ‚˜ mistral apiλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ μ•„λž˜μ²˜λŸΌ apiBaseλ₯Ό μ„€μ •ν•΄μ•Ό ν•œλ‹€.

{
  "tabAutocompleteModel": {
    "title": "Codestral",
    "provider": "mistral",
    "model": "codestral-latest",
    "apiKey": "YOUR_API_KEY",
    "apiBase": "https://api.mistral.ai/v1" // 이뢀뢄 μΆ”κ°€
  }
}

 

 

5-2-2. Autocomplete_Local&Offline / Self-Hosted_ Experience

둜컬과 자체 ν˜ΈμŠ€νŒ…μ—μ„œλŠ” StarCoder2-3b λͺ¨λΈμ„ μΆ”μ²œν•œλ‹€.

{
  "tabAutocompleteModel": {
    "title": "StarCoder2-3b",
    "model": "starcoder2:3b",
    "provider": "ollama"
  }
}

 

Alternative experiences

  • ν•˜λ“œμ›¨μ–΄κ°€ μ’‹μ§€ μ•Šλ‹€λ©΄ deepseek-coder:1.3b-baseλ₯Ό μΆ”μ²œ
  • ν•˜λ“œμ›¨μ–΄κ°€ μ’‹λ‹€λ©΄ deepseek-coder:6.7b-base λͺ¨λΈμ„ μ‚¬μš©ν•˜λ©΄ λ”μš± κ³ ν’ˆμ§ˆμ˜ μžλ™μ™„μ„±μ„ μ œκ³΅ν•œλ‹€.

[!NOTE]

LM Studio μ‚¬μš©μžμ˜ 경우 "My Models" μ„Ήμ…˜μœΌλ‘œ μ΄λ™ν•˜μ—¬ μ›ν•˜λŠ” λͺ¨λΈμ„ μ°Ύκ³  경둜λ₯Ό λ³΅μ‚¬ν•˜μ„Έμš”(예: second-state/StarCoder2-3B-GGUF/starcoder2-3b-Q8_0.gguf). 이 경둜λ₯Ό config의 model κ°’μœΌλ‘œ μ‚¬μš©ν•˜μ„Έμš”.

 

Autocomplete_Context_Selection

  • μžλ™ μ™„μ„±κΈ°λŠ₯은 ν˜„μž¬ μ»€μ„œ μœ„μΉ˜λ₯Ό 기반으둜 μžλ™μœΌλ‘œ λ§₯락(context)을 κ²°μ •ν•©λ‹ˆλ‹€.
  • ν”„λ‘¬ν”„νŠΈμ— 포함할 λ‚΄μš©μ„ κ²°μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 기술
    • File prefix/suffix
    • Definitions from the Language Server Protocol

 

6. RAG, RAG in continue

 

RAG(Retrieval-Augmented Generation) :

LLM이 자체 지식 기반 외에도 μ™ΈλΆ€ λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ 검색 엔진을 ν™œμš©ν•˜μ—¬ 더 μ •ν™•ν•˜κ³  μ΅œμ‹ μ˜ 정보λ₯Ό μ œκ³΅ν•˜λŠ” 방법

 

LLM의 기쑴 문제점 :

  • 닡변이 없을 λ•Œ ν—ˆμœ„ 정보λ₯Ό μ œκ³΅ν•œλ‹€.
  • μ‚¬μš©μžκ°€ ꡬ체적이고 μ΅œμ‹ μ˜ 응닡을 κΈ°λŒ€ν•  λ•Œ μ˜€λž˜λ˜μ—ˆκ±°λ‚˜ 일반적인 정보λ₯Ό μ œκ³΅ν•œλ‹€.
  • μ‹ λ’°ν•  수 μ—†λŠ” μΆœμ²˜λ‘œλΆ€ν„° 응닡을 μƒμ„±ν•œλ‹€.
  • μš©μ–΄ ν˜Όλ™μœΌλ‘œ 인해 응닡이 μ •ν™•ν•˜μ§€ μ•Šλ‹€.

RAGκ°€ μ€‘μš”ν•œ 이유 :

  • μ‹ λ’°ν•  수 μžˆλŠ” 정보 μ†ŒμŠ€ ν™œμš©
  • μ‚¬μš©μž 신뒰도 ν–₯상

RAG μž₯점 :

  • λΉ„μš© 효율적 κ΅¬ν˜„
  • μ΅œμ‹  정보 제곡
  • μ‚¬μš©μž μ‹ λ’° κ°•ν™”
  • 개발자의 μ œμ–΄λ ₯ ν–₯상

6-1. RAG μ£Όμš” κ°œλ…

  • μ™ΈλΆ€ 데이터 생성
  • 질의 생성(Query Generation)
  • 정보 검색(Retrieval)
  • 응닡 생성(Answer Generation)

Flow

image.png

Flow2

aws-diagram.png

μš©μ–΄

  • Prompt :
    • LLM의 직접적인 μ΅œμ’… input
    • LLM의 정확도λ₯Ό 올리기 μœ„ν•˜μ—¬ μ‚¬μš©μžμ˜ 쿼리λ₯Ό λ°›μ•„μ„œ λ‹€μ–‘ν•˜κ²Œ μž¬κ΅¬μ„±.
  • Query :
    • μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” raw ν…μŠ€νŠΈ

RAG 단점

  • 계산 λΉ„μš©
  • 검색 ν’ˆμ§ˆ μ˜μ‘΄μ„±

6-2. RAG ν™œμš© μ˜ˆμ‹œ

RAGλŠ” LLM(λŒ€ν˜• μ–Έμ–΄ λͺ¨λΈ)을 직접 ν•™μŠ΅μ‹œν‚€λŠ” 것이 μ•„λ‹ˆλΌ, μ™ΈλΆ€ 데이터λ₯Ό 검색해 μ°Έμ‘°ν•˜λŠ” 방식. 즉, LLM이 ν•„μš”ν•œ 정보λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ κ²€μƒ‰ν•΄μ„œ κ·Έ 데이터λ₯Ό λ°”νƒ•μœΌλ‘œ ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€. 검색 λ‹¨κ³„μ—μ„œ 정보λ₯Ό κ°€μ Έμ˜€κ³ , κ·Έ 정보λ₯Ό 기반으둜 μ μ ˆν•œ 응닡을 μƒμ„±ν•˜λŠ” 것이 RAG의 ν•΅μ‹¬μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 더 μ‹ λ’°μ„± μžˆλŠ” κ²°κ³Όλ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.

 

RAGλ₯Ό μ‚¬μš©ν•˜λŠ” 이유 :

RAGκ°€ LLM을 직접 ν•™μŠ΅μ‹œν‚€μ§€ μ•Šκ³  μ™ΈλΆ€ 데이터λ₯Ό κ²€μƒ‰ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” μ΄μœ λŠ” μ‹€μ‹œκ°„ 정보 μ—…λ°μ΄νŠΈμ™€ λ©”λͺ¨λ¦¬ ν•œκ³„ λ•Œλ¬Έμ΄λ‹€.

  • μ‹€μ‹œκ°„ 정보 μ ‘κ·Ό κ°€λŠ₯
  • 효율적인 λ©”λͺ¨λ¦¬ μ‚¬μš© κ°€λŠ₯

일반적인 RAG ν™œμš© μ˜ˆμ‹œ :

  • 고객 지원 챗봇
  • 법λ₯ /의료 λΆ„μ•Ό
  • 연ꡬ 보쑰 도ꡬ

6-3. RAG μž‘λ™λ°©μ‹

6-3-1. Chunking

  • λŒ€κ·œλͺ¨ λ¬Έμ„œλŠ” κ·ΈλŒ€λ‘œ μ²˜λ¦¬ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ—, 이λ₯Ό μ—¬λŸ¬ 개의 μž‘μ€ 'chunk둜 λ‚˜λˆ„λŠ” 과정이 ν•„μš”ν•˜λ‹€.
  • 이 과정은 μ€‘μš”ν•œ 정보 손싀을 μ΅œμ†Œν™”ν•˜λ©΄μ„œλ„ 각 chunkκ°€ λ…λ¦½μ μœΌλ‘œ 처리될 수 μžˆλ„λ‘ μ„€κ³„λœλ‹€.
  • 일반적으둜 λ¬Έμ„œμ˜ 논리적 λ‹¨μœ„λ‚˜ 문단을 κΈ°μ€€μœΌλ‘œ 청크가 λ‚˜λ‰˜λ©°, 각 chunkλŠ” 검색 및 생성 κ³Όμ •μ—μ„œ 독립적인 λ‹¨μœ„λ‘œ ν™œμš©λœλ‹€.

Chunking ν•˜λŠ” 방법 :

  1. Fixed Size Chunking
    • κ°€μž₯ λ‹¨μˆœν•˜κ²Œ μ ‘κ·Όν•˜λŠ” λ°©μ‹μœΌλ‘œ, κ³ μ •λœ 문자의 길이둜 λ¬Έμ„œλ₯Ό μž˜λΌλ‚΄λŠ” 방식
  2. Content-Aware chunking
    • λ¬Έλ§₯을 μΈμ§€ν•˜λŠ” λ°©μ‹μœΌλ‘œ chunking을 ν•˜λŠ” 방법
  3. Recursive chunking
    • μœ„μ—μ„œ μ–ΈκΈ‰λœ 두 Fixed Size chunkingκ³Ό Content Aware Chunking을 ν˜Όν•©ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방식. Content Aware Chunking을 ν•˜μ—¬ 1차적으둜 자λ₯Έ λ’€, μ„€μ •ν•œ 길이보닀 κΈΈ κ²½μš°μ—λŠ” Fixed Size둜 λ‹€μ‹œ 자λ₯΄λŠ” 방식이닀.

6-3-2. Document Embedding

  • λ¬Έμ„œ μž„λ² λ”©μ€ λŒ€λŸ‰μ˜ λ¬Έμ„œλ₯Ό λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •
  • λ¬Έμ„œ λ‚΄μ˜ ν…μŠ€νŠΈλ₯Ό 고차원 κ³΅κ°„μ˜ λ²‘ν„°λ‘œ λ³€ν™˜ν•˜μ—¬ λ¬Έμ„œ κ°„μ˜ μœ μ‚¬λ„λ₯Ό μ‰½κ²Œ 계산할 수 μžˆλ„λ‘ ν•œλ‹€. μ—¬κΈ°μ„œ μ‚¬μš©ν•˜λŠ” μž„λ² λ”© λͺ¨λΈμ€ 일반적으둜 사전 ν•™μŠ΅λœ Transformer 기반 λͺ¨λΈμ„ μ‚¬μš©ν•œλ‹€.
  • λ¬Έμ„œμ˜ 의미적 μœ μ‚¬μ„±μ„ λ°˜μ˜ν•œ 벑터화 덕뢄에 검색 λ‹¨κ³„μ—μ„œ κ΄€λ ¨ λ¬Έμ„œλ₯Ό μ‰½κ²Œ 찾을 수 μžˆλ‹€.
  • μž„λ² λ”© 된 λ¬Έμ„œλ“€μ€ Vector DB에 μ €μž₯λ©λ‹ˆλ‹€. (ν˜„μž¬ ν”νžˆ μ“°μ΄λŠ” Vector DBλŠ” Faiss λ˜λŠ” Chroma 정도이닀.)

6-3-3. Retrieval

  • 검색 λ‹¨κ³„μ—μ„œλŠ” μž…λ ₯ 쿼리에 λ§žλŠ” κ΄€λ ¨ λ¬Έμ„œ λ˜λŠ” 청크λ₯Ό κ²€μƒ‰ν•˜κ³  μ•žμ„œ μƒμ„±λœ μž„λ² λ”© 벑터λ₯Ό 기반으둜 쿼리와 λ¬Έμ„œ κ°„μ˜ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•˜μ—¬ κ°€μž₯ 관련성이 높은 λ¬Έμ„œλ“€μ„ μ„ νƒν•œλ‹€.
  • 일반적으둜 벑터 μœ μ‚¬λ„ 검색을 μ‚¬μš©ν•˜μ—¬, 쿼리 μž„λ² λ”©κ³Ό 사전 μ €μž₯된 λ¬Έμ„œ(Chunk) μž„λ² λ”© κ°„μ˜ 코사인 μœ μ‚¬λ„ λ˜λŠ” μœ μ‚¬ν•œ 거리 μΈ‘μ • 방법을 μ‚¬μš©ν•œλ‹€.

Retrieval을 ν•˜λŠ” 방식 :

VectorDBλ₯Ό μ‚¬μš©ν•˜λŠ” 방법은 Dense 방식과 Sparse 방식이 μžˆλ‹€.

  • Sparse Retriever : TF-IDF와 같은 κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈ 데이터λ₯Ό ν¬μ†Œ λ²‘ν„°λ‘œ λ³€ν™˜ν•˜κ³ , 질의 λ²‘ν„°μ™€μ˜ μœ μ‚¬μ„±μ— 따라 λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•œλ‹€.
  • Dense Retriever : BERT와 같은 신경망 λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈ 데이터λ₯Ό λ°€μ§‘ μž„λ² λ”© λ²‘ν„°λ‘œ λ³€ν™˜ν•˜κ³ , 질의 λ²‘ν„°μ™€μ˜ μœ μ‚¬μ„±μ— 따라 κ΄€λ ¨ λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•œλ‹€.

6-3-4. Reranking

Reranking은 λ‹¨μˆœν•œ μž„λ² λ”© μœ μ‚¬λ„ 계산 μ΄μƒμ˜ λ‹€μ–‘ν•œ μš”μ†Œλ₯Ό κ³ λ €ν•˜μ—¬ μ‹€ν–‰λ˜λ©°, λ¬Έμ„œμ˜ λ§₯락, ν…μŠ€νŠΈ 길이 등을 κ³ λ €ν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ μƒμœ„ λ¬Έμ„œλ₯Ό κ²°μ •ν•œλ‹€.

 

Reranking이 ν•„μš”ν•œ 이유 :

  • LLM에 contextλ₯Ό 많이 λ„£λŠ”λ‹€κ³  μ’‹μ•„μ§€λŠ” 것이 μ•„λ‹ˆκ³  κ΄€λ ¨λœ λ¬Έμ„œλ₯Ό λ„£μ–΄μ•Όμ§€ μ›ν•˜λŠ” 닡변을 얻을 수 있게 λœλ‹€. 뿐만 μ•„λ‹ˆλΌ 같은 λ¬Έμ„œλ₯Ό 넣어도 λ¬Έμ„œλ₯Ό λ„£λŠ” μˆœμ„œμ— 따라 κ²°κ³Όκ°€ 달라지기 λ•Œλ¬Έμ— Reranking을 톡해 μ •κ΅ν•œ 닡변을 생성할 수 μžˆλ„λ‘ μœ λ„ν•  수 μžˆλ‹€.

6-3-5. Generation

μ΅œμ’…μ μœΌλ‘œ μ„ νƒλœ λ¬Έμ„œλ‚˜ 청크λ₯Ό 기반으둜 생성 λͺ¨λΈμ€ μ‚¬μš©μžμ˜ 쿼리에 λ§žλŠ” 닡변을 μƒμ„±ν•œλ‹€.

6-4. Continue의 RAG (Retrieval-Augmented Generation) μ›Œν¬ν”Œλ‘œ

 

νŠΉμ§•

 

ContinueλŠ” 주둜 @codebase 검색 μ‹œ RAGλ₯Ό μ‚¬μš©ν•œλ‹€.

  • κ²½λŸ‰ν™”λœ 둜컬 μž„λ² λ”©κ³Ό RAG
  • ν•„μš”μ— 따라 NLP task둜 Reranking을 보완
  • LLM promptλ₯Ό μ΄μš©ν•œ Reranking
  • 기본적으둜 κ°€λ²Όμš΄ μž„λ² λ”© λͺ¨λΈμ„ μ‚¬μš©ν•΄ Naive RAG(κΈ°λ³Έ RAG)λ₯Ό κ²½λŸ‰ν™”ν–ˆλ‹€.
  • μ‚¬μš©μžκ°€ μ›ν•˜λ©΄ Rerankingκ³Ό NLP taskλ₯Ό ν™œμ„±ν™”ν•΄ 정확도λ₯Ό λ†’μ΄λŠ” μ „λž΅μ„ μ„Έμ› λ‹€.

6-4-1. RAG의 μ‚¬μš© λ°μ΄ν„°λ² μ΄μŠ€

  • κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ (RDBMS): SQLite
    • μΈλ±μ‹±λœ 파일 기둝 μœ μ§€
    • μ „λ¬Έ 검색(Full-Text-Search) 인덱슀 μ €μž₯ 및 μ‚¬μš©
      • BM25 μ•Œκ³ λ¦¬μ¦˜ ν™œμš©
    • LanceDB μΊμ‹œ 관리 (lance_db_cache ν…Œμ΄λΈ”)
      • uuidλ₯Ό key둜, List[number] ν˜•νƒœμ˜ vectorλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  정보 μ €μž₯
  • 벑터 λ°μ΄ν„°λ² μ΄μŠ€: LanceDB
    • λ¬Έμ„œ chunk의 μž„λ² λ”© 벑터 μ €μž₯
    • μ‚¬μš©μž query와 λ¬Έμ„œ chunk κ°„ μœ μ‚¬λ„ 검색 μˆ˜ν–‰

6-4-2. RAG μ›Œν¬ν”Œλ‘œ λ‹€μ΄μ–΄κ·Έλž¨

graph TD
    subgraph "1.Indexing Process"
    A[Planning Layer] -->|SQLite| B[File Chunking]
    B --> C[Embedding Generation]
    C --> D[Vector DB Storage]
    B --> E[Full-text Index]
    end
    subgraph "2.Query Process"
    F[User Query] --> G[Similarity Search]
    F --> H[Full-text Search]
    F --> I[LLM Repo Map]
    G & H & I --> J[Reranker]
    J --> K[Top Results]
    end
    D -.-> G
    E -.-> H

6-5. μ£Όμš” 단계

6-5-1. 인덱싱 ν”„λ‘œμ„ΈμŠ€ (λ¬Έμ„œ μ „μ²˜λ¦¬)

  1. κ³„νš 단계
    • SQLite둜 μΈλ±μ‹±λœ νŒŒμΌλ“€μ˜ 기둝을 μœ μ§€
    • 브랜치 λ³€κ²½μ΄λ‚˜ μœˆλ„μš° λ¦¬λ‘œλ“œ μ‹œ 쀑볡 μž‘μ—…μ„ λ°©μ§€ν•œλ‹€. (95%의 νŒŒμΌμ€ λ³€κ²½λ˜μ§€ μ•ŠμŒ)
  2. 파일 μ²­ν‚Ή
    • λ¬Έμ„œλ₯Ό LLM μž…λ ₯에 μ ν•©ν•œ 크기의 μž‘μ€ λΆ€λΆ„(chunk)으둜 λΆ„ν• 
  3. μž„λ² λ”© 생성
    • 각 chunk에 λŒ€ν•œ μž„λ² λ”©μ„ AI λͺ¨λΈμ„ 톡해 벑터화
    • 둜컬 μž„λ² λ”©μ—λŠ” transformers.js 라이브러리λ₯Ό μ‚¬μš©
    • API μž„λ² λ”© λͺ¨λΈλ‘œ voyage-code-2 API 등을 μ„ νƒμ μœΌλ‘œ μ‚¬μš© κ°€λŠ₯
  4. 벑터 DB μ €μž₯
    • μƒμ„±λœ μž„λ² λ”©μ„ 둜컬 벑터 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯
    • SQLite의 lance_db_cache ν…Œμ΄λΈ”μ—μ„œ 캐싱
      • SQLite의 lance_db_cache ν…Œμ΄λΈ”μ—μ„œ vectorλŠ” embedding vector, contentsλŠ” text chunk에 ν•΄λ‹Ήν•œλ‹€.
  5. μ „λ¬Έ 검색 인덱슀 생성
    • κ²°κ³Ό 보강을 μœ„ν•œ μ „λ¬Έ 검색 인덱슀λ₯Ό SQLite에 생성 및 μ €μž₯

6-5-2. 쿼리 ν”„λ‘œμ„ΈμŠ€

  1. μ‚¬μš©μž 쿼리 μ ‘μˆ˜
    • @codebase 감지 μ‹œ RAG ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œμž‘
    • 쿼리λ₯Ό chunkingν•˜κ³ , μ €μž₯ν•œ 벑터와 비ꡐ할 수 μžˆλ„λ‘ μž„λ² λ”©
  2. μœ μ‚¬λ„ 검색 (Similarity Search)
    • 벑터 λ°μ΄ν„°λ² μ΄μŠ€(LanceDB)μ—μ„œ μœ μ‚¬λ„ 기반 κ²€μƒ‰μœΌλ‘œ κ²°κ³Ό λ„μΆœ
      • // core/indexing/LanceDbIndex.ts
        const table = await db.openTable(tableName);
        let query = table.search(vector);
        if (directory) {
          // seems like lancedb is only post-filtering, so have to return a bunch of results and slice after
          query = query.where(`path LIKE '${directory}%'`).limit(300);
        } else {
          query = query.limit(n);
        }
        const results = await query.execute();
        return results.slice(0, n) as any;
  3. μ „λ¬Έ 검색 (Full-text Search)
    • SQLite의 μ „λ¬Έ 검색 인덱슀λ₯Ό ν™œμš©ν•˜μ—¬ μΆ”κ°€ κ²°κ³Όλ₯Ό 검색
    • BM25 μ•Œκ³ λ¦¬μ¦˜ 기반으둜 λž­ν‚Ή
    • fts ν…Œμ΄λΈ” κΈ°μ€€μœΌλ‘œ fts_metadata ν…Œμ΄λΈ” 등을 JOIN ν•΄ μ‚¬μš©
  4. LLM μ €μž₯μ†Œ λ§΅ (LLM Repo Map)
    • LLM에 "μ €μž₯μ†Œ λ§΅"을 μ œμ‹œν•˜κ³  파일 식별을 μš”μ²­
    • λ‹€μŒκ³Ό 같은 ν”„λ‘¬ν”„νŠΈλ₯Ό μ‚¬μš©
    • // core/context/retrieval/repoMapRequest.ts
      const prompt = `${repoMap}
      
        Given the above repo map, your task is to decide which files are most likely to be relevant in answering a question. Before giving your answer, you should write your reasoning about which files/folders are most important. This thinking should start with a <reasoning> tag, followed by a paragraph explaining your reasoning, and then a closing </reasoning> tag on the last line.
      
        After this, your response should begin with a <results> tag, followed by a list of each file, one per line, and then a closing </results> tag on the last line. You should select between 5 and 10 files. The names that you list should be the full path from the root of the repo, not just the basename of the file.
      
        This is the question that you should select relevant files for: "${input}"`;
  5. μž¬μˆœμœ„ν™” (Reranker)
    • 이전 λ‹¨κ³„μ—μ„œ 얻은 λͺ¨λ“  μ μˆ˜λ“€λ‘œ, (FTS, μž„λ² λ”©, 졜근 νŽΈμ§‘ 파일, μ €μž₯μ†Œ λ§΅)의 μˆœμœ„λ₯Ό μž¬μ‘°μ •
    • LLM 기반 μž¬μˆœμœ„ λͺ¨λΈμ„ μ‚¬μš©ν•΄ μ΅œμ’… 점수
    • λ‹€μŒκ³Ό 같은 few-shot ν”„λ‘¬ν”„νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.
      • // core/context/rerankers/llm.ts
        const prompt = `You are an expert software developer responsible for helping detect whether the retrieved snippet of code is relevant to the query. For a given input, you need to output a single word: "Yes" or "No" indicating the retrieved snippet is relevant to the query.
        
           Query: Where is the FastAPI server?
           Snippet:
           \`\`\`/Users/andrew/Desktop/server/main.py
           from fastapi import FastAPI
           app = FastAPI()
           @app.get("/")
           def read_root():
               return {{"Hello": "World"}}
           \`\`\`
           Relevant: Yes
        
           Query: Where in the documentation does it talk about the UI?
           Snippet:
           \`\`\`/Users/andrew/Projects/bubble_sort/src/lib.rs
           fn bubble_sort<T: Ord>(arr: &mut [T]) {{
               for i in 0..arr.len() {{
                   for j in 1..arr.len() - i {{
                       if arr[j - 1] > arr[j] {{
                           arr.swap(j - 1, j);
                       }}
                   }}
               }}
           }}
           \`\`\`
           Relevant: No
        
           Query: ${query}
           Snippet:
           \`\`\`${documentId}
           ${document}
           \`\`\`
           Relevant: 
           `;
  6. μ΅œμ’… κ²°κ³Ό 제곡 (Top Results)

6-6. Custom RAG in Continue

6-6-1. μž„λ² λ”© λͺ¨λΈ 선택

[!TIP] μΆ”μ²œ λͺ¨λΈ

Continueμ—μ„œ μΆ”μ²œν•˜λŠ” λͺ¨λΈμ€ voyage-code-2

6-6-2. 벑터 DB 선택

  • λŒ€λΆ€λΆ„ 벑터 DB μ‚¬μš©ν•΄λ„ λ¬΄λ°©ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©μ„±μ΄ 쒋은 DBλ₯Ό ꢌμž₯
  • Continue ꢌμž₯ DBλŠ” LanceDB: 인 λ©”λͺ¨λ¦¬ DB

6-6-3. μ²­ν‚Ή μ „λž΅ 선택

votage-code-2 λͺ¨λΈμ€ μ΅œλŒ€ 16,000 토큰

  • Truncate: λ„˜μΉ˜λŠ” 건 μž˜λΌμ„œ 버린닀. (1파일 1청크)
  • chunks of a fixed length: κ³ μ •λœ 길이둜 μ²­ν¬ν•œλ‹€.
  • recursive, (AST)-based strategy: μ •ν™•ν•˜μ§€λ§Œ, λ³΅μž‘ν•˜λ‹€. μ†ŒμŠ€ μ½”λ“œλ₯Ό ν•¨μˆ˜, 쑰건문, 블둝 λ‹¨μœ„λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

6-6-4. 인덱싱 슀크립트 μž‘μ„±

데이터λ₯Ό 검색 κ°€λŠ₯ν•˜λ„λ‘ κ΅¬μ‘°ν™”ν•˜μ—¬ μ €μž₯ν•˜λŠ” κ³Όμ •

(μ²­ν‚Ή -> μž„λ² λ”© 생성 -> 벑터 DB μ‚½μž…)

from lancedb.pydantic import LanceModel, Vector
from lancedb.embeddings import get_registry

db = lancedb.connect("/tmp/db")
func = get_registry().get("openai").create(
    name="voyage-code-2",
    base_url="https://api.voyageai.com/v1/",
    api_key=os.environ["VOYAGE_API_KEY"],
)

class CodeChunks(LanceModel):
    filename: str
    text: str = func.SourceField()
    # 1536 is the embedding dimension of the `voyage-code-2` model.
    vector: Vector(1536) = func.VectorField()

table = db.create_table("code_chunks", schema=CodeChunks, mode="overwrite")
table.add([
    {"text": "print('hello world!')", filename: "hello.py"},
    {"text": "print('goodbye world!')", filename: "goodbye.py"}
])

query = "greetings"
actual = table.search(query).limit(1).to_pydantic(CodeChunks)[0]
print(actual.text)

6-6-5. 인덱싱 슀크립트 μ‹€ν–‰

  • 파일이 변경될 λ•Œ ν•΄λ‹Ή 파일만 μžλ™μœΌλ‘œ 인덱싱
    • 주기적으둜 전체 인덱슀λ₯Ό μƒˆλ‘œ κ³ μΉ˜λŠ” 것도 μΆ©λΆ„νžˆ νš¨κ³Όμ μ΄λ‹€.

6-6-6. μ„œλ²„ μ„€μ •

  • μ»€μŠ€ν…€ RAG에 μ ‘μ†ν•˜κΈ° μœ„ν•œ μ„œλ²„λ₯Ό λ„μ›Œμ•Ό ν•œλ‹€.
  • [POST] /retrieve
@app.post("/retrieve")
async def create_item(item: ContextProviderInput):
    results = [] # TODO: Query your vector database here.

    # Construct the "context item" format expected by Continue
    context_items = []
    for result in results:
        context_items.append({
            "name": result.filename,
            "description": result.filename,
            "content": result.text,
        })

    return context_items

[!TIP] (μ˜΅μ…˜) re-ranking

ContinueλŠ” rerank-1 λͺ¨λΈμ„ μΆ”μ²œν•˜λ‚˜ Voyage AIλŠ” rerank-2 λͺ¨λΈμ„ μΆ”μ²œν•œλ‹€.

rerankingλ₯Ό μœ„ν•œ λ³„λ„μ˜ μ„œλ²„λ₯Ό λ„μ›Œμ•Ό ν•œλ‹€. (e.g. /rerank)

6-7. FAQ

Custom RAG에 별도 μ„œλ²„κ°€ ν•„μš”ν•œ 이유

all embeddings are calculated locally with all-MiniLM-L6-v2 and stored locally in ~/.continue/index.

RAG의 νŠΈλ ˆμ΄λ“œ μ˜€ν”„λŠ”?

  • μž‘μ€ μ²­ν¬λŠ” 원본 λ¬Έμ„œμ˜ 의미λ₯Ό λΆˆμ™„μ „ν•˜κ²Œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
  • μ²­ν‚Ή 크기λ₯Ό 쀄이면 검색 속도가 λΉ¨λΌμ§€μ§€λ§Œ 정확도가 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€. (λ°˜λŒ€μ˜ κ²½μš°λ„ 쑴재)

μž„λ² λ”©λœ λ²‘ν„°λŠ” λ³΄μ•ˆμ μœΌλ‘œ μ•ˆμ „ν• κΉŒ?

  • λ²‘ν„°λŠ” 수치적 ν‘œν˜„μ΄λ©° 데이터 κ·Έ μžμ²΄κ°€ μ•„λ‹ˆλ‹€.
  • 벑터λ₯Ό 톡해 μœ μ‚¬ν•œ 원본 λ¬Έμ„œ λ˜λŠ” 데이터λ₯Ό κ²€μƒ‰ν•˜μ—¬ 그것을 λ°˜ν™˜ν•˜λŠ” 것이닀.

6-8. Chat_Customize_with_RAG

  • ν”„λ‘œμ νŠΈ 전체 μ½”λ“œλ² μ΄μŠ€λ₯Ό λŒ€μƒμœΌλ‘œ 정보λ₯Ό κ²€μƒ‰ν•˜κ±°λ‚˜, νŠΉμ • 폴더λ₯Ό λŒ€μƒμœΌλ‘œ ν•  수 μžˆλ‹€.
  • 벑터 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μ Έμ˜¬ κ²°κ³Ό, μ‚¬μš©ν•  κ²½κ³Ό, μž¬λž­ν‚Ή κΈ°λŠ₯ μ‚¬μš© μ—¬λΆ€ λ₯Ό μ„€μ •ν•  수 μžˆλ‹€.

μ»€μŠ€ν…€ RAG 생성

  • μž„λ² λ”© λͺ¨λΈ 선택, 벑터 데이트베이슀 μ„€μ •, ν…μŠ€νŠΈ μ²­ν‚Ή μ „λž΅ 쑰절

@docs μ„€μ •

  • νŠΉμ • λ¬Έμ„œλ₯Ό 제곡
  • 라이브러리 κ³΅μ‹λ¬Έμ„œ URL을 μ§€μ •ν•˜λŠ” λ“±μœΌλ‘œ ν™œμš©ν•  수 μžˆλ‹€.
    (e.g., @docs API endpoints for Continue)

context provider 생성

  • κ³ μœ ν•œ ν”„λ‘œλ°”μ΄λ”λ₯Ό 생성할 수 μžˆλ‹€.
    (e.g., νšŒμ‚¬ λ‚΄λΆ€μ˜ 맀뉴얼을 μ»¨ν…μŠ€νŠΈλ‘œ μ œκ³΅ν•˜λŠ” ν”„λ‘œλ°”μ΄λ” 생성 λ“±)

[!IMPORTANT]

핡심은 Chatμ—μ„œ μ‚¬μš©ν•  Contextλ₯Ό μ–΄λ–»κ²Œ μ œκ³΅ν• μ§€ κ²°μ •ν•˜λŠ” 것

6-9. Chat_LLM

6-9-1. 데이터 μˆ˜μ§‘

  • λ‹€μ–‘ν•œ 좜처
  • μ–Έμ–΄ λ‹€μ–‘μ„±

6-9-2. 데이터 μ „μ²˜λ¦¬

  • 토큰화(Tokenization)
  • μ–΄νœ˜ 사전 ꡬ좕

[!TIP]

일반적인 μš°λ¦¬κ°€ μƒκ°ν•˜λŠ” 단어 뿐만 μ•„λ‹ˆλΌ, 자주 μ“°μ΄λŠ” λ¬Έμž₯ 같은 것을 ν•˜λ‚˜μ˜ 토큰 λ‹¨μœ„λ‘œλ„ λ§Œλ“€ 수 μžˆλ‹€.

6-9-3. λͺ¨λΈ ν•™μŠ΅

  • 트랜슀포머 μ•„ν‚€ν…μ²˜
  • μ–Έμ–΄ λͺ¨λΈλ§: λ‹€μŒ 단어 예츑(Next Token Prediction) λ˜λŠ” λ§ˆμŠ€ν‚Ήλœ 단어 볡원(Masked Language Modeling)을 톡해 μ–Έμ–΄ νŒ¨ν„΄μ„ ν•™μŠ΅
    • → 이런 방법이기에 Pretrain만 λ˜μ–΄μžˆλŠ” LLM은 λ‹€μŒ λ‹¨μ–΄λ§Œ 예츑 κ°€λŠ₯ν•˜λ‹€.
    • input으둜 λ“€μ–΄κ°„ λ¬Έμž₯의 λ‹€μŒ 것을 μžμ—°μŠ€λŸ½κ²Œ 이어주도둝 예츑
      (λ‹€μŒ 단어λ₯Ό μ˜ˆμΈ‘ν•œ 것을 μ‚¬μš©ν•΄μ„œ 계속 μ˜ˆμΈ‘ν•˜κ³ , μ΅œμ’…μœΌλ‘œ End 토큰이 λ‚˜μ˜¬ λ•ŒκΉŒμ§€ 계속 예츑)

6-9-4. λ―Έμ„Έ μ‘°μ • (Fine-tuning)

  • νŠΉμ • νƒœμŠ€ν¬μ— 맞좘 μ‘°μ •

LLM을 효과적인 μ±—λ΄‡μœΌλ‘œ ν™œμš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹¨μˆœν•œ μ–Έμ–΄ 생성 λŠ₯λ ₯ 외에도 μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš©μ„ μ›ν™œν•˜κ²Œ ν•˜λŠ” 좔가적인 μš”μ†Œλ“€μ΄ ν•„μš”ν•˜λ‹€.

 

1. λŒ€ν™” λ°μ΄ν„°λ‘œ λ―Έμ„Έ μ‘°μ •

  • λŒ€ν™”ν˜• 데이터셋 μ‚¬μš©
  • μ—­ν•  λΆ€μ—¬

2. μ»¨ν…μŠ€νŠΈ μœ μ§€ 및 관리

  • λŒ€ν™” νžˆμŠ€ν† λ¦¬ 좔적
  • μ„Έμ…˜ 관리
  • κΈ°μ–΅ λŠ₯λ ₯ ν™•μž₯

3. μ•ˆμ „ν•˜κ³  윀리적인 응닡 생성

  • 필터링 및 κ²€μ—΄
  • 편ν–₯ 제거
  • 윀리 κ°€μ΄λ“œλΌμΈ μ€€μˆ˜

6-9-5. Multi-turn

μ‚¬μš©μžμ™€ 챗봇 κ°„μ˜ μ—¬λŸ¬ 차둀에 걸친 μƒν˜Έμž‘μš©μ„ μ˜λ―Έν•˜λ©°, μžμ—°μŠ€λŸ½κ³  μœ μ˜λ―Έν•œ λŒ€ν™”λ₯Ό μœ„ν•΄ ν•„μˆ˜μ μ΄λ‹€.

 

1. μ»¨ν…μŠ€νŠΈ 이해 및 μœ μ§€

  • μ°Έμ‘° ν•΄μ†Œ
  • 주제 μ „ν™˜ 처리
  • μ•”μ‹œμ  정보 μΆ”λ‘ 

2. λŒ€ν™” 흐름 관리

  • λŒ€ν™” μƒνƒœ 좔적(Dialogue State Tracking)
  • λŒ€ν™” μ •μ±…(Dialgue Policy)
  • μ—λŸ¬ 처리 및 볡ꡬ

3. 기술적 κ΅¬ν˜„

  • λ©”λͺ¨λ¦¬ λ©”μ»€λ‹ˆμ¦˜
  • μ™ΈλΆ€ λ©”λͺ¨λ¦¬ μ‚¬μš©
  • μš”μ•½ 및 μ••μΆ•

 

7. Edit, Actions

7-1. Edit

  • ν˜„μž¬ νŒŒμΌμ„ λ²—μ–΄λ‚˜μ§€ μ•Šκ³  μ½”λ“œ μˆ˜μ •μ„ μ‰½κ²Œ ν•  수 μžˆλŠ” 방법
  • μ›ν•˜λŠ” μ½”λ“œ 블둝을 ν•˜μ΄λΌμ΄νŠΈν•˜κ³  ν”„λ‘¬ν”„νŠΈλ₯Ό μž…λ ₯ν•˜λ©΄ μ›ν•˜λŠ” λ³€κ²½ 사항이 인라인으둜 νŒŒμΌμ— μŠ€νŠΈλ¦¬λ°λ˜μ–΄ λ‚˜νƒ€λ‚˜κ³ , 이λ₯Ό accept / reject ν•  수 μžˆλ‹€.

μ‚¬μš© 방법

  1. μ½”λ“œ 블둝 ν•˜μ΄λΌμ΄νŠΈ (cmd/ctrl + i)
  2. λ³€κ²½ 사항 μ„€λͺ…
  3. λ³€κ²½ 사항 수용 λ˜λŠ” κ±°λΆ€ :
    • μ œμ•ˆλœ λ³€κ²½ 사항은 κ°•μ‘°λœ ν…μŠ€νŠΈ λ‚΄μ—μ„œ 인라인 diff둜 λ‚˜νƒ€λ‚œλ‹€.
    • Accept : (cmd/ctrl + opt + y)
    • Reject : (cmd/ctrl + opt + n)
    • All Accept : (cmd/ctrl + shift + enter)
    • All Reject : (cmd/ctrl + shift + delete)
  4. μƒˆλ‘œμš΄ μ œμ•ˆ μš”μ²­ : (cmd/ctrl + i)

[!TIP] πŸ’‘ Context Selection

  • ν•˜μ΄λΌμ΄νŠΈλœ μ½”λ“œ:
    • μ‚¬μš©μžκ°€ μ„ νƒν•œ κ°•μ‘° ν‘œμ‹œλœ μ½”λ“œλŠ” ν”„λ‘¬ν”„νŠΈμ— ν¬ν•¨λ˜λ©°, λͺ¨λΈμ΄ μˆ˜μ •ν•  μ½”λ“œ μ„Ήμ…˜μ΄ λœλ‹€.
    • λͺ¨λΈμ€ 이 μ½”λ“œ λΈ”λ‘λ§Œμ„ λŒ€μƒμœΌλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
  • ν˜„μž¬ 파일:
    • ν•˜μ΄λΌμ΄νŠΈν•œ μ½”λ“œκ°€ ν¬ν•¨λœ 파일의 전체 λ‚΄μš©μ΄ 좔가적인 μ»¨ν…μŠ€νŠΈλ‘œ μ œκ³΅λœλ‹€.
    • μ΄λŠ” λͺ¨λΈμ΄ μ½”λ“œ μˆ˜μ • μ‹œ 더 μ μ ˆν•œ νŒλ‹¨μ„ ν•˜λ„λ‘ λ•λŠ”λ‹€.
    • λ§Œμ•½ 파일이 λ„ˆλ¬΄ μ»€μ„œ μ»¨ν…μŠ€νŠΈ 창에 λ§žμ§€ μ•ŠλŠ” 경우, 파일 λ‚΄μš©μ„ μž˜λΌλ‚΄μ–΄ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰λœλ‹€.

 

μ‚¬μš© 예

  • 주석 μΆ”κ°€
  • λ‹¨μœ„ ν…ŒμŠ€νŠΈ 생성
  • ν•¨μˆ˜ λ¦¬νŒ©ν† λ§

7-2. Actions

자주 μ‚¬μš©ν•˜λŠ” μž‘μ—…μ„ λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•  수 μžˆλŠ” 단좕킀 κΈ°λŠ₯이닀.

7-2-1. μ‚¬μš© 방법

1. Slash λͺ…λ Ήμ–΄ μ‚¬μš©ν•˜κΈ°:

  • Slash λͺ…λ Ήμ–΄λŠ” κ°€μž₯ 일반적인 λ°©λ²•μœΌλ‘œ, /λ₯Ό μž…λ ₯ν•˜λ©΄ λ“œλ‘­λ‹€μš΄ 메뉴가 λ‚˜νƒ€λ‚œλ‹€.
  • e.g., /edit λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ νŽΈμ§‘μ„ 직접 에디터에 슀트리밍 κ°€λŠ₯

기본적으둜 μ‚¬μš©ν•  수 μžˆλŠ” μœ μš©ν•œ λͺ…λ Ήμ–΄λŠ” /edit, /comment, /share

  • Slash λͺ…λ Ήμ–΄ μ„€λͺ… λͺ¨μŒ
    • /edit
    • /comment
    • /share
    • /cmd
    • /commit
    • /http
    • /issue
    • /so
    • /onboard

Continue의 λ‚΄μž₯ Slash λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ~/.continue/config.json νŒŒμΌμ—μ„œ slashCommands λͺ©λ‘μ— μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

 

2. ν”„λ‘¬ν”„νŠΈ 파일 μ‚¬μš©ν•˜κΈ°:

  • .prompt νŒŒμΌμ„ μž‘μ„±ν•΄μ„œ 파일, URL, κ°•μ‘°λœ μ½”λ“œ 등을 μ°Έμ‘°ν•˜λŠ” μžμ‹ λ§Œμ˜ Slash λͺ…λ Ήμ–΄λ₯Ό μ •μ˜ κ°€λŠ₯
    • e.g., test.prompt νŒŒμΌμ„ λ§Œλ“€μ–΄ jestλ₯Ό μ‚¬μš©ν•˜λŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈ 생성 λͺ…λ Ήμ–΄λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
  • λΉ λ₯Έ μ‹œμž‘μ„ μœ„ν•΄ 제곡된 .prompt 파일 라이브러리λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

7-2-2. 기타 트리거

1. Quick Actions

  • μƒμœ„ ν΄λž˜μŠ€λ‚˜ ν•¨μˆ˜ μœ„μ— λ²„νŠΌ ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚˜λ©°, ν•œ 번의 클릭으둜 μ•‘μ…˜μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.
  • .prompt νŒŒμΌμ„ μ‚¬μš©ν•΄ μ»€μŠ€ν…€ 퀡 μ•‘μ…˜μ„ μ„€μ •ν•  수 μžˆλ‹€.
  • 기본적으둜 λΉ„ν™œμ„±ν™” μƒνƒœμ΄λ©°, VS Code μ„€μ •μ—μ„œ "Continue: Enable Quick Actions"λ₯Ό 톡해 ν™œμ„±ν™”ν•  수 μžˆλ‹€.

2. Right Click Actions

  • μ›ν•˜λŠ” μ½”λ“œ 블둝을 κ°•μ‘°ν•˜κ³ , 였λ₯Έμͺ½ 클릭 ν›„ μ•‘μ…˜μ„ μ„ νƒν•˜μ—¬ μ‹€ν–‰

3. Debug Action

  • ν„°λ―Έλ„μ˜ λ‚΄μš©μ„ λΉ λ₯΄κ²Œ λ³΅μ‚¬ν•˜κ³ , cmd/ctrl + shift + R을 눌러 μ±„νŒ… μ‚¬μ΄λ“œλ°”μ— λΆ™μ—¬λ„£μ–΄ 디버깅 쑰언을 받을 수 μžˆλ‹€.

4. Quick Fixes

  • μ½”λ“œμ— 빨간색/λ…Έλž€μƒ‰ 밑쀄이 μžˆμ„ 경우, κ·Όμ²˜μ— μ»€μ„œλ₯Ό λ†“μœΌλ©΄ 전ꡬ μ•„μ΄μ½˜ 생성
  • 전ꡬλ₯Ό ν΄λ¦­ν•˜κ±°λ‚˜ cmd/ctrl + .을 눌러 퀡 ν”½μŠ€λ₯Ό ν™œμ„±ν™”ν•˜κ³ , "Ask Continue" μ•‘μ…˜μ„ 선택

μž₯점

  • λΉ λ₯Έ μ•‘μ„ΈμŠ€
  • μ»€μŠ€ν„°λ§ˆμ΄μ§• κ°€λŠ₯
  • 톡합

단점

  • μ œν•œλœ 에디터
  • λ³΅μž‘μ„±

7-3. μ£Όμ˜μ‚¬ν•­ 및 μ‚¬μš©νŒ

Edit

  • Edit의 νŠΉμ§•μ€ IDE μž…λ ₯μ°½μ—μ„œ λ°”λ‘œ μˆ˜μ •μ΄ μ΄λ£¨μ–΄μ§„λ‹€λŠ” 것.
  • κ·ΈλŸ¬λ‚˜ 즉각적인 μˆ˜μ •μ— νŠΉν™”λœ 만큼, λ„ˆλ¬΄ κ³Όλ„ν•œ μˆ˜μ • μš”μ²­μ€ 였히렀 ν’ˆμ§ˆ μ €ν•˜λ‘œ μ΄μ–΄μ§ˆ 수 μžˆλ‹€. (μ½”λ“œ 일뢀가 λˆ„λ½λ  κ°€λŠ₯성도 μžˆλ‹€)
  • Edit κΈ°λŠ₯은 ν•˜μ΄λΌμ΄νŠΈλœ 뢀뢄에 μ§‘μ€‘ν•˜λ―€λ‘œ, 파일 전체에 λŒ€ν•œ 이해가 ν•„μš”ν•œ μˆ˜μ •μ΄λΌλ©΄ Chatμ΄λ‚˜ Actionsλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

Actions

  • λ‹€μ–‘ν•œ κΈ°λŠ₯을 Actions둜 ν™œμš©ν•΄ λ³„λ„μ˜ ν”„λ‘¬ν”„νŠΈ μž‘μ„± 없이 λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ»€μŠ€ν„°λ§ˆμ΄μ§•μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” μž₯점이 μžˆλ‹€. 자주 μ‚¬μš©ν•˜λŠ” 반볡적인 μž‘μ—…μ„ Actions의 prompt둜 정해두면 μž‘μ—… 속도와 정확도가 크게 ν–₯상될 수 μžˆλ‹€.
  • Actions promptλ₯Ό λ„ˆλ¬΄ 길게 μž‘μ„±ν•˜λ©΄ Contextλ₯Ό 적게 넣을 μˆ˜λ°–μ— μ—†μœΌλ‹ˆ LLM μ΅œμ ν™” 기법 등을 ν™œμš©ν•΄ κ°„κ²°ν•˜κ³  효율적인 ν”„λ‘¬ν”„νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€.
  • Actionsλ₯Ό ν™œμš©ν•˜λ©΄ ν„°λ―Έλ„μ—μ„œ λ°œμƒν•œ 였λ₯˜μ— λŒ€ν•΄μ„œλ„ Continueλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

[!TIP]

Edit, Actions λͺ¨λ‘ κ³΅ν†΅μ μœΌλ‘œ νŒŒλΌλ―Έν„°κ°€ 400λΉŒλ¦¬μ–Έ 이상인 λͺ¨λΈμ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

'What I Learn' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

scroll 이벀트λ₯Ό μ‚¬μš©ν•œ λ¬΄ν•œ 슀크둀 κ΅¬ν˜„  (1) 2024.10.27
Next.js 병렬 λΌμš°νŒ… & 경둜 κ°€λ‘œμ±„κΈ°λ₯Ό ν†΅ν•œ λͺ¨λ‹¬ νŽ˜μ΄μ§€ κ΅¬ν˜„  (1) 2024.10.27
next-authλ₯Ό μ‚¬μš©ν•œ 카카였 둜그인  (4) 2024.10.22
exclude a page from next.js root layout  (0) 2024.10.16
OSSCA: customize prompt & set a completionOptions in Continue  (2) 2024.10.02
'What I Learn' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • scroll 이벀트λ₯Ό μ‚¬μš©ν•œ λ¬΄ν•œ 슀크둀 κ΅¬ν˜„
  • Next.js 병렬 λΌμš°νŒ… & 경둜 κ°€λ‘œμ±„κΈ°λ₯Ό ν†΅ν•œ λͺ¨λ‹¬ νŽ˜μ΄μ§€ κ΅¬ν˜„
  • next-authλ₯Ό μ‚¬μš©ν•œ 카카였 둜그인
  • exclude a page from next.js root layout
nuew
nuew
🀸 재주 λ„˜λŠ” 쀑
  • nuew
    bloggg. . .πŸ¦–πŸ’₯
    nuew
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (88)
      • issue (10)
      • baekjoon (41)
      • lecture recap (11)
      • What I Learn (26)
      • retrospective (0)
      • maeil-mail (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    μ½”λ”©ν…ŒμŠ€νŠΈ
    TailwindCSS
    Study
    css
    modal
    media-query
    λ°±μ€€
    μžλ°”μŠ€ν¬λ¦½νŠΈ
    Baekjoon
    js
    ν•œμž…ν¬κΈ°λ‘œμž˜λΌλ¨ΉλŠ”νƒ€μž…μŠ€ν¬λ¦½νŠΈ
    μ•Œκ³ λ¦¬μ¦˜
    Algorithm
    Node.js
    JavaScript
    ν•œμž…ν¬κΈ°λ‘œ μž˜λΌλ¨ΉλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ
    issue
    what i learn
    zustand
    TypeScript
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
nuew
OSSCA: LLM 쑰사, Continue 뢄석 및 정리
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”