지난 몇 달 동안 사용 된 용어 "AI 에이전트"또는 "Agent"를 들었을 가능성이 매우 높으며, 많은 사람들에게는 AI 에이전트를 이전에 사용했을 가능성이 있습니다. 나는 A AI와 Large Language Models (LLMs)에 관해서는, 그래서 일부 동료들이 가지고있는 것처럼 도구와 작업 흐름에 너무 깊이 들어가지 않았습니다. ‘조심스러운 의심스러운 의심’ 작년 말, Thomas Ptacek가 썼다. , 그들이 어떻게 작동하는지에 대한 내 관심을 끌었다. 당신은 에이전트를 작성해야합니다 2025년 초, 나는 토르스텐 볼의 책을 읽었다. 그리고 나는 Thorsten의 단계를 따르고 그것을 구현하지 않았지만, 그것이 얼마나 간단하게 보였는지에 대해 조금 놀랐습니다. 어떻게 에이전트를 만들 수 있습니까? 에이전트가 무엇인지 그리고 어떻게 작동하는지에 대한 타이어를 던질 수있는 기회로, 나는 하나를 만들기 위해 몇 시간을 떼어 놓았습니다. 이 모든 사람과 이것을 공유하고 어떻게 뭔가를 빨리 작동시킬 수 있는지 반복하는 것이 좋다고 생각했습니다. 무엇이 새롭게 되었나? 모르는 사람들에게는, Renovate CLI는 수십 개의 패키지 관리자와 패키지 생태계, 9 개의 다른 플랫폼 (GitHub, GitLab, Azure DevOps 등)에서 중독 업데이트를 자동화하는 오픈 소스 프로젝트이며, 중독 업데이트를 원하는 방식에 맞게 동작을 조정하는 지원을 자랑합니다. 새로워질 수 있는 Mend의 클라우드 호스팅 Renovate는 1.3M+ 리포토리에서 사용되며 Renovate CLI는 수백만 개의 리포토리에서 자체 호스팅 방식으로 사용됩니다. 에이전트란 무엇인가? 에이전트가 실제로 무엇인지 주위의 buzzword hype에도 불구하고, 나는 발견했다 아름답고 소화할 수 있도록 : Simon Willison의 정의 LLM 에이전트는 목표를 달성하기 위해 루프에서 도구를 실행합니다. 이것은 우리의 LLM을 가지고 있으며 직접 제공되는 도구 (또는 "tool calling")를 호출 할 수있는 능력을 제공합니다 (우리가 직접 구현 할 때) 또는 . 모델 컨텍스트 프로토콜(MCP) 최첨단 모델은 이제 "tool calling"에 대해 훈련 받았으므로 모델에 도구를 제공 할 수 있으며 그것이 그것을 부르는 방법을 이해할 수 있음을 의미합니다. 우리는 무엇을 건설하고 싶습니까? 나는 이것을 탐구하는 좋은 방법은 LLM에 Renovate 구성을 만드는 방법에 대해 조금 더 가르치는 것이라고 생각했다. 왜냐하면 Renovate는 많은 생태계를 지원하고 있으며 당신이 원하는대로 행동을 조정하려면, 당신이 당신의 저장소에 추가 할 수있는 많은 다른 구성 가능성이 있습니다. 수많은 configurations LLM은 이미 훈련 데이터를 기반으로 Renovate 구성에 대한 좋은 이해를 가지고 있으며, 웹을 검색 할 수있는 능력이있는 경우 현재 문서가 있지만 우리가 사용하는 Renovate 버전에 대한 정확한 문서가 없을 수 있습니다. 우리는 활기찬 커뮤니티를 가지고 있으며, 프로젝트에 기여하는 속도가 빠르기 때문에 최신 변경 사항을 유지하는 것이 어려울 수 있습니다. 이것을 염두에두고, 나는 내 에이전트에서 원하는 다음과 같은 기능을 결정했다 : 에이전트를 특정 Renovate 버전으로 조정할 수 있는 기능 그 버전에서 사용할 수 있는 기능에 대한 이해 구성 변경을 제안할 수 있는 능력 유효한 구성이 무엇인지에 대한 지식 (Renovate npm 패키지의 일부로 배송되는 renovate-config-validator를 사용하여) 갱신을 실행하여 구성 변경이 무엇을 의미하는지 확인하고 예상되는 변경이 발생했는지 확인할 수있는 능력은 동일한 작업 흐름을 사용하여 취할 수 있습니다. 에이전트를 만들기 기본 입력 루프 만들기 Basic input loop 우선, 나는 Thorsten의 포스트 (그리고 Geoffrey Huntley의 포스트)를 매우 밀접하게 따랐다. ) 내 에이전트의 기본 쉘을 올리고 실행하려면. 워크샵, 블로그 포스트를 기반으로 별도의 Anthropic 구독을 만들 필요가 없도록 자신을 저장하려면 AWS Bedrock 설치를 사용하기 위해 몇 가지 조정을 만들었고 실행 중이었습니다! Thorsten의 포스트는 훌륭하며 단계별 성격과 부러워 할 수있는 글쓰기 스타일과 결합하여 기본 사항에 대한 정말 좋은 기초를 제공합니다. 에이전트에게 "유효한"config가 어떻게 생겼는지 가르치는 방법 최소한의 read_file 도구를 사용하여 기본 루프를 실행하면 모델이 이미 Renovate 구성에 대해 알고있는 것을 기본으로하기 위해 대화를 시작했습니다. 제안 된 구성 중 일부는 Renovate의 "파워 사용자"로 알고있는 퇴적 된 기능을 사용하는 것임을 알았지만 모든 사람이 Renovate를 실행 할 때까지하지는 않았습니다. 빠른 측면으로 Renovate의 지속적인 개발 덕분에 우리는 때때로 기존 옵션을 재명하거나 재제작합니다. 이것은 Renovate가 실행될 때 모두 적용되며, 사용자가 즉시 Config 파일 변경을 강요하지 않도록 하기 위하여 - 그러나 또한 리포지토리에 헌신하는 것이 제안됩니다. Config 이민 > 리모델링은 도구가 있고, 잘못된 구성을 사용할 때 보고할 수 있지만, 구성 마이그레이션을 필요로 하는 무언가를 사용할 때 강조할 수도 있습니다. renovate-config-validator 에이전트에 추가하려고 설정한 첫 번째 Renovate-y 도구는 LLM은 유효하고 마이그레이션 된 구성만 제공하는 방법을 가르칩니다. validate_config 도구를 구현하고 LLM에 제공 한 후에 LLM이 도구를 신뢰할 수있는 방법으로 사용하는 것을 보았지만 Config 마이그레이션에 대한 경고를 듣지 못했습니다. 에이전트가 이것을 더 명확하게 따르도록 격려하기 위해, 나는 내 시스템 프롬프트가 포함되어 있는지 확인했다 : [...]당신이 제시하는 모든 구성이 그 후에 인증된다는 것을 확인해야 합니다. 도구, 그리고 응답에서 제안된 모든 구성 마이그레이션이 적응되며 - 마이그레이션이 필요한 구성으로 사용자를 떠나지 마십시오! 통합_config 통합_config 놀랍지 않게, 에이전트는 그것에 훨씬 더 좋았고, 마이그레이션 된 형태로 구성을 반환하기 시작했습니다. 이 기능을 사용하면 에이전트가 이미 훨씬 더 도움이되었기 때문에 이제 구성 필드를 "망상화"하고 사용자에게 반환 할 수 없었기 때문에 그것을 실행할 것입니다. , 그것이 유효한 config를 반환했음을 깨닫고, 우리가 유효한 config를 얻을 때까지 다시 시도하십시오. validate_config 텍스트 렌더링 Polishing the Text Rendering 이 시점에서 우리는 나로부터 몇 가지 합리적인 질문에 답하고 유효한 구성을 제공하기 시작할 수있는 에이전트가 있었고, 나는 그것을 조금 사용하기 시작할 수있었습니다. LLM은 Markdown로 질문에 대답하며, 읽는 것이 두 번째 성격이지만 Markdown로 표시되기를 선호합니다. 이 시점에서, 나는 Charm Bracelet의 통합 Markdown을 반환하는 라이브러리로, 결과적으로 다음과 같은 변화가 발생합니다: 갤러리 더 아름다운 버전으로 : 도구를 포장하기 나는 Renovate의 버전, 도구 및 문서에 대해 조금 더 명확히하고 싶었지만 Renovate의 몇 가지 버전이 내 기계에 설치되었을 때 그렇게 쉽게 할 수 없었습니다. 포장을 단순화하기 위해, 나는 내 에이전트가 할 수있는 가벼운 Docker 이미지를 만들었습니다 : renovate 및 renovate-config-validator의 특정 버전이 설치되어 있습니다. 어떤 버전의 Renovate를 실행하고 있는지 알아보십시오 (그리고 에이전트에게 알려주세요) 다운로드한 해당 버전의 docs의 복사본이 있어야 합니다. 이제 Renovate의 명시적인 버전이 있습니다.I modified my system prompt to tell the agent that: System: []anthropic.TextBlockParam{ // ... { Text: "Renovate is a fast-moving project, so you may know about outdated configuration at any time. You are currently running as Renovate " + a.meta.Version + ", which may not be the latest at this point in time. [config validation prompt as above]", } 읽기 Docs 다음 논리적 단계는 LLM이 해당 Renovate 버전의 문서를 적절하게 사용할 수 있고, 응답을 조정하기 위해 다른 구성에 대한 사용 예제를 쿼리 할 수 있다는 것입니다. I 실행 A 모든 문서 (~66k 라인 Markdown)를 반환 할 수있는 도구는 놀랍게도 작동하지 않았습니다, LLM은 컨텍스트의 제한된 집합 (AKA의 " 컨텍스트 창")을 가지고 있으며, 많은 데이터를 던지는 것은 많은 돈을 비용을 지불 할뿐만 아니라 대화의 나머지 부분을 처리 할 수있는 컨텍스트를 줄입니다. read_docs 심지어는 보면서도 아마도 문서의 가장 유용한 페이지가 될 것입니다, 현재 ~13k 라인 Markdown, 그래서 LLM이 그것을 더 쉽게 소화 할 수 있도록이 파일을 분할하는 방법을 고려해야했습니다. 모든 repository config 설정에 대한 문서화 이것은 내가 아직 해결을 완료하지 않은 하나이지만, LLM, 그리고 아마도 인간에게 더 잘 작동 할 수있는 작은 크기로 큰 파일을 분할하는 방법을 고려하는 것이 흥미 롭습니다. 나는 A를 소개함으로써 시작했다 도구, 모든 파일을 목록 할 수있는 도구 디렉토리 (Renovate의 GitHub 릴리스에서 다운로드), 그리고 우리는 사용할 수 있습니다 각 개별 파일을 읽을 수 있지만 일부 docs 파일에서 여전히 컨텍스트 길이 문제를 해결할 수 있습니다. list_docs docs read_file 실제로 갱신을 하고 있는 내가 구현하고자하는 최종 기능은 Renovate를 실행 할 수있는 기능을 제공 할 것입니다 (물은 실행 모드에서) 에이전트가 제안 한 변경 사항이 실제로 작동하는지 확인합니다. 인간으로서 이것을 하려면, 나는 그 안에서 Renovate를 실행할 것이다. 모드, 그리고 관련 변경이 이루어졌는지 확인하기 위해 로그를 확인합니다. 드래곤 드래곤 다행히, 에이전트는 도구 호출을 통해 정확히 똑같은 일을 할 수 있습니다. 에이전트가 제안하는 구성에 따라 저장소의 로컬 복사본에 대해 Renovate CLI를 실행합니다. run_renovate 명령이 완료되면 에이전트는 특별한 로그 라인을받습니다 ( Renewate가 검사한 파일과 검출된 업데이트에 대한 정보를 제공하며, 디버깅할 때 매우 유용합니다. packageFiles with updates 우리가 발견했듯이, 에이전트에 제공되는 각 첨가 도구는 그것을 더 강력하게 만듭니다.I started to see it more reasonably able to confirm if, i.e., adding a regex to parse the 버전 A 실제로 현재 버전과 업데이트 중인 버전을 감지할 수 있습니다. golangci-lint Makefile 나는 아직 로그 라인을 살펴볼 때 정확히 무엇을 찾고 있는지 가르치기 위해 시스템 프롬프트를 조정하지 못했지만 이미 얼마나 할 수 있는지 흥미롭습니다. 배운 교훈 이 과정을 통해 나는 에이전트와 LLM에 대해 훨씬 더 많이 배웠고 때때로 보이는 것처럼 "마법"이 많지 않다는 것을 가르쳐 왔으며 흥미로운 일을하는 것이 간단 할 수 있다는 것을 알게되었습니다. 놀랍게도 간단한 나는 최소한의 에이전트 루프 (Thorsten의 포스트를 기반으로)에 도달하는 것이 얼마나 간단했는지, 그리고 최종 결과에 도달하기 위해 Go의 몇 백 개의 추가 라인 만 얼마나 간단했는지보고 놀랐습니다 ~700 코드 라인. 나는 LLM이 모드 아래에서 많은 일을하고 있다는 것을 깨달았지만 여전히 인상적입니다! 성장하는 건물은 재미있었다. 나는 새로운 도구를 추가하거나 시스템 인스턴스에 조정하는 것과 같은 점진적인 변화가 에이전트의 전반적인 생존성을 향상시킬 수있는 방법을 보았다는 것을 정말로 즐겼다. 내가 변경을했을 때, 나는 차이를 느끼기 위해 동일한 인스턴스를 다시 실행했습니다 (LLM을 기억하는 동안 결정적이지 않습니다). UX를 올바르게 얻는 것은 전문적인 에이전트와 더 쉽습니다. 특정 기능을 전문으로 한 에이전트가있을 때, 이것이 어떻게 보이는지 더 쉽게 제어 할 수 있습니다. 내 경우에는 저장소 내에 있는 JSON 파일에 대한 조정을 많이 하고 있으며, Renovate CLI가 이러한 변경 후에 볼 수 있는 변경 사항을 살펴보고 있습니다. 나는 아직 그것을 구현하지 못했지만, 내가 정말로 원하는 것은 현재 우리가 말하고있는 현재 Renovate 구성을 보여주는 에이전트 인터페이스에 측면 패널이 있기 때문에 LLM의 피드백을 바탕으로 변경되므로 UI에서 변경됩니다. 컨텍스트가 힘들다 위에서 언급했듯이 LLM이 가지고있는 컨텍스트 창으로 문서의 크기를 조그만하려는 것은 약간 어렵습니다. 이것은 Renovate의 로그 라인 중 일부가 특히 길어질 수 있다는 사실에 추가되며 (특히 큰 저장소에서) 우리는 특정 시점에서 토큰 사용을 제한하는 방법을 고려해야 할 추가 장소가 있습니다. 나는 또한 내 시스템 인스턴트가 LLM을 구문에 기반한 특정 행동 (즉, 특정 도구의 정의에 사용되는 JSON Schema에서)로 밀어 넣어하지만, 때로는 더 강하게 밀어 넣어야한다는 것을 발견했다. 내가 그것을 달리기를 기대한다면 . can you lookup what updates are available --dry-run=lookup 이것은 MCP 서버가 될 수 있습니다. LLM, 에이전트 및 모델 컨텍스트 프로토콜에 더 익숙한 사람들은이 많은 것이 실제로 에이전트 특정이 아니며 도구 자체가 MCP 서버로 추출 될 수 있다는 것을 알게 될 것입니다. 그것은 절대적으로 계획이지만,이 블로그 게시물의 목적을 위해, 그것은 또한 상호 작용을 필요로하는 MCP 서버를 추가하려고하는 것보다 단일 에이전트 내에서 모든 것을 구현하는 것이 더 간단하다는 것을 보여주는 것이 합리적이었다. 나는 이제 할 일이 더 많다. 아쉽게도, 지금은 내가이와 함께하고 싶은 많은 다른 것들이 있습니다! 나는 또한 Renovate 커뮤니티 매니저로서 작업하여 사용자 질문에 대답하여 내 자신의 삶을 개선하는 데 어떻게 사용될 수 있는지 살펴보고 있습니다. 그리고 눈을 껍질로 유지하십시오, 나는 더 나은 장소에있을 때이 오픈 소스'd를 얻고 싶습니다. 결론 LLM과 에이전트로 많은 일을하지 않은 사람으로서, 나는 그것이 실제로 얼마나 간단 할 수 있는지 알기 위해 정말 눈을 뜨는 것을 발견했습니다. 나는 당신이 에이전트를 구축해야한다는 또 다른 상기와 함께 당신을 떠날 것이다. 제이미 탱나 Senior Developer & Open Source Project Maintenance 제이미는 멘드 리노베이트 (Mend Renovate)의 유지 관리자이므로 커뮤니티 매니저 역할을 담당하고 있으므로 주변에서 그를 볼 수 있습니다! 당신이 지난 10 년 동안 들었을 수있는 오픈 소스 프로젝트를 유지하고, 지난 ~ 5 년 동안 열심히 일했습니다. 의존성 관리 공간과 기업이 더 나은 소프트웨어를 배송하도록 돕습니다.