■ BaseChatModel 클래스를 사용해 네이버 HyperClovaX 모델을 연동하는 방법을 보여준다.
※ X-NCP-CLOVASTUDIO-API-KEY 환경 변수 값은 .env 파일에 정의한다.
※ X-NCP-APIGW-API-KEY 환경 변수 값은 .env 파일에 정의한다.
▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import os import requests from dotenv import load_dotenv from langchain_core.language_models import BaseChatModel from pydantic import Field from typing import List from langchain_core.messages import BaseMessage from typing import Optional from langchain_core.callbacks import CallbackManagerForLLMRun from typing import Any from langchain_core.messages import AIMessage from langchain_core.outputs import ChatGeneration from langchain_core.outputs import ChatResult load_dotenv() class ChatHCX(BaseChatModel): apiURL : str = Field(default = "https://clovastudio.stream.ntruss.com/testapp/v1/chat-completions/HCX-DASH-001") @property def _llm_type(self) -> str: return "HyperCLOVA X" def _generate(self, messageList : List[BaseMessage], stop : Optional[List[str]] = None, runManager : Optional[CallbackManagerForLLMRun] = None, **kwargs : Any) -> ChatResult: headerDictionary = { "Content-Type" : "application/json", "X-NCP-CLOVASTUDIO-API-KEY" : os.getenv("X-NCP-CLOVASTUDIO-API-KEY"), "X-NCP-APIGW-API-KEY" : os.getenv("X-NCP-APIGW-API-KEY") } def mapRole(role : str) -> str: if role == "human": return "user" elif role == "ai": return "assistant" else: return role finalMessageList = [{"role" : mapRole(message.type), "content" : message.content} for message in messageList] dataDictionary = { "messages" : finalMessageList, "maxTokens" : 100, "temperature" : 0.5, "topP" : 0.8, "repeatPenalty" : 5.0 } response = requests.post(self.apiURL, json = dataDictionary, headers = headerDictionary) responseJSON = response.json() aiMessage = AIMessage(content = responseJSON["result"]["message"]["content"]) generation = ChatGeneration(message = aiMessage) return ChatResult(generations = [generation]) chatHCX = ChatHCX() responseAIMessage = chatHCX.invoke("한국의 수도는?") print(responseAIMessage.content) """ 한국의 수도는 서울입니다. 서울은 대한민국의 중심 도시로, 정치, 경제, 문화, 교육 등 다양한 분야에서 중요한 역할을 하고 있습니다. 대한민국의 대표적인 관광지 중 하나이기도 하며 경복궁, 덕수궁, 창덕궁 등의 궁궐과 인사동, 명동, 홍대 등의 쇼핑 및 문화 거리가 유명합니다. 다른 질문이나 도움이 필요하시면 언제든지 말씀해주세요. """ |
▶ requirements.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
aiohappyeyeballs==2.4.4 aiohttp==3.11.11 aiosignal==1.3.2 annotated-types==0.7.0 anyio==4.7.0 attrs==24.3.0 certifi==2024.12.14 charset-normalizer==3.4.1 frozenlist==1.5.0 greenlet==3.1.1 h11==0.14.0 httpcore==1.0.7 httpx==0.28.1 idna==3.10 jsonpatch==1.33 jsonpointer==3.0.0 langchain==0.3.13 langchain-core==0.3.28 langchain-text-splitters==0.3.4 langsmith==0.2.6 multidict==6.1.0 numpy==2.2.1 orjson==3.10.12 packaging==24.2 propcache==0.2.1 pydantic==2.10.4 pydantic_core==2.27.2 python-dotenv==1.0.1 PyYAML==6.0.2 requests==2.32.3 requests-toolbelt==1.0.0 sniffio==1.3.1 SQLAlchemy==2.0.36 tenacity==9.0.0 typing_extensions==4.12.2 urllib3==2.3.0 yarl==1.18.3 |
※ pip install python-dotenv langchain 명령을 실행했다.