파이썬 에이전트 예제
요약
LLM은 단순히 문자열로만 응답만 할수있고
Agent는 LLM의 응답내용을 기반으로 이것저것 동작하는 백엔드임
llm은 대화 내용을 기억하지 못함 →
따라서 클라이언트나 백엔드자체에서 사용자와 llm간의 대화 내용을 매번 전체 응답내용을 주고받음.
이중 llm에게 제공되는 사용 가능한 툴과 툴에 대한 스펙을 제공하고,
llm은 FAST API를 활용하여 툴을 사용하고 툴 사용한 결과에 따른 응답을 주고 받음.
아래는 예제를 활용한 응답 결과
실제로 사용하려면
별도의 폴더를 만들어 위 예제 코드를 다운받고,
폴더를 열고 여백을 우클릭 -> 터미널에서 열기 or 파워쉘 열기 후
아래의 파이썬을 실행 스크립트를 활용 (파이썬 설치가 안되어있다면 설치할 것)
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
위 스크립트를 활용하여 가상환경을 구축한 뒤,
$env:GEMINI_API_KEY="API키"
python demo.py
를 차례대로 입력하여 실행할 것.
파워쉘이나 cmd환경에서 따옴표로 감싸서 입력해줘야함.
그렇게 해서 실행하면 아래와 같이 제미나이 3.5-flash 모델을 활용해서 응답 및 툴을 호출하여 상품 정보에 대한 CRUD를 진행할 수 있다.
(.venv) PS C:\Users\sejin\Desktop\product-agent> python .\step1.py
[나]안녕
메시지에 툴 호출 없음: 안녕하세요! 상품 관리 챗봇입니다. 무엇을 도와드릴까요?
상품 조회, 등록, 수정, 삭제 등의 작업을 도와드릴 수 있습니다. 필요하신 서비스를 말씀해 주세요!
[나]상품 조회하고싶은데
메시지에 툴 호출 있음
[툴 호출] get_all_product({})
[툴 결과] {'P-001': {'name': '무선 키보드', 'price': 30000, 'stock': 5}, 'P-002': {'name': '무선 마우스', 'price': 30000, 'stock': 10}, 'P-003': {'name': '무선 헤드셋', 'price': 300000, 'stock': 15}, 'P-004': {'name': '무선 이어폰', 'price': 150000, 'stock': 20}, 'P-005': {'name': '확장 모니터', 'price': 250000, 'stock': 25}}
메시지에 툴 호출 없음: 현재 등록된 상품 목록은 다음과 같습니다.
* **P-001**: 무선 키보드 (가격: 30,000원, 재고: 5개)
* **P-002**: 무선 마우스 (가격: 30,000원, 재고: 10개)
* **P-003**: 무선 헤드셋 (가격: 300,000원, 재고: 15개)
* **P-004**: 무선 이어폰 (가격: 150,000원, 재고: 20개)
* **P-005**: 확장 모니터 (가격: 250,000원, 재고: 25개)
혹시 특정 상품의 상세 정보를 확인하고 싶으시거나, 상품 등록/수정/삭제 등의 다른 작업이 필요하신가요?
[나]무선 모니터를 삭제하고싶어
메시지에 툴 호출 없음: 현재 등록된 상품 중 **'무선 모니터'**는 없지만, 비슷한 이름의 **'확장 모니터 (상품 ID: P-005)'**가 등록되어 있습니다.
혹시 **'확장 모니터 (P-005)'**를 삭제하시겠습니까? 맞다면 확인해 주세요!
[나]새로운 상품 등록하고싶어 무선모니터
메시지에 툴 호출 없음: 새로운 상품 **'무선 모니터'**를 등록하기 위해 아래 정보가 필요합니다.
1. **판매 가격** (예: 200,000)
2. **재고 수량** (예: 10)
위 정보를 알려주시면 상품 ID를 자동으로 생성(예: P-006)하여 등록해 드리겠습니다!
[나]판매가격은 10만원 재고수량은 5개
메시지에 툴 호출 있음
[툴 호출] put_product({"name":"무선 모니터","product_id":"P-006","price":100000,"stock":5})
[툴 결과] {'ok': True, 'message': '상품 아이디 P-006를 상품명 : 무선 모니터 가격 :100000 , 재고 : 5 로 추가 했습니다.'}
메시지에 툴 호출 없음: 새로운 상품 **'무선 모니터'**가 성공적으로 등록되었습니다!
* **상품 ID**: P-006
* **상품명**: 무선 모니터
* **가격**: 100,000원
* **재고**: 5개
더 도와드릴 작업이 있으신가요?
[나]상품아이디는 어떻게 생성한거야?
메시지에 툴 호출 없음: 기존에 등록되어 있던 상품 ID들의 규칙을 기반으로 자동 생성되었습니다.
현재 등록된 마지막 상품 ID가 **'P-005(확장 모니터)'**였기 때문에, 그 다음 순서인 **'P-006'**으로 새로운 아이디를 부여해 등록했습니다.
혹시 상품 ID를 다른 값으로 변경하고 싶으시거나, 추가로 문의하실 점이 있으신가요?
[나]
ollama를 이용해서 Qwen0.5b 모델의 내용도 사용해봤는데,
모델의 성능이 높은걸 사용해야 좋은 퀄리티의 응답을 기대할 수 있음.
총평으로는 기존에 단순히 웹사이트의 구조가 프론트 - 백엔드 였다면
이제는 프론트 - llm - agent - 백엔드 형태로 변해가려고 하는 느낌임.
문제는 자체적인 llm을 도입하려고하면 하드웨어를 준비해야하는데 하드웨어 관리도 힘들고
그렇다고 외부 api를 쓰려고 한다면 토큰 비용이 장난 아닐거란 느낌이 물씬 느껴짐.
이 별 내용도 없는 대화를 조금 했다고 구글 제미나이 api에서 몇백원 빠져나갔음.
별 영양가 없는 대화라도, 이어가면서 대화 이력이 쌓이면, 대화 이력만큼 토큰을 계속 잡아먹기 때문에, 짧은 챗봇 수준으로 끝낼게 아니라면 자체적인 llm 모델을 돌릴 하드웨어가 있어야할것으로 보임
댓글