앤트로픽(Anthropic)에서 클로드를 이용한 Computer-Use Demo를 출시했다.
컴퓨터 유즈는 기존에 LLM을 기반으로 사용자가 원하는 일을 해주는 도구인 LLM Agent을 이용한 서비스이다.
기존의 LLM Agent는 파일 수정, 웹 검색과 같이 특정 태스크 안에서 사용되었다면
컴퓨터 유즈는 가상 머신을 함께 실행해 가상 머신 시스템을 조작하며 실제 컴퓨터의 전체 시스템을 조작할 수 있는 기반을 마련했다.
LLM이 사용자가 원하는 것을 입력받아 계획을 세우고 각 계획에 맞는 행위들을 순서대로 처리해 나가는 형식으로 동작하며
각 행위는 Tools라는 도구 형식으로 미리 정의해 Function call의 방식으로 현재 시스템의 상태에 맞는 도구와 파라미터를 출력한다.
LLM이 선택한 도구를 실행하고 결과를 확인 후 다음 단계를 수행하며
위 과정을 최종 결과가 나올 때까지 반복하며 사용자의 프롬프트에 맞게 결과를 도출해 낸다.
컴퓨터 유즈의 설치 방법을 다음과 같다.
- 클로드의 깃헙에서 소스코드를다운로드한다
- 도커를 설치 후 다음 명령어를 도커 파일이 있는 폴더에서 실행한다.
* export ANTHROPIC_API_KEY=%your_api_key%
* docker run \
* -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
* -v $HOME/.anthropic:/home/computeruse/.anthropic \
* -p 5900:5900 \
* -p 8501:8501 \
* -p 6080:6080 \
* -p 8080:8080 \
* -it ghcr.io/anthropics/anthropic-quickstarts:computer-use-demo-latest
cluade의 API키만 있다면 바로 실행해 볼 수 있다.
좀 더 자세하게 컴퓨터 유즈가 동작하는 방식을 살펴보자.
기본적으로 LLM 에이전트들은 Function calling 방식을 사용한다.
물론 클로드 컴퓨터 유즈도 마찬가지다.
클로드의 컴퓨터 유즈에서 사용하는 Tools를 살펴보자
가장 중요한 컴퓨터를 조작하는
anthropic-quickstarts/computer-use-demo/computer_use_demo/tools/computer.py
Action = Literal[
"key",
"type",
"mouse_move",
"left_click",
"left_click_drag",
"right_click",
"middle_click",
"double_click",
"screenshot",
"cursor_position",
]
첫 번째로 컴퓨터 조작에 필요한 Action이다.
클로드는 모든 행동을 시작할 때와 끝날 때 모두 스크린샷을 찍어서 현재 컴퓨터의 상태를 확인하고
그다음 행동을 할 때 항상 처음으로 수행하는 게 바로 컴퓨터 조작의 마우스 이동이다.
위에 도커를 실행할 때 추가하지 않았지만 가상환경의 해상도를 설정하는 부분이 있다.
그래서 스크린샷도 같은 해상도로 촬영되기 때문에 마우스 커서의 이동은 해상도 범위의 좌표로 제한된다.
브라우저에서 검색을 한다고 가정하면
처음 마우스 커서를 이동시키고 클릭을 하고 타이핑을 한다.
이후 엔터키를 누르면 다음 화면으로 넘어가게 된다.
위의 모든 과정 사이에 스크린샷을 찍어 계속 현재 화면을 확인한다.
이런 컴퓨터 조작은 파이썬 asyncio의 create_subprocess_shell를 통해 Action을 수행할 프로세스를 만들어 shell명령어를 실행한다.
self.shell(f"{self.xdotool} mousemove --sync {x} {y}")
if (display_num := os.getenv("DISPLAY_NUM")) is not None:
self.display_num = int(display_num)
_display_prefix = f"DISPLAY=:{self.display_num}
self.xdotool = f"{self._display_prefix}xdotool"
그리고
이 모든 결과가 끝날 때까지 명령을 수행하는 loop 코드이다.
tool_result_content: list[BetaToolResultBlockParam] = []
for content_block in response_params:
output_callback(content_block)
if content_block["type"] == "tool_use":
result = await tool_collection.run(
name=content_block["name"],
tool_input=cast(dict[str, Any], content_block["input"]),
)
tool_result_content.append(
_make_api_tool_result(result, content_block["id"])
)
tool_output_callback(result, content_block["id"])
if not tool_result_content:
return messages
messages.append({"content": tool_result_content, "role": "user"})
위 코드가 api를 통해 받은 결과를 처리하는 코드이다.
content_block["type"]=="tool_use"
가 Cluade 가 판단하기에 현재 도구를 사용해야한다고 판단했다는 뜻이고 이후
tool_collection.run은 도구에 input값을 넣어서 실행하는 코드이다.
tool_collection = ToolCollection(
ComputerTool(),
BashTool(),
EditTool(),
)
다음은 실제로 클로드가 조작한 결과로 리턴된 JSON값을 살펴보자.
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "find and download cat images"
}
]
},
사용자가 처음 입력한 프롬프트이다.
고양이 이미지를 찾고 해당 이미지를 다운로드하라는 명령이 주어졌고
컴퓨터 유즈의 처음 답변은 다음과 같다.
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll help you search for and
download some cat images using Firefox.
Let me break this down into steps:\n\n
1. First, I'll take a screenshot to see the desktop
and locate Firefox\n
2. Open Firefox and search for cat images\n
3. Find and download some nice cat images\n\n
Let's start:"
},
{
"id": "toolu_012PVEMeo2uaKFSnyjstXaZH",
"input": {
"action": "screenshot"
},
"name": "computer",
"type": "tool_use"
}
]
},
브라우저에서 고양이 사진을 검색하고 다운로드할 계획을 세웠다.
- 파이어폭스 브라우저 아이콘을 찾는다.
- 브라우저를 열고 고양이 이미지를 검색한다.
- 고양이 이미지를다운로드한다.
{
"content": [
{
"type": "tool_result",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": "{encoded image with base64}"
}
}
],
"tool_use_id": "toolu_012PVEMeo2uaKFSnyjstXaZH",
"is_error": false
}
],
"role": "user"
},
해당 기능을 스크린샷이다. 배경화면에서 파이어폭스 아이콘을 찾고 있는 것이다.
스크린 샷을 찍는 것도 function call을 위한 기능으로구현되어 있다.
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I see the Firefox icon in the taskbar. Let's click on it and search for cat images:"
},
{
"id": "toolu_015Q64xcbwfjfPteMqicfiid",
"input": {
"action": "mouse_move",
"coordinate": [
804,
738
]
},
"name": "computer",
"type": "tool_use"
},
{
"id": "toolu_0128ZgTG13HWERUzEyGtCH5z",
"input": {
"action": "left_click"
},
"name": "computer",
"type": "tool_use"
}
]
},
클로드가 위에서 찍은 스크린 샷을 통해 파이어 폭스 아이콘을 찾았고 마우스를 움직여서 아이콘을 클릭한다.
{
"content": [
{
"type": "tool_result",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": "{encoded image with base64}"
}
}
],
"tool_use_id": "toolu_015Q64xcbwfjfPteMqicfiid",
"is_error": false
},
{
"type": "tool_result",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": "{encoded image with base64}"
}
}
],
"tool_use_id": "toolu_0128ZgTG13HWERUzEyGtCH5z",
"is_error": false
}
],
"role": "user"
},
현재 화면을 촬영해서 이전에 실행한 기능이 제대로 되었는지 확인하는 과정이다.
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Now that Firefox is open, let's search for cat images.
I'll use Pixabay since it offers free-to-use images.
Let me click on the search bar and navigate to pixabay:"
},
{
"id": "toolu_01KghGbFTgudxDwCCm4FSnDJ",
"input": {
"action": "mouse_move",
"coordinate": [
211,
534
]
},
"name": "computer",
"type": "tool_use"
},
{
"id": "toolu_01YMYghzv8YdDg41KLHa79S7",
"input": {
"action": "left_click"
},
"name": "computer",
"type": "tool_use"
}
]
},
파이어폭스 브라우저를 실행하고 이후에는 검색창에 고양이사진을 다운로드하기 위해 픽사베이 웹사이트에 접속하는 과정이다.
위의 과정을 계속 반복하면서 현재 상황을 확인하고 다음 단계로 가는 것을 반복해 최종 결과까지 가는 것을 보여주는 에이전트이다.
물론 위의 과정의 결과는 완벽하지는 않았다.
마지막 사진 이후
cat.jpg.png라는 이름으로 파일을 저장하고
cat.jpg라는 이름의 파일을 실행해 계속 실패 사이클이 돌아 최종적으로 실패했다는 결과를 보였다.
Anthropic에서 예시로 보여준 사용자 프롬프트는 자세하게 설명을 추가해 좀 더 복잡한 과정을 수행했던 것 같다.
Claude | Computer use for automating operations
Claude | Computer use for orchestrating tasks
LLM이 공개된 이후 더 큰 모델 혹은 End device를 위한 SLM 모델 등 많은 모델들이 단순한 질의응답의 수준을 넘어
사용자에게 도움이 되는 자동화 도구인 Agent형식으로 사용하고 있다.
아직은 복잡한 과정을 중간 피드백 없이 완벽하게 수행하는 것은 어렵지만
사용자의 중간 피드백을 추가하거나 좀 더 LLM 모델이 완벽해진다면 실제 시스템에서 구동하는 모습도 보일 수 있을 것 같다.
----------------------------------------------------------------------------------------------------------------------
*추가*
Computer Use는 한국어로 질문하면 잘 처리할까?
단풍 나무 사진을 구글에서 검색해 다운로드하고 이미지를 열어보는것 까지 해보겠다.
여기 까지는 당연히 똑같다 하지만 프롬프트에 "구글"에서 검색하라는 명령을 추가했기 때문에 구글에 접속을 먼저한 후 검색하는것을 볼 수 있다.
해당 과정에서 약간의 이상한 점을 발견 했다.
검색을 할때 웹 사이트의 검색창을 사용하는 것이 아니라 URL에 파라미터를 주는 방식으로 검색을 수행하는 것이다.
https://www.google.com/search?q=단풍나무%20사진
위와 같은 방식으로 검색을 수행하는 것으로 웹페이지에 있는 검색 창를 사용하는것은 아니라는 뜻이다.
이후 저장하는 과정을 끝낸 후
사진 저장은 성공적이었지만 검색하는 과정이 조금 부족해보인다.
네이버에서 검색을 진행할때는 어떤방식으로 하는 지 확인해보자
구글에서는 검색 쿼리가 q를 통해 수행된다는 것이 알려져서URL을 통해 검색한 것이고
아닌 경우에는 검색창을 찾아서 검색을 수행하는 것이다.
'A.I.(인공지능) & M.L.(머신러닝) > LLM' 카테고리의 다른 글
Graph Retrieval Augmented Generation(Graph-RAG) 톺아보기 (1) | 2024.12.05 |
---|---|
Mamba: Linear-Time Sequence Modeling with Selective State Spaces / Non-Attention 기반의 Sequence Model에 대한 접근 (0) | 2024.12.03 |
[LangGrpah] 4. LangGraph를 이용한 RAG 및 검색 Agent 개발 (24) | 2024.11.20 |
[LangGrpah] 3. Chain과 Agent를 이용한 Workflow 구현 - 쿼리 추출 모델 (0) | 2024.11.14 |
[LangGrpah] 2. LangGrpah(랭그래프)의 핵심 요소의 개념적 이해 (0) | 2024.11.13 |