반응형

 

 

오늘은 Strands SDK 로 개발하는 Agent 의 도구에 MCP tool 을 붙여보겠다.

 

일단 MCP 도 Agent 의 하나의 tool 에 불과하다는 개념을 다시 기억하자.

 

MCP 구성은 Server 와 Client 두 가지 구현이 필요하다.

 

MCP Server 는 필요에 따라 직접 구현보다는 IDE 에서 시켜서 구현할 수 있고 ( 필자의 경우 Cursor 를 이용해서 쉽게 mcp 서버를 구현할 수 있었다.) 외부에 공개된 MCP 서버를 직접 사용할 수 있다. 다만 remote 서버의 경우 datasource 에 대한 정보들이 네트워크 트래픽을 타고 외부에 넘어갈 수 있으니 보안에 유의하자.

 

일단 아래 aws 에서도 aws 서비스에 access 할 수 있는 도구들을 mcp 서버로 제공하고 있다. 

- https://awslabs.github.io/mcp/

 

Welcome to AWS MCP Servers | AWS MCP Servers

Get started with AWS MCP Servers and learn core features.

awslabs.github.io

 

그리고 내가 일반적으로 Smithery 에서도 설치가 가능하지만, 설치가 잘 안될 때는 아래 cursor 의 mcp 페이지에서도 설치해보면 된다.

https://docs.cursor.com/ko/tools/mcp

 

Cursor: The best way to code with AI

Built to make you extraordinarily productive, Cursor is the best way to code with AI.

cursor.com

 

Strands SDK 에서의 MCP Client 요약

  • Strands SDK 에서 쉽게 MCP Client 를 구현해줌
  • MCP 클라이언트를 생성할 때 어떤 방식으로 연결할 것인지 선택해야 함
    • Standard I/O (stdio) : 로컬 프로세스를 구현한다면 적합
    • Streamable HTTP : HTTP 이벤트를 호출해서 스트림 방식으로 구현할 때
    • Server-Sent Events (SSE) : HTTP 기반의 서버를 직접 구축했을 때
    • Custom Transport with MCP Client - 그외 직접 프로토콜을 구현할 때

 

많이 활용하는 stdio , streamableHTTP 방식의 예제 코드를 아래에 첨부한다.

 

예제 코드 내용

  • Agent 모델을 만듦.
  • sequential-thingking  mcp 도구 등록.
  • strands tools 에서 기본으로 제공하는 http_request 를 이용해 openweather api 의 도큐먼트 페이지를 분석시킴.

 

from mcp import stdio_client, StdioServerParameters
from mcp.client.streamable_http import streamablehttp_client
from strands import Agent
from strands.models import BedrockModel
from strands.tools.mcp import MCPClient
from strands_tools import http_request, retrieve

base_model = BedrockModel(
    model_id="apac.anthropic.claude-3-7-sonnet-20250219-v1:0",
    region_name="ap-northeast-2",
    temperature=0.3,
)

stdio_mcp_client = MCPClient(
    lambda: stdio_client(
        StdioServerParameters(
            command="uvx",
            args=["awslabs.aws-documentation-mcp-server@latest"]
        )
    )
)

# HTTPStreamable 방식으로 붙일 경우 
# sequential_thinking = MCPClient(
#     lambda: streamablehttp_client("https://smithery.ai/server/@smithery-ai/server-sequential-thinking")
# )


# StdIO 방식으로 붙일 경우
sequential_thinking = MCPClient(
    lambda: stdio_client(
        StdioServerParameters(
            command="npx",
            args=[
                "-y",
                "@smithery/cli@latest",
                "run",
                "@smithery-ai/server-sequential-thinking",
                "--key",
                "생성된 사용자 키",
                "--profile",
                "생성된 사용자 프로필"
            ]
        )
    )
)
# 예제 테스트 코드 
with sequential_thinking:
    tools = sequential_thinking.list_tools_sync()
    tools += [http_request, retrieve]

    agent = Agent(tools=tools, model=base_model)
    result = agent("https://openweathermap.org/forecast5 에서 어떤 날씨 데이터 테이블을 수집할 수 있는지 분석해줘")
    print(result)

# with stdio_mcp_client:
#     tools = stdio_mcp_client.list_tools_sync()
#     agent = Agent(tools = tools, model = base_model)
#     result = agent("What is AWS Lambda?")
반응형
반응형

1.Langfuse 란?

