안녕하세요! 오늘은 최근 혁신적인 추론속도로 주목받고 있는 Groq의 LPU 언어 모델이 인터넷 검색과 같은 다양한 함수처리 기능을 통합할 수 있도록 지원하는 FunckyCall이라는 프록시 서버에 대해 알아보겠습니다. FunckyCall 프록시 서버는 사용자의 요청을 받아서 대형 언어 모델이 직접 처리할 수 없는 함수를 대신 호출, 처리하여 프로그램에 통합하고, 이를 통해 코드 관리, 간소화, 서비스 통합, 확장성, 성능 및 안정성 측면에서 다양한 장점을 제공합니다. 이 블로그에서는 FunckyCall 프록시 서버의 기능, 사용방법, 동작원리, 예제코드에 대해서 알아보겠습니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
FunckyCall 프록시 개요
FunckyCall은 Groq의 Language Processing Unit (LPU) 및 기타 AI 제공 업체의 함수 호출을 위한 프록시 서버입니다. 이 프록시 서버를 사용하면 Groq의 LPU와 같은 빠른 언어 모델을 호출하고 다양한 함수와 도구들을 간편하게 AI 서비스에 통합할 수 있습니다. FunckyCall은 다음과 같은 기능을 제공합니다:
- 함수 호출 기능: Groq의 LPU 및 기타 AI 서비스의 기능을 호출할 수 있습니다. 이를 통해 사용자는 Groq의 LPU와 같은 빠른 언어 모델에 대한 요청을 보낼 수 있습니다.
- 다양한 라이브러리 및 툴킷 통합: FunckyCall은 다양한 라이브러리 및 툴킷을 통합할 수 있습니다. 예를 들어, DuckDuckGo 검색 및 뉴스 서비스와 같은 서비스를 통합할 수 있습니다.
- 스키마 없는 함수 호출: 사용자는 함수의 이름만 제공하면 되며, 이를 통해 입출력 형식 정의와 같은 스키마(schema) 없이 함수를 호출할 수 있습니다. 이것은 프록시 서버에 이미 사용 가능한 경우 함수를 식별하고 실행결과를 얻기 위해 필요한 모든 스키마를 전달할 필요가 없음을 의미합니다.
- 대화형 인터페이스: 사용자는 FunckyCall을 통해 대화형으로 요청을 보낼 수 있습니다. 이를 통해 다양한 서비스와의 상호 작용이 가능합니다.
위 개념도에서 보듯이 FunckyCall은 사용자의 질문에 대해 Groq 언어 모델이 처리할 수 없는 함수 기능을 호출하고 결과를 다시 언어 모델에게 전달함으로써 다양한 프로젝트 및 응용 프로그램에 쉽게 사용할 수 있는 솔루션을 제공합니다.
아래표는 직접 함수 호출 대비 FunckyCall 프록시 서버를 통한 함수호출의 장점을 정리한 내용입니다.
비교 항목 | 직접 함수 호출 | FunckyCall을 통한 함수 호출 |
관리 용이성 | 개발자가 직접 함수 호출 코드를 작성하고 관리해야 함 | API 호출을 관리하고 중앙 집중화된 방식으로 관리 가능 |
코드 간소화 | 개발자는 각각의 API에 대한 호출 코드를 작성해야 함 | 통합된 호출 인터페이스를 사용하여 코드를 단순화할 수 있음 |
다양한 서비스 통합 | 직접 함수 호출은 특정 서비스에 종속됨 | 다양한 AI 서비스와 통합할 수 있어 더 다양한 기능을 활용할 수 있음 |
확장성 | 새로운 기능을 추가할 때마다 코드를 변경해야 함 | 새로운 기능을 쉽게 추가하고 확장할 수 있어 더 유연한 개발이 가능함 |
성능 및 안정성 | 직접 함수 호출은 성능 및 안정성에 직접적인 영향을 줄 수 있음 | 성능 및 안정성을 고려하여 설계되어 있어 더 안정적이고 일관된 서비스를 제공함 |
환경설정 및 FastAPI 실행
FunckyCall 프록시 서버를 활용하기 위해서 FastAPI 애플리케이션을 실행해야 하는데요. FastAPI 애플리케이션은 사용자가 요청하는 API 호출을 받아 FunckyCall 프록시 서버로 전달하여 다양한 AI 서비스와의 상호 작용을 용이하게 합니다. FastAPI는 Python으로 빠르고 현대적인 웹 애플리케이션을 구축하기 위한 웹 프레임워크입니다.
Git 복제 및 환경설정
먼저 아래 "git clone" 코드를 실행해서 GitHub의 FunckyCall 리포지토리를 로컬로 복제합니다. 다음은 funckycall 디렉토리로 이동해서 frontend 디렉토리를 app 디렉토리 하위로 이동합니다. 혹시 frontend 디렉토리 경로인식 에러가 발생하지 않는 다면 디렉토리 이동은 생략하셔도 됩니다. frontend 디렉토리 구조는 아래 내용을 참고하시면 됩니다.
https://github.com/unclecode/funckycall.git
git clone https://github.com/unclecode/funckycall.git
cd funckycall
frontend 디렉토리 위치 수정(funckycall/ -> app/)
cd app
uvicorn main:app --reload
funckycall/ │ ├── app/ │ ├── routes/ │ │ ├── __init__.py │ │ ├── proxy.py │ │ └── examples.py │ │ │ ├── utils.py │ ├── main.py │ └── __init__.py │ ├── .env └── frontend/ ├── assets/ │ └── css/ │ └── styles.css │ └── pages/ └── index.html |
funckycall/ │ ├── app/ │ ├── routes/ │ │ ├── __init__.py │ │ ├── proxy.py │ │ └── examples.py │ │ │ ├── frontend/ │ │ ├── assets/ │ │ │ └── css/ │ │ │ └── styles.css │ │ └── pages/ │ │ └── index.html │ │ │ ├── utils.py │ ├── main.py │ └── __init__.py │ └── .env |
frontend 디렉토리 위치 수정 전 디렉토리 구조 | frontend 디렉토리 위치 수정 후 디렉토리 구조 |
Groq API Key는 아래 명령어를 통해 입력하면 됩니다. API Key 발급은 아래 링크를 참고하세요
2024.02.29 - [AI 도구] - Groq LPU : 논문 한편 요약하는데 입력-추론-응답까지 2.4초!
export GROQ_API_KEY="발급받은 Groq API Key"
FastAPI 서버 실행
frontend 디렉토리 이동이 완료되면 app 디렉토리에서 "uvicorn main:app --reload" 명령어로 FastAPI 서버를 실행해서, main 모듈의 app 객체를 실행하고, 코드 변경이 감지되면 서버를 자동으로 다시 로드(reload)합니다. 명령을 실행할 때 경로인식 문제가 발생하는 경우 아래와 같이 "export PYTHONPATH" 명령으로 funckycall 디렉토리 경로를 지정해 줍니다.
(myenv) rg3270@DESKTOP-3PBV615:~/240313Groqfc/funckycall/app$ export PYTHONPATH=~/240313Groqfc/funckycall:$PYTHONPATH
(myenv) rg3270@DESKTOP-3PBV615:~/240313Groqfc/funckycall/app$ uvicorn main:app --reload
다음은 FastAPI 서버 실행을 위한 main.py 코드를 살펴보겠습니다.
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from starlette.requests import Request
from app.routes import proxy
from app.routes import examples
from app.utils import create_logger
import os
from dotenv import load_dotenv
load_dotenv()
app = FastAPI()
logger = create_logger(".logs/access.log")
app.mount("/static", StaticFiles(directory="frontend/assets"), name="static")
templates = Jinja2Templates(directory="frontend/pages")
@app.middleware("http")
async def log_requests(request: Request, call_next):
if "/proxy" in request.url.path:
client_ip = request.client.host
logger.info(f"Incoming request from {client_ip}: {request.method} {request.url}")
response = await call_next(request)
# logger.info(f"Response status code: {response.status_code}")
return response
else:
return await call_next(request)
app.include_router(proxy.router, prefix="/proxy")
app.include_router(examples.router, prefix="/examples")
@app.get("/", response_class=HTMLResponse)
async def read_item(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
if __name__ == "__main__":
import uvicorn
# uvicorn.run("main:app", host=os.getenv("HOST"), port=int(os.getenv('PORT')), workers=1, reload=True)
uvicorn.run("main:app", host=os.getenv("HOST"), port=int(os.getenv('PORT')), workers=1)
위 코드를 통해 실행되는 FastAPI 서버는 다음과 같은 기능을 제공합니다:
- 프록시 서버 기능: `/proxy` 엔드포인트를 통해 다른 서버로의 요청을 중계하고 응답을 받아 클라이언트에게 전달합니다. 이를 통해 클라이언트는 프록시 서버를 통해 외부 서버에 접근할 수 있습니다.
- 정적 파일 제공: `/static` 엔드포인트를 통해 정적 파일(예: CSS, JavaScript, 이미지 등)을 제공하여 웹 애플리케이션의 사용자 인터페이스를 구성합니다.
- 요청 로깅 기능: 모든 요청에 대한 로그를 생성하고, 클라이언트의 IP 주소, 요청 메서드, URL 등의 정보를 포함하여 요청의 추적과 디버깅을 용이하게 합니다.
- HTML 응답 제공: HTMLResponse 클래스를 사용하여 HTML 형식으로 응답을 제공하며, 이를 통해 클라이언트는 브라우저에서 보기 쉬운 형태로 웹 페이지를 표시할 수 있습니다. 이러한 기능을 통해 이 웹 애플리케이션은 다양한 클라이언트 요청을 처리하고, 프록시 서버 기능을 통해 외부 서버와의 통신을 중계하여 웹 서비스를 제공합니다.
예제코드 실행
다음은 예제코드 실행입니다. 이 코드의 출처는 유튜브 "Groq Function Calling: High Speed AI Application with Custom Tools" 이며, 블로그 내용을 위하여 제가 일부 수정하였습니다. 예제코드를 실행하려면 FastAPI 서버 실행상태를 유지하고 별도의 명령 프롬프트에서 실행해야 합니다. 예제코드는 Phidata, FunckyCall Tools, Gradio 활용예제 세 가지입니다. 먼저 Phidata를 활용한 예제를 살펴보겠습니다.
Phidata 예제
이 예제에서는 파이데이터를 통해 구축한 대화형 AI 어시스턴트의 인터넷 검색 실행결과를 FunckyCall로 전달하게 됩니다. 파이데이터는 함수 호출(Function Calling)을 사용하여 AI 어시스턴트를 구축하는 데 사용되는 도구 모음으로, 간단한 코드 구현을 통해 대규모 언어 모델이 함수를 호출하고 응답에 따라 다음 단계를 지능적으로 선택함으로써 사용자의 질문에 대답하거나 작업을 수행할 수 있도록 도와줄 수 있습니다. 파이데이터에 대한 내용은 아래 포스트를 참고 바랍니다.
2024.02.27 - [AI 도구] - 🤯 파이데이터(Phidata) : 5줄 코드로 토큰 과금없는 AI 어시스턴트 만들기
from phi.llm.openai.like import OpenAILike
from phi.assistant import Assistant
from phi.tools.duckduckgo import DuckDuckGo
import os, json
my_groq = OpenAILike(
model="mixtral-8x7b-32768",
api_key=os.environ["GROQ_API_KEY"],
base_url="http://127.0.0.1:8000/proxy/groq/v1"
)
assistant = Assistant(
llm=my_groq,
tools=[DuckDuckGo()], show_tool_calls=True, markdown=True
)
assistant.print_response("Whats happening in Large Language Models? Summarize top stories with sources, very short and concise.", stream=False)
위 코드는 다양한 AI 도구와 기능을 통합하는 도구 모음 "파이데이터"를 사용하여 대화형 AI 어시스턴트를 구축하고 결과를 Groq API를 통해 대형 언어 모델 Mixtral로 전달하는 예시입니다.
- `OpenAILike`: "파이데이터"를 사용하여 OpenAI의 언어 모델에 대한 인스턴스를 생성합니다. 이 모델은 "mixtral-8x7b-32768"로 지정되어 있으며, 이를 통해 자연어 이해 및 생성 작업을 수행할 수 있습니다. 또한 해당 모델에 대한 API 키가 환경 변수에서 로드됩니다.
- `DuckDuckGo`: "파이데이터"는 DuckDuckGo와 같은 추가 도구도 사용할 수 있습니다. 이 도구는 웹 검색 기능을 제공하여 대화형 AI 어시스턴트가 인터넷에서 정보를 가져올 수 있도록 합니다.
- `Assistant`: "파이데이터"의 핵심 요소 중 하나인 `Assistant` 클래스를 사용하여 대화형 AI 어시스턴트를 생성합니다. 이 어시스턴트는 앞서 설정한 언어 모델과 도구를 통합하여 사용자의 질문에 응답하고 작업을 수행합니다.
- `print_response`: 마지막으로, 어시스턴트를 사용하여 사용자의 질문에 대한 응답을 출력합니다. 이때, "Whats happening in Large Language Models? Summarize top stories with sources, very short and concise."라는 질문을 보내고, 그에 대한 응답을 인쇄합니다. 설정된 옵션에 따라 도구 호출과 함께 응답이 출력됩니다.
위 코드를 보면 Groq API에 연결된 Mixtral 언어 모델이 결과를 단순히 전달하는 것처럼 보이더라도 파이데이터 AI 어시스턴트와 DuckDuckGo와의 통합은 코드의 모듈화, 유연성, 확장성을 제공하며 더 복잡한 기능을 구현할 수 있도록 합니다. 예제코드의 실행결과는 다음과 같습니다. 응답시간은 두번째부터 더 빨라집니다.
질문 : 대규모 언어 모델에 대한 최신 소식을 알려주세요. 소스를 포함해서 매우 간략하고 간결하게 요약하세요.
응답 : 여기 대규모 언어 모델에 대한 주요 이야기입니다:
1. MIT Technology Review - 그리고 그것은 문제입니다. 그것을 이해하는 것은 우리 시대의 가장 큰 과학적 퍼즐 중 하나이며 더 강력한 미래 모델을 제어하기 위한 중요한 단계입니다.
2. Forbes - 대규모 언어 모델이 정말로 이해하는 것은 무엇입니까?
3. ZDNet on MSN.com - Google은 지역화된 대규모 언어 모델을 구축하기 위한 협력 노력에 합류합니다.
4. Africanews on MSN.com - AI 모델은 흑인 피고인에게 '사형을 선고 받을 것'을 권장함으로써 언어 편향을 보여줍니다.
5. Hackaday - 대규모 언어 모델은 Amiga 개발을 돕을 수 있습니다.
이 이야기들은 대규모 언어 모델이 작동하는 과학적 수수께끼부터 지역화 모델 구축 노력에 이르기까지 다양한 문제를 다룹니다. 또한 AI 모델에서의 언어 편향에 대한 우려도 포함되어 있습니다.
FunckyCall Tools 예제
다음은 FunckyCall Tools 활용예제입니다. FunckyCall 프록시는 클라우드 기반의 인터넷 서버에 다양한 함수가 호스팅 되어 있으며, 클라이언트(예: 여러분의 컴퓨터)가 FunckyCall에 HTTP 요청을 보내면 해당 서버에서 함수를 호출하고 결과를 반환합니다. 여러분의 컴퓨터는 단순히 FunckyCall 서버에 요청을 보내는 역할을 합니다.
import requests
import os
api_key=os.environ["GROQ_API_KEY"]
header = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
proxy_url = "http://127.0.0.1:8000/proxy/groq/v1/chat/completions"
request = {
"messages": [
{
"role": "system",
"content": "YOU MUST FOLLOW THESE INSTRUCTIONS CAREFULLY.\n<instructions>\n1. Use markdown to format your answers.\n</instructions>",
},
{
"role": "user",
"content": "Whats happening in AI today? Summarize top stories with sources, very short and concise.",
},
],
"model": "mixtral-8x7b-32768",
"tool_choice": "auto",
"tools": [
{
"type": "function",
"function": {
"name": "duckduck.search",
},
},
{
"type": "function",
"function": {
"name": "duckduck.news",
},
},
],
}
response = requests.post(
proxy_url,
headers=header,
json=request,
)
if response.status_code == 200:
res = response.json()
print(res["choices"][0]["message"]["content"])
else:
print("Error:", response.status_code, response.text)
위와 같이 FunckyCall Tools를 이용하면 함수의 이름만 명시하면 함수의 호출과 처리, 결과 반환이 간단하게 구현됩니다
프랑스의 최신 소식은 다음과 같습니다:
1. **파도타기, 카약, 그리고 캐누를 즐기는 프랑스:** 가디언은 프랑스에서 파도타기, 카약, 그리고 캐누를 즐길 수 있는 최고의 장소 10곳을 모았습니다. 푸른 바다부터 고요한 운하, 그리고 빙하 호수까지, 프랑스는 세계에서 가장 경치가 아름다운 패들링 경로를 제공합니다. [출처: 가디언](https://www.theguardian.com/travel/2024/mar/13/10-best-places-in-france-paddleboarding-kayaking-canoeing)
2. **BNP 파리바는 2024-2026년 이익 목표와 배당을 확인합니다:** 프랑스 최대 은행인 BNP 파리바가 다가오는 3년 동안의 수익 목표와 배당을 확인했습니다. 은행의 올해 순이익은 2023년보다 높을 것으로 예상됩니다. [출처: MSN](https://www.msn.com/en-gb/money/other/france-s-bnp-paribas-confirms-profit-targets-dividends-for-2024-2026/ar-BB1jNC6p)
3. **프랑스에서 말기 환자가 도움을 요청할 수 있도록 하는 제안:** 프랑스의 BNP 파리바가 2024-2026년 이익 목표와 배당을 확인합니다. 프랑스 최대 은행인 BNP 파리바가 다가오는 3년 동안의 수익 목표와 배당을 확인했습니다. [출처: CBS 뉴스](https://www.cbsnews.com/news/france-proposal-palliative-care-self-administer-lethal-substance-terminally-ill-patients/)
4. **러그비에서 프랑스를 이기는 방법:** 스티브 보스윅이 크리티시즘을 활용하여 잉글랜드의 식스 네이션스에서 아일랜드를 이기는 데 성공했지만, 그는 토요일에 리옹에서 공격적인 스타일을 유지해야 할 것입니다. [출처: 더 타임즈](https://www.thetimes.co.uk/article/how-to-beat-france-give-marcus-smith-and-furbank-licence-to-counter-657kvfzb9)
5. **프랑스 대통령 마크롱이 '도움을 주는' 법안을 발표합니다:** 프랑스 대통령 에마뉘엘 마크롱은 세계에서 가장 강력한 국가 중 하나인 프랑스의 역사는 몇 천 년에 걸쳐 풍부하고 복잡한 역사를 가지고 있습니다. 고대 골로마이와 로마인부터 프랑크 왕국과 프랑스 혁명까지, 프랑스는 서구 문명을 형성하는 데 중요한 역할을 해 왔습니다. 이 나라는 다양한 지역과 시대에서 영향을 받은 다양한 문화 유산을 가지고 있습니다. 오늘날 프랑스는 세계적인 강대국이자 예술, 패션, 요리, 그리고 명소로 유명한 관광지입니다.
Gradio 예제
다음은 Gradio 인터페이스를 활용해서 웹 사이트상에서 사용자가 질문을 요청하면, 두 번째 예제에서 살펴본 FunckyCall Tools를 통해 답변을 검색하여 응답을 출력하는 예제입니다. 예제코드와 실행결과는 아래 화면을 참고하시면 됩니다.
import gradio as gr
import requests
import os
def get_ai_response(question):
api_key=os.environ["GROQ_API_KEY"]
header = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
proxy_url = "http://127.0.0.1:8000/proxy/groq/v1/chat/completions"
request = {
"messages": [
{
"role": "system",
"content": "YOU MUST FOLLOW THESE INSTRUCTIONS CAREFULLY.\n<instructions>\n1. Use markdown to format your answers.\n</instructions>",
},
{
"role": "user",
"content": question,
},
],
"model": "mixtral-8x7b-32768",
"tool_choice": "auto",
"tools": [
{
"type": "function",
"function": {
"name": "duckduck.search",
},
},
{
"type": "function",
"function": {
"name": "duckduck.news",
},
},
],
}
response = requests.post(
proxy_url,
headers=header,
json=request,
)
if response.status_code == 200:
res = response.json()
return res["choices"][0]["message"]["content"]
else:
return f"Error: {response.status_code}, {response.text}"
question_input = gr.components.Textbox(lines=2, label="Enter your question")
output_text = gr.components.Textbox(label="Answer")
gr.Interface(get_ai_response, question_input, output_text, title="Mixtral-8x7b Chat by FunckyCall for Groq", description="Ask a question and get a response.").launch()
코드 내용은 두 번째 예제와 동일하며, 인터페이스만 Gradio를 활용하도록 수정한 코드입니다. 코드의 실행결과는 다음과 같습니다.
FunckyCall Proxy Server는 'unclecode'가 만든 오픈 소스 프로젝트로, GitHub에 호스팅되어 있습니다.
이는 Groq의 빠른 언어 처리 유닛(LPU) 및 기타 AI 제공 업체를 위한 함수 호출 기능을 제공하는 프록시 서버입니다.
FunckyCall의 주요 목표는 클라우드에 호스팅되는 다양한 내장 함수를 제공함으로써 AI 어시스턴트를 만드는 것을
더 쉽게 만드는 것입니다. 이를 통해 코드베이스에서 함수 스키마를 유지하는 필요성이 제거됩니다. 가까운 미래에는
FuncyHub가 이러한 서비스를 제공하기 위해 출시될 것입니다.
마치며
오늘은 Groq의 LPU와 같은 빠른 언어 모델을 활용하여 다양한 기능을 구현하는 데 유용한 도구인 FunckyCall 프록시 서버에 대해서 알아보았습니다. 인공지능 기술이 발전하면서 AI 어시스턴트 및 애플리케이션의 개발이 점점 더 활발해지고 있는 가운데 FunckyCall과 같은 도구는 이러한 개발 과정을 간소화하고 효율성을 높여줄 수 있을 것으로 보입니다.
FunckyCall을 활용하여 다양한 AI 어시스턴트 및 애플리케이션을 구축하고자 하는 개발자에게 이 블로그가 도움이 되었기를 바라면서 저는 다음 시간에 더 유익한 정보를 가지고 다시 찾아뵙겠습니다. 감사합니다.
2024.02.29 - [AI 도구] - Groq LPU : 논문 한편 요약하는데 입력-추론-응답까지 2.4초!
'AI 도구' 카테고리의 다른 글
Ultralytics YOLO v8: 누구나 손쉽게 할 수 있는 컴퓨터 비전 작업 솔루션 (2) | 2024.03.22 |
---|---|
🚀Groq API와 Streamlit으로 만드는 슈퍼 패스트 웹사이트 URL 채팅봇! (2) | 2024.03.16 |
MusicLang: 대형 언어 모델로 누구나 쉽게 MIDI 음악 작곡하기 (0) | 2024.03.13 |
[꿀팁] 비행기 모드 AI 채팅! MLCChat으로 스마트폰 데이터 연결 없이 AI 즐기기 (0) | 2024.03.10 |
🚀Unsloth : 메모리 60% 절약, 훈련 속도 30배 향상! 나만의 LLM 만들기 (0) | 2024.03.03 |