■ LLM 클래스를 사용해 커스텀 LLM을 만드는 방법을 보여준다.
▶ 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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
from typing import Optional from typing import List from typing import Any from typing import Iterator from typing import Dict from langchain_core.language_models.llms import LLM from langchain_core.callbacks.manager import CallbackManagerForLLMRun from langchain_core.outputs import GenerationChunk class CustomLLM(LLM): """입력의 첫 번째 `n` 문자를 반영하는 사용자 정의 채팅 모델이다. LangChain에 구현을 제공할 때 초기화 매개변수를 포함하여 모델을 주의 깊게 문서화하고, 모델을 초기화하는 방법에 대한 예제를 포함하고, 기본 모델 문서 또는 API에 대한 관련 링크를 포함한다. 예제 : .. code-block:: python customLLM = CustomLLM(n = 2) responseString = customLLM.invoke([HumanMessage(content = "hello")]) responseStringList = customLLM.batch([[HumanMessage(content = "hello")], [HumanMessage(content = "world")]]) """ characterCount : int """에코할 프롬프트의 마지막 메시지 문자 수이다.""" def _call(self, prompt : str, stop : Optional[List[str]] = None, runManager : Optional[CallbackManagerForLLMRun] = None, **kwargs : Any) -> str: """주어진 입력에 대해 LLM을 실행한다. LLM 논리를 구현하려면 이 메서드를 재정의한다. 인자 : prompt : 생성할 프롬프트이다. stop : 생성 시 사용할 단어를 중지한다. 중지 하위 문자열이 처음 발생하면 모델 출력이 잘린다. 중지 토큰이 지원되지 않으면 NotImplementedError 발생을 고려한다. runManager : 실행을 위한 콜백 관리자. **kwargs : 임의의 추가 키워드 인수이다. 이는 일반적으로 모델 공급자 API 호출에 전달된다. 반환값 : 모델은 문자열로 출력된다. 실제 완료에는 프롬프트가 포함되어서는 안된다. """ if stop is not None: raise ValueError("stop kwargs are not permitted.") return prompt[: self.characterCount] def _stream(self, prompt : str, stop : Optional[List[str]] = None, runManager : Optional[CallbackManagerForLLMRun] = None, **kwargs : Any) -> Iterator[GenerationChunk]: """주어진 프롬프트에서 LLM을 스트리밍한다. 이 메서드는 스트리밍을 지원하는 하위 클래스로 재정의되어야 한다. 구현되지 않은 경우 스트림 호출의 기본 동작은 모델의 비스트리밍 버전으로 폴백하고 출력을 단일 청크로 반환하는 것이다. 인자 : prompt : 생성할 프롬프트. stop : 생성 시 사용할 단어를 중지합니다. 모델 출력은 이러한 하위 문자열이 처음 나타날 때 잘린다. run_manager : 실행을 위한 콜백 관리자이다. **kwargs : 임의의 추가 키워드 인수입니다. 이는 일반적으로 모델 공급자 API 호출에 전달됩니다. 반환값 : GenerationChunk의 반복자이다. """ for character in prompt[: self.characterCount]: chunk = GenerationChunk(text = character) if runManager: runManager.on_llm_new_token(chunk.text, chunk = chunk) yield chunk @property def _identifying_params(self) -> Dict[str, Any]: """식별 매개변수의 사전을 반환한다.""" # 모델 이름을 통해 사용자는 LLM 모니터링 애플리케이션에서 사용자 정의 토큰 계산 규칙을 지정할 수 있다. # 예를 들어 LangSmith에서 사용자는 모델에 대한 토큰당 가격을 제공하고 지정된 LLM에 대한 비용을 모니터링할 수 있다. return { "model_name": "CustomChatModel"} @property def _llm_type(self) -> str: """이 채팅 모델에서 사용되는 언어 모델 유형을 가져옵니다. 로깅 목적으로만 사용된다.""" return "custom" customLLM = CustomLLM(characterCount = 5) responseString = customLLM.invoke("This is a foobar thing") print(responseString) """ This """ responseStringList = customLLM.batch(["woof woof woof", "meow meow meow"]) print(responseStringList) """ ['woof ', 'meow '] """ |
▶ 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 |
aiohttp==3.9.5 aiosignal==1.3.1 annotated-types==0.7.0 async-timeout==4.0.3 attrs==23.2.0 certifi==2024.6.2 charset-normalizer==3.3.2 frozenlist==1.4.1 greenlet==3.0.3 idna==3.7 jsonpatch==1.33 jsonpointer==3.0.0 langchain==0.2.6 langchain-core==0.2.10 langchain-text-splitters==0.2.2 langsmith==0.1.82 multidict==6.0.5 numpy==1.26.4 orjson==3.10.5 packaging==24.1 pydantic==2.7.4 pydantic_core==2.18.4 PyYAML==6.0.1 requests==2.32.3 SQLAlchemy==2.0.31 tenacity==8.4.2 typing_extensions==4.12.2 urllib3==2.2.2 yarl==1.9.4 |
※ psp install langchain 명령을 실행했다.