From 0bb8e990ff30b6af6384dea1a2992d9e5917272a Mon Sep 17 00:00:00 2001 From: wony617 <49024958+Jwaminju@users.noreply.github.com> Date: Sun, 4 Jan 2026 23:24:10 +0900 Subject: [PATCH 1/3] Add conceptual_guides translation for intro_agents.md --- .../ko/conceptual_guides/intro_agents.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 docs/source/ko/conceptual_guides/intro_agents.md diff --git a/docs/source/ko/conceptual_guides/intro_agents.md b/docs/source/ko/conceptual_guides/intro_agents.md new file mode 100644 index 000000000..97d4aa311 --- /dev/null +++ b/docs/source/ko/conceptual_guides/intro_agents.md @@ -0,0 +1,37 @@ +# 에이전트란 무엇인가요? 🤔 + +## 에이전트 시스템 소개 + +AI를 사용하는 모든 효율적인 시스템은 LLM에 실제 세계에 대한 어떤 종류의 접근을 제공해야 합니다: 예를 들어 외부 정보를 얻기 위해 검색 도구를 호출할 수 있는 가능성, 또는 작업을 해결하기 위해 특정 프로그램에 작용할 수 있는 기능입니다. 다시 말해서, LLM은 ***주체성(agency)***을 가져야 합니다. 에이전트 프로그램은 LLM의 외부 세계로 가는 관문입니다. + +> [!TIP] +> AI 에이전트는 **LLM 출력이 워크플로우를 제어하는 프로그램**입니다. + +LLM을 활용하는 모든 시스템은 LLM 출력을 코드로 통합합니다. LLM의 입력이 코드 워크플로우에 미치는 영향은 시스템에서 LLM의 주체성(agency) 수준입니다. + +이 정의에서 "에이전트"는 0 또는 1의 이산 정의가 아닙니다: 대신 "주체성"은 워크플로우에서 LLM에 얼마나 많은 권한을 부여하느냐에 따라 연속 스펙트럼에서 발전합니다. + +아래 표에서 주체성이 시스템 간에 어떻게 변할 수 있는지 확인하세요: + +| 주체성 수준 | 설명 | 짧은 이름 | 예시 코드 | +| --- | --- | --- | --- | +| ☆☆☆ | LLM 출력이 프로그램 흐름에 영향을 주지 않음 | 단순 처리기 | `process_llm_output(llm_response)` | +| ★☆☆ | LLM 출력이 if/else 스위치를 제어 | 라우터 | `if llm_decision(): path_a() else: path_b()` | +| ★★☆ | LLM 출력이 함수 실행을 제어 | 도구 호출 | `run_function(llm_chosen_tool, llm_chosen_args)` | +| ★★☆ | LLM 출력이 반복 및 프로그램 연속을 제어 | 다중 단계 에이전트 | `while llm_should_continue(): execute_next_step()` | +| ★★★ | 하나의 에이전트 워크플로우가 다른 에이전트 워크플로우를 시작할 수 있음 | 다중 에이전트 | `if llm_trigger(): execute_agent()` | +| ★★★ | LLM이 코드로 작동하며 자체 도구를 정의하거나 다른 에이전트를 시작할 수 있음 | 코드 에이전트 | `def custom_tool(args): ...` | + +## ✅ 에이전트를 사용해야 할 때 / ⛔ 피해야 할 때 + +에이전트는 LLM이 앱의 워크플로우를 결정해야 할 때 유용합니다. 하지만 종종 과도합니다. 질문은 다음과 같습니다: 현재 작업을 효율적으로 해결하기 위해 정말로 워크플로우의 유연성이 필요한가요? + +## Why `smolagents`? + +체인이나 라우터와 같은 일부 저수준 에이전트 사용 사례의 경우, 모든 코드를 직접 작성할 수 있습니다. 이렇게 하면 훨씬 더 나을 것입니다. 왜냐하면 당신의 시스템을 더 잘 제어하고 이해할 수 있게 해주기 때문입니다. + +## 코드 에이전트 + +다중 단계 에이전트에서, 각 단계에서 LLM은 외부 도구에 대한 호출 형식의 작업을 작성할 수 있습니다. [여러 개의](https://huggingface.co/papers/2402.01030) [연구](https://huggingface.co/papers/2411.01747) [논문](https://huggingface.co/papers/2401.00812)에서 LLM 작업을 코드 스니펫으로 작성하는 것이 더 자연스럽고 유연한 방식임을 보여주었습니다. + +그 이유는 간단합니다: *우리는 코드 언어를 컴퓨터가 수행하는 작업을 표현하기 위해 특별히 만들었습니다*. \ No newline at end of file From f309377e7be4d24140791b2b84ec5977f9e13bb9 Mon Sep 17 00:00:00 2001 From: wony617 <49024958+Jwaminju@users.noreply.github.com> Date: Thu, 8 Jan 2026 02:01:45 +0900 Subject: [PATCH 2/3] Add conceptual_guides translation for intro_agents.md --- .../ko/conceptual_guides/intro_agents.md | 111 ++++++++++++++---- 1 file changed, 90 insertions(+), 21 deletions(-) diff --git a/docs/source/ko/conceptual_guides/intro_agents.md b/docs/source/ko/conceptual_guides/intro_agents.md index 97d4aa311..945e163c7 100644 --- a/docs/source/ko/conceptual_guides/intro_agents.md +++ b/docs/source/ko/conceptual_guides/intro_agents.md @@ -1,37 +1,106 @@ -# 에이전트란 무엇인가요? 🤔 +# 에이전트란 무엇일까요? 🤔 -## 에이전트 시스템 소개 +## 에이전틱 시스템 소개 -AI를 사용하는 모든 효율적인 시스템은 LLM에 실제 세계에 대한 어떤 종류의 접근을 제공해야 합니다: 예를 들어 외부 정보를 얻기 위해 검색 도구를 호출할 수 있는 가능성, 또는 작업을 해결하기 위해 특정 프로그램에 작용할 수 있는 기능입니다. 다시 말해서, LLM은 ***주체성(agency)***을 가져야 합니다. 에이전트 프로그램은 LLM의 외부 세계로 가는 관문입니다. +AI를 사용하는 효율적인 시스템은 LLM이 실세계에 접근할 수 있는 방법을 제공해야 합니다. 예를 들어, 외부 정보를 얻기 위해 검색 도구를 호출하거나, 특정 프로그램을 실행하여 작업을 해결할 수 있어야 합니다. 다시 말해, LLM은 ***에이전시(agency)***를 가져야 합니다. 에이전트 프로그램은 LLM이 외부 세계에 접근하는 게이트웨이입니다. > [!TIP] -> AI 에이전트는 **LLM 출력이 워크플로우를 제어하는 프로그램**입니다. +> AI 에이전트는 **LLM 출력물이 워크플로우를 제어하는 프로그램**입니다. -LLM을 활용하는 모든 시스템은 LLM 출력을 코드로 통합합니다. LLM의 입력이 코드 워크플로우에 미치는 영향은 시스템에서 LLM의 주체성(agency) 수준입니다. +LLM을 활용하는 모든 시스템은 LLM 출력을 코드에 통합합니다. LLM 입력이 코드 워크플로우에 미치는 영향력이 시스템 내에서 LLM의 에이전시 수준입니다. -이 정의에서 "에이전트"는 0 또는 1의 이산 정의가 아닙니다: 대신 "주체성"은 워크플로우에서 LLM에 얼마나 많은 권한을 부여하느냐에 따라 연속 스펙트럼에서 발전합니다. +이 정의에 따르면, "에이전트"는 이산적인 0 또는 1의 정의가 아니라, 워크플로우에서 LLM에 더 많거나 적은 권한을 부여함에 따라 "에이전시"가 연속적인 스펙트럼으로 진화합니다. -아래 표에서 주체성이 시스템 간에 어떻게 변할 수 있는지 확인하세요: +아래 표에서 시스템별 에이전시 수준 변화를 확인하세요: -| 주체성 수준 | 설명 | 짧은 이름 | 예시 코드 | -| --- | --- | --- | --- | -| ☆☆☆ | LLM 출력이 프로그램 흐름에 영향을 주지 않음 | 단순 처리기 | `process_llm_output(llm_response)` | -| ★☆☆ | LLM 출력이 if/else 스위치를 제어 | 라우터 | `if llm_decision(): path_a() else: path_b()` | -| ★★☆ | LLM 출력이 함수 실행을 제어 | 도구 호출 | `run_function(llm_chosen_tool, llm_chosen_args)` | -| ★★☆ | LLM 출력이 반복 및 프로그램 연속을 제어 | 다중 단계 에이전트 | `while llm_should_continue(): execute_next_step()` | -| ★★★ | 하나의 에이전트 워크플로우가 다른 에이전트 워크플로우를 시작할 수 있음 | 다중 에이전트 | `if llm_trigger(): execute_agent()` | -| ★★★ | LLM이 코드로 작동하며 자체 도구를 정의하거나 다른 에이전트를 시작할 수 있음 | 코드 에이전트 | `def custom_tool(args): ...` | +| 에이전시 수준 | 설명 | 약칭 | 예제 코드 | +| ------------ | ---------------------------------------------------------- | ---------- | ---------------------------------------------- | +| ☆☆☆ | LLM 출력물이 프로그램 흐름에 영향을 미치지 않음 | 단순 처리기 | `process_llm_output(llm_response)` | +| ★☆☆ | LLM 출력물이 if/else 분기를 제어 | 라우터 | `if llm_decision(): path_a() else: path_b()` | +| ★★☆ | LLM 출력물이 함수 실행을 제어 | 도구 호출 | `run_function(llm_chosen_tool, llm_chosen_args)` | +| ★★☆ | LLM 출력물이 반복 및 프로그램 진행 제어 | 멀티스텝 에이전트 | `while llm_should_continue(): execute_next_step()` | +| ★★★ | 한 에이전틱 워크플로우가 다른 에이전틱 워크플로우 시작 | 멀티 에이전트 | `if llm_trigger(): execute_agent()` | +| ★★★ | LLM이 코드 내에서 직접 작동, 자신의 도구를 정의하거나 다른 에이전트를 시작 | 코드 에이전트 | `def custom_tool(args): ...` | -## ✅ 에이전트를 사용해야 할 때 / ⛔ 피해야 할 때 +멀티스텝 에이전트의 코드 구조는 다음과 같습니다: -에이전트는 LLM이 앱의 워크플로우를 결정해야 할 때 유용합니다. 하지만 종종 과도합니다. 질문은 다음과 같습니다: 현재 작업을 효율적으로 해결하기 위해 정말로 워크플로우의 유연성이 필요한가요? +```python +memory = [user_defined_task] +while llm_should_continue(memory): # 이 루프가 멀티스텝 부분입니다 + action = llm_get_next_action(memory) # 이것이 도구 호출 부분입니다 + observations = execute_action(action) + memory += [action, observations] +``` -## Why `smolagents`? +이 에이전틱 시스템은 루프 내에서 각 단계마다 새로운 동작을 실행합니다(이 동작에는 단순 함수인 사전 정의된 *도구*를 호출하는 것도 포함됨). 관찰 결과 주어진 작업을 해결하는 데 만족스러운 상태에 도달했음을 알게 될 때까지 계속됩니다. 아래는 멀티스텝 에이전트가 간단한 수학 문제를 해결하는 예시입니다: -체인이나 라우터와 같은 일부 저수준 에이전트 사용 사례의 경우, 모든 코드를 직접 작성할 수 있습니다. 이렇게 하면 훨씬 더 나을 것입니다. 왜냐하면 당신의 시스템을 더 잘 제어하고 이해할 수 있게 해주기 때문입니다. +
+ +
+ + +## ✅ 에이전트를 언제 사용하고 ⛔ 언제 피해야 할까요 + +에이전트는 앱 워크플로우를 LLM이 결정해야 할 때 유용합니다. 그러나 이것은 과도한 사용일 수 있습니다. 질문은: 주어진 작업을 효율적으로 해결하는 데 워크플로우의 유연성이 정말 필요한가? 입니다. +사전 정의된 워크플로우가 자주 부족하다면, 더 많은 유연성이 필요하다는 의미입니다. +예를 들어, 서핑 여행 웹사이트에서 고객 요청을 처리하는 앱을 만든다고 가정해 봅시다. + +요청이 사용자 선택에 따라 두 가지 버킷 중 하나에 속할 것을 미리 알고 있고, 각각에 대해 사전 정의된 워크플로우가 있을 수 있습니다. + +1. 여행에 관한 지식이 필요한가요? ⇒ 검색 창을 통해 지식 베이스를 검색할 수 있도록 합니다 +2. 영업팀과 이야기하고 싶나요? ⇒ 연락처 양식을 작성할 수 있게 합니다. + +그 결정론적 워크플로우가 모든 쿼리에 맞으면 전부 코딩하세요! 이렇게 하면 예측 불가능한 LLM이 워크플로우에 개입해도 오류 위험 없이 100% 신뢰할 수 있는 시스템을 얻습니다. 단순성과 견고함을 위해 에이전트 사용을 피하는 방향으로 규칙화하는 것이 좋습니다. + +하지만 워크플로우를 그렇게 미리 결정할 수 없다면? + +예를 들어, 사용자가 이렇게 질문하고 싶을 수 있습니다: `"월요일에 올 수 있는데 여권을 잊어 수요일까지 지연될 위험이 있어요. 화요일 아침에 저와 짐을 서핑하러 데려갈 수 있고, 취소 보험도 있나요?"` 이 질문은 여러 요인에 달려 있어, 아마 위에서 미리 정해둔 기준으로는 해결되지 않을 것입니다. + +사전 정의된 워크플로우가 자주 부족하다면, 더 많은 유연성이 필요합니다. + +바로 그런 경우 에이전틱 시스템이 도움이 됩니다. + +위의 예에서는, 기상 예보를 위한 날씨 API, 거리 계산을 위한 구글 맵 API, 직원 가용성 대시보드, RAG 시스템이 있는 지식 베이스에 접근할 수 있는 멀티스텝 에이전트를 만들 수 있습니다. + +최근까지만 해도 컴퓨터 프로그램은 사전 정의된 워크플로우에 제한되었고, if/else 분기를 쌓아서 복잡함을 처리하려 했습니다. 그들은 "이 숫자들의 합을 계산하라"거나 "이 그래프에서 최단 경로를 찾아라"와 같이 아주 좁은 작업에만 집중했습니다. 하지만 사실 우리의 여행 예제처럼 대부분의 실제 업무는 사전 정의된 워크플로우에 맞지 않습니다. 에이전틱 시스템은 실제 작업의 광범위한 세계를 프로그램에 열어줍니다! + +## 왜 `smolagents`인가? + +체인이나 라우터 같은 저수준 에이전틱 사용 사례는 모두 코드를 직접 작성할 수 있습니다. 그게 더 좋습니다. 시스템을 더 잘 제어하고 이해할 수 있기 때문입니다. + +하지만 LLM이 함수 호출을 하게 하거나("도구 호출"), LLM이 while 루프를 실행하게 하는("멀티스텝 에이전트") 등 더 복잡한 동작이 필요할 때는 추상화가 필요해집니다: +- 도구 호출의 경우, 에이전트 출력을 파싱해야 하므로 "Thought: I should call tool 'get_weather'. Action: get_weather(Paris)."처럼 사전 정의된 형식을 사용해야 하며, 이 출력을 파싱하는 함수와 LLM에 이 형식을 알려주는 시스템 프롬프트가 필요합니다. +- LLM 출력이 루프를 결정하는 멀티스텝 에이전트는 마지막 루프 반복에서 일어난 일을 바탕으로 다른 프롬프트를 주어야 하므로 일종의 메모리가 필요합니다. + +이 두 가지 예만으로도 다음 항목들이 필요함을 알 수 있습니다: + +- 시스템을 구동하는 엔진 역할을 하는 LLM +- 에이전트가 사용할 수 있는 도구 목록 +- 에이전트 논리를 안내하는 시스템 프롬프트: 반사 -> 행동 -> 관찰 순환(ReAct), 사용 가능한 도구, 도구 호출 형식 등 +- 시스템 프롬프트에 표시된 형식에 따라 LLM 출력에서 도구 호출을 추출하는 파서 +- 메모리 + +하지만 LLM의 결정에 여지를 주므로, 실수가 발생할 수 있어 오류 로깅과 재시도 메커니즘도 필요합니다. + +이 모든 요소는 잘 작동하는 시스템을 구축하기 위해 밀접하게 결합되어야 합니다. 그래서 우리는 이 모든 것을 함께 작동하게 하는 기본 빌딩 블록을 만들기로 했습니다. ## 코드 에이전트 -다중 단계 에이전트에서, 각 단계에서 LLM은 외부 도구에 대한 호출 형식의 작업을 작성할 수 있습니다. [여러 개의](https://huggingface.co/papers/2402.01030) [연구](https://huggingface.co/papers/2411.01747) [논문](https://huggingface.co/papers/2401.00812)에서 LLM 작업을 코드 스니펫으로 작성하는 것이 더 자연스럽고 유연한 방식임을 보여주었습니다. +멀티스텝 에이전트는 각 단계에서 LLM이 외부 도구 호출 형식의 동작을 작성합니다. (Anthropic, OpenAI, 기타 여러 곳에서 사용하는) 일반적인 형식은 "도구 이름과 인수를 담은 JSON 형식의 동작을 작성하고, 파싱하여 어떤 도구를 어떤 인수로 실행할지 결정하는" 것입니다. + +[다수의](https://huggingface.co/papers/2402.01030) [연구](https://huggingface.co/papers/2411.01747) [논문](https://huggingface.co/papers/2401.00812) 에서 LLM 동작을 코드 스니펫으로 작성하는 것이 더 자연스럽고 유연한 방식임을 보여주었습니다. + +그 이유는 단순히 *우리는 컴퓨터가 수행하는 동작을 표현하기 위해 코드 언어를 특별히 설계했기 때문입니다*. + +즉, 우리의 에이전트는 사용자의 문제를 해결하기 위해 프로그램을 작성할 것이며, Python 블록으로 프로그래밍하는 것이 JSON보다 훨씬 쉽다고 생각하지 않나요? + +아래 그림은 [Executable Code Actions Elicit Better LLM Agents](https://huggingface.co/papers/2402.01030)에서 가져왔으며, 코드로 동작을 쓰는 장점을 보여줍니다: + + + +코드로 동작을 작성하면 JSON형 조각보다 더 나은: -그 이유는 간단합니다: *우리는 코드 언어를 컴퓨터가 수행하는 작업을 표현하기 위해 특별히 만들었습니다*. \ No newline at end of file +- **구성 가능성:** JSON 동작을 서로 중첩하거나, Python 함수처럼 나중에 재사용하기 위해 정의할 수 있습니까? +- **객체 관리:** `generate_image`와 같은 동작의 출력을 JSON에 어떻게 저장합니까? +- **일반성:** 코드는 컴퓨터가 할 수 있는 모든 것을 쉽게 표현하도록 만들어졌습니다. +- **LLM 학습 데이터 내 표현:** 양질의 코드 동작이 이미 LLM 훈련 데이터에 포함되어 있어, 이를 위해 이미 학습되어 있습니다! From 5c6aad33563a55bea676171895e36204fffd01d6 Mon Sep 17 00:00:00 2001 From: wony617 <49024958+Jwaminju@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:07:56 +0900 Subject: [PATCH 3/3] Add conceptual_guides translation for intro_agents.md --- .../ko/conceptual_guides/intro_agents.md | Bin 10009 -> 8904 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/ko/conceptual_guides/intro_agents.md b/docs/source/ko/conceptual_guides/intro_agents.md index 945e163c7f480811bb6082949b8813ef6a383b83..2f75c1e54b4fcbfac6e2902ac267c0a781fe8f4e 100644 GIT binary patch literal 8904 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 literal 10009 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 Bj`;up