소개
n8n의 code node는 python을 제한적으로만 지원함. 따라서 다양한 python 코드를 활용하려면 백엔드가 필수적임.
render를 통해 백엔드를 구성하였고, n8n의 http request로 불러올 수 있음을 확인함.
진행 방법
cursor (IDE)
n8n
render (파이썬 백엔드)
chatgpt
n8n WorkFlow
Main workflow
구글 드라이브에 새로운 이미지 파일(예를들면 택시 영수증)이 업로드 되면,
파일의 다운로드 링크 주소를 받아서,
http request로 웹훅을 불러옴
✅ 초기에는 이미지를 download 받은 후, base64로 변환한 이후에 http request로 보내려고 하였음. 그러나 용량의 문제, json 처리의 문제 등으로 인해 백엔드에서 직접 다운받고 base64 변환하는것이 더 낫다고 판단함. 따라서 구글드라이브에서는 다운로드 링크만 받도록 처리하였음.
다운로드 링크를 누구나 볼 수 있도록, shaer file node를 설정하였음.
Sub workflow
process라는 endpoint를 사용함.
사용자가 미리 지정한 data label(ex. 결제금액, 승하차시간)과 사진다운로드 링크를 백엔드에 전송함
백엔드는 받아서 data label에 맞는 데이터를 추출하여 반환함
날짜는 2025년인데 2023년으로 잘못 추출함 -> 추후 프롬프트를 정교하게하던가, 이미지처리를 gemini로 바꾸던가 해야할듯
차량번호와 결제요금은 정확하게 추출함.
Respond to webhook 노드를 통해 메인 워크플로우에 반환함
[Backend] Render, Fastapi
챗지피티와 커서에게 엄청나게 많이 물어봤다.
deploy 에러도 많이 나고, 원하는대로 실행이 안되서 여기서 시간을 엄청 잡아먹었다.
결국 어찌저찌했는데.. 뭘 한건지 다시 공부할 필요가 있을듯하다.
그래도 기억나는 것들만 정리하자면..
Render에서 백엔드를 만드려면, "Web service"로 만들어야함. "Static site"가 아니다.
Deploy가 5분이상 걸리면 뭔가 렉걸린거라서, 중단시키고 재배포를 해야한다.
파이썬 코드에서 API키를 쓰는경우, render에서는 환경변수에 api키를 직접 넣어줘야한다.
파이썬 코드에서 @app.get / @app.post 로 REST API를 지정할 수 있다.
@app.get("/")
async def root():
"""Hello World 엔드포인트"""
return {"message": "Hello World"}
@app.get("/health")
async def health_check():
"""서버 상태 확인 엔드포인트"""
return {"status": "healthy"}
또한 BaseModel을 이용하여 pydantic 하게 인풋내용을 미리 지정할수 있다..(잘모름)
class ImageRequest(BaseModel):
web_content_link: HttpUrl = Field(
...,
description="Google Drive의 webContentLink 형태로, anyone-with-link 상태여야 합니다."
)
labels: List[str] = Field(
...,
min_items=1,
description="최소 1개 이상의 라벨을 문자열 리스트로 전달합니다."
)
저장된 class를 바탕으로 request와 response의 형태를 지정할 수 있다. class로 request를 지정하는 경우 header를 반드시 붙여야한다.
@app.post("/process", response_model=ImageResponse)
def process_image(req: ImageRequest):
# 1) 이미지 다운로드
# 블라블라 ...
결과와 배운 점
파이썬 백엔드 코드를 좀 공부해볼 필요가 있겠다. 지금은 LLM이 알려준거 복붙수준이다.. ㅠ
파이썬 백엔드를 붙이면 n8n을 좀 더 확장성있게 사용할 수 있다.
render 무료 버전은, 일정시간이 inactive하면 수면상태에 빠져든다. 따라서 2분마다 get 하는 http request를 설정해놨다. => 프로젝트가 블락 당할수 있다고하네요..서브 워크플로우에서 webhook 설정할때, 맨처음 webhook trigger node에서 respond 를 immediately가 아니라 using respond to webhook node 를 선택해줘야한다.
chatgpt vision calling 할 때, LLM은 과거 코딩데이터를 가지고 있다. chat completion? 방식만을 알고 있다. 그런데 이제는 response 방식으로 바뀌었다. docs 내용을 복붙해줘야 한다.
2주차 강의도 밀려서 못들었다.. 빨리 따라가야지..