Langfuse는 오픈소스 LLM 옵저버빌리티(Observability) 플랫폼이에요.

AI 애플리케이션의 성능 모니터링, 추적(Tracing), 평가(Evaluation), 그리고 프로덕션 환경에서의 LLM 사용량 분석을 위한 종합적인 도구를 제공합니다.

 

Langfuse 의 주요 기능들.

추적 및 모니터링 - LLM API 호출의 전체 lifecycle 추적- 토큰 사용량, 응답 시간, 비용 분석- 멀티 에이전트 워크플로우의 단계별 추적- 실시간 성능 메트릭 대시보드
데이터 분석 - 프롬프트 성능 분석 및 최적화- 사용자 세션 및 대화 추적- A/B 테스트를 위한 프롬프트 버전 관리- 데이터 내보내기 및 외부 분석 도구 연동
품질 관리 - LLM 응답 품질 평가 및 점수화- 사용자 피드백 수집 및 분석- 모델 성능 회귀 탐지- 프로덕션 환경에서의 품질 모니터링

 

 

2.왜 Langfuse ?

구분문제점Langfuse 해결책

1. 프로덕션 환경에서의 가시성 확보 - LLM API 호출이 블랙박스처럼 작동하여 문제 원인 파악이 어려움- 토큰 사용량과 비용을 실시간으로 추적하기 어려움- 성능 병목지점을 식별하기 어려움 - 모든 LLM 호출의 상세 로그와 메트릭 제공- 실시간 비용 추적 및 예산 관리- 응답 시간, 처리량 등 성능 지표 모니터링
2. 멀티 에이전트 시스템의 복잡성 관리 - 여러 에이전트가 연동하는 워크플로우에서 각 단계별 성능 파악 어려움- 에러 발생 시 정확한 원인 위치 추적 어려움- 에이전트 간 데이터 흐름 파악 어려움 - 워크플로우의 전체 실행 경로 시각화- 각 에이전트별 성능 메트릭 분리 측정- 계층적 추적으로 복잡한 호출 체인 관리
3. 데이터 기반 최적화 - 프롬프트 성능을 정량적으로 평가하기 어려움- 사용자 만족도와 모델 응답 품질 상관관계 파악 어려움- 개선 효과를 객관적으로 측정하기 어려움 - 프롬프트별 성능 지표 자동 수집- 사용자 피드백과 모델 메트릭 연동 분석- A/B 테스트를 통한 개선 효과 검증
4. 비용 최적화 - LLM API 비용이 예상보다 높게 발생- 어떤 기능이 비용을 많이 소모하는지 파악 어려움- 비용 효율적인 모델 선택 기준 부재 - 기능별, 사용자별 세분화된 비용 분석- 모델별 cost-per-performance 비교- 비용 임계값 알림 및 예산 관리

3.Langfuse 아키텍쳐

 

4.구축해보기

환경

  • 쿠버네티스가 설치되어있는 환경
  • Kubectl 설치 및 연동이 되어있고, 배포 권한이 있어야 함

순서

#!/bin/bash

  

helm repo add langfuse-k8s https://langfuse.github.io/langfuse-k8s/

echo "repository added.."

  

helm repo update

echo "repository updated.."

  

LANGFUSE_VERSION="1.5.2"

SERVICE_NAME="langfuse"

VALUES_FILE="langfuse-value.yaml"

NAMESPACE="langfuse"

  

echo "install langfuse..."

helm install $SERVICE_NAME langfuse-k8s/langfuse -n $NAMESPACE \

--values $VALUES_FILE \

--version $LANGFUSE_VERSION

  

helm uninstall langfuse -n langfuse

 

 

처음 웹서버 파드를 띄우고 진입하면 회원가입을 해야 한다. 

 

Setting 부분에서 API 키를 발급받아 아래 연결을 위한 테스트 코드를 작성하고 실행한다.

연결 테스트를 위한 코드

```
from langfuse import Langfuse

from langfuse import observe, get_client

  

langfuse = Langfuse(

secret_key="secret-key",

public_key="pub-key",

host="http://000000000.ap-northeast-2.elb.amazonaws.com"

)

  

@observe

def my_function():

return "Hello, world!" # Input/output and timings are automatically captured

my_function()

# Flush events in short-lived applications

langfuse = get_client()

langfuse.flush()
```

 

그리고 아래 연동된 모습이다.

5.트러블 슈팅

- 에러 요약
    - worker pod 에서 redis 통신 에러 발생
    - web pod 에서 CrashLoopBackOff 발생
    - minIO 오류 발생
    - 설치 시 오류 발생
- 해결방법
    - chart value 값 내에 postgresql, clickhouse 의 password 지정
    - 워커파드의 수동 재시작 ( 아마 잘 working 하는 파드의 순서가 있는 모양인데, worker 파드가 먼저 띄워지면서 에러가 발생하는것으로 보임)
    - host 는 수동으로 셋팅하지 말것
    - minIO 값에 글로벌 설정 통일 및 ID, password 설정

반응형
반응형

 

 


AI Agent 가 최근 개발 업계에서 화두인것 같다.
Agent 를 쉽게 개발하기 위한 도구들이 많이 생겨 나오고 있고, 우연히 웨비나를 통해 알게 된 Strands 에 대해서 사용법을 포함해 간단히 소개하고자 한다.

Strands 는 AWS 에서 개발한 AI Agent 를 개발하기 위한 오픈 SDK 다.



strand 는 가닥이라는 의미인데, Agent 와 tool 두 가닥으로 쉽게 Agent 를 구현할 수 있다는 의미.. 일 거다.  

아무튼 예제가 너무 쉽게 눈에 들어와서, 최근 AI Agent 과제를 진행하는데 이 SDK 를 선택하기로 했다. 잘 알려진  Langchain 은 너무 거대해서 공부할게 많아 보인다.

준비는 python 개발 환경과 LLM 을 사용할 수 있는 준비가 되겠다.


Strands package 설치는 아래 내용을 진행한다. (가상환경 셋팅 포함)

 

- 준비사항
- python 3.10 이상 설치
- 가상 환경 설치
- strands-agents SDK 패키지 설치

 

$ sudo yum install python3.11 -y
$ python3.11 -m venv .venv

$ pip install strands-agents strands-agents-tools

 

 


LLM 을 사용할 수 있는 준비가 되어야 하는데, 2가지를 소개하겠다.


1) 오픈 소스 Ollama 활용
- Ollama 설치 와 LLM 모델 다운로드 및 실행 (https://ollama.com/)

 

2) AWS 관리형 서비스 활용
- AWS Bedrock 의 LLM 모델활성화

  • AWS Bedrock 토큰 설정
    • 프로그램을 실행할 때 API 를 사용할 수 있는 토큰이 코드 또는 환경변수에  등록되어있어야 한다
    • Discover -> API Keys 진입 > API 키 생성
  • 트러블 슈팅
    • 모델 아이디를 조회하는 방법은 Discover -> Model catalog -> LLM 모델 선택
    • 모델 아이디앞에 지역 코드를 추가 [1]

예제 코드

from strands import Agent, tool
from strands.models import BedrockModel
from strands_tools import calculator
from strands.models.ollama import OllamaModel

  
  

base_model = BedrockModel(
model_id="apac.anthropic.claude-3-7-sonnet-20250219-v1:0",
region_name="ap-northeast-2",
)

base_model = OllamaModel(
host="http://localhost:11434",
model_id = "gpt-oss:20b",,
temperature=0.7
)

@tool
def weather():
""" Get weather """

return "흐림"

  
  
  

agent = Agent(model=base_model,
tools = [weather, calculator],
system_prompt="너는 간단한 수학계산과 날씨를 알려줄수 있는 어이스턴트야.")

response = agent("오늘 날씨는 어때?")

print(response)

 

위 코드 몇줄로 AI Agent 를 만들었다.


Tool 은 AI Agent 가 외부 세계와 상호작용하고 작업을 수행할 수 있게 해주는 기능. 또는 인터페이스를 의미한다.

기본적으로 strands 에서 제공하는 tool 들이 있고 직접 구현할 수 도 있다.
예를 들어 위 예제 코드에서 나는 weather() 라는 툴에 "흐림"을 하드코딩해서 return 했다. AI Agent 는 날씨를 매번 흐림으로 답변 할 것이다.

요즘 많이들 구현하는 MCP 도 Tool의 종류다.


오늘은 여기까지.

 

 

참고

[1] https://repost.aws/questions/QUEU82wbYVQk2oU4eNwyiong/bedrock-api-invocation-error-on-demand-throughput-isn-s-supported
[2] https://github.com/strands-agents/sdk-python

반응형

+ Recent posts