상용 수준의 LLM 애플리케이션을 위한 개발자 가이드(The Developer's Guide to Production-Grade LLM Apps)


상용 수준의 LLM 애플리케이션을 위한 개발자 가이드/ The Developer's Guide to Production-Grade LLM Apps

TAL PERETZ • Nov 15, 2023


LLM 성능 극대화/Maximizing LLM Performance

LLM 애플리케이션을 개발하는 것과 상용(프로덕션) 환경에 성공적으로 배포하는 것은 별개의 문제입니다. 개발자들에게 있어 유망한 프로토타입을 확장 가능하고 안정적인 제품으로 발전시키는 과정에는 장애물로 어지럽혀져 있습니다. 이러한 장애물들은 비용 관리부터, 편향(bias)이나 환각(hallucination)과 같은 문제로부터 모델의 정확성을 보장하는 것까지 다양합니다.

Developing LLM applications is one thing; deploying them successfully in production is another. For developers, the path from a promising prototype to a scalable, stable product is often cluttered with obstacles. These range from managing costs to ensuring the model's accuracy against issues like bias or hallucination.

새로운 AI 프로젝트를 진행할 때, 초기에는 주로 품질을 최적화하고 최상의 사용자 경험을 제공하는 것에 집중하게 됩니다. 이 목표를 달성하고 나면 그 다음 중요한 단계는 기존의 품질을 손상시키지 않으며 비용을 최적화하는 것입니다.

When working on a new AI project, the initial focus is often on optimizing quality and delivering the best user experience. Once this is achieved, the next crucial step is optimizing costs without compromising the established quality.

이 글에서는 여러분들이 개발한 LLM 애플리케이션을 개발 환경에서 엄격(rigors)한 프로덕션 환경으로 전환할 때, 정확도(accuracy)를 극대화할 수 있는 개발자 가이드를 제공하여 복잡도를 줄이고자 합니다.

This post cuts through the complexity, offering a developer's guide to maximizing accuracy as you transition your LLM applications from the dev environment to the rigors of production.

:warning:홍보 링크:warning:: 저자의 새로운 글을 구독하거나 후원해주세요!

프롬프트 엔지니어링 - 시작 단계 / Prompt Engineering: The Starting Block

모든 LLM 여정은 프롬프트 엔지니어링에서 시작합니다. 프롬프트 엔지니어링은 초기 대화들(initial conversations)로부터 빠르게 프로토타입을 제작하고 반복하며 모델을 시작하는 첫 단계입니다. 이 단계를 개발하려는 LLM의 샌드박스(sandbox) 시기로 생각하시면 됩니다. 이 단계에서는 기능을 탐색하고, 기본적인 사항들을 설정하고, 현실 세계의 피드백을 받을 준비가 된 버전을 출시(roll out)합니다. 단순히 LLM이 답을 하게 만드는 것이 아니라, 일관성 있고 맥락에 맞는 답변을 하도록 하고, 더 복잡한 상호 작용을 위한 디딤돌(stepping stone)을 마련하는 것입니다.

"프롬프트 엔지니어링은 단순히 질문을 하는 것이 아닙니다; '제대로' 질문하는 것입니다."

Every LLM journey begins with prompt engineering. It's the first step that gets your model off the ground by rapidly prototyping and iterating through initial conversations. Consider this phase your LLM's sandbox period—it's about exploring the capabilities, setting up the basics, and rolling out a version that's ready for real-world feedback. It's not just about getting the LLM to respond; it's about crafting those responses to be coherent, contextually relevant, and a stepping stone for more complex interactions.

Prompt engineering isn't just about asking; it's about asking well.

프롬프트를 더욱 정제(refine)하기 위한 다음 전략들을 살펴보세요:

To further refine your prompts, consider these strategies:

  • 명확한 지침 작성(Write Clear Instructions): 명백(unambiguous)하고 명확(precise)한 시스템 메시지와 프롬프트를 작성하세요. 명확(clarity)한 프롬프트는 LLM의 출력에 큰 영향을 끼치며, 모델이 처리해야 하는 작업에 대해서 정확히(solid) 이해할 수 있도록 합니다.
  • Write Clear Instructions: Craft system messages and prompts that are precise and unambiguous. The clarity of your prompts significantly influences the LLM's output, ensuring that the model has a solid understanding of the task at hand.
  • 복잡한 작업을 나누기(Split Complex Tasks): 복잡(intricate)한 작업들을 더 간단한 하위 작업들로 쪼개세요. 이렇게 하면 LLM이 각각의 구성 요소에 집중할 수 있게 되어, 전체 작업을 덜 어려워(daunting)하고 더 잘 관리할 수 있게됩니다.
  • Split Complex Tasks: Break down intricate tasks into simpler subtasks. This allows the LLM to tackle each component with focus, making the overall task less daunting and more manageable.
  • '일부 예시로 학습' 활용하기(Leverage Few-Shot Learning): 기본적인 사항들을 설정한 뒤에는 일부 예시를 통해 모델이 일반화하도록 하는 '퓨-샷 러닝(few-shot learning)'을 사용할 수 있습니다. 이 방법은 대규모의 학습 데이터 없이도 LLM의 기능들을 빠르게 확장하는데 매우 유용하며, 간단한 답변부터 복잡한 대화에 이르기까지 여러분의 LLM 여정을 가속화하는 역할을 합니다.
  • Leverage Few-Shot Learning: After establishing the basics, Few-Shot Learning empowers the model to generalize from a few examples. This method is invaluable for rapidly expanding the LLM's capabilities without the need for extensive training data, acting as an accelerator in your LLM's journey from simple responses to complex conversations.
  • 답변에 스스로 설명 붙이기(Integrate Self-Explanation in Responses): 프롬프트를 만들 때 LLM이 답변만 제공하는 것이 아니라 왜 그러한 답변을 하는지를 설명하도록 요청해보세요. 이러한 기법은 모델의 출력을 정확하게 만들뿐만 아니라, 기본 논리가 탄탄하고 이해하기 쉽도록 합니다.
  • Integrate Self-Explanation in Responses: When crafting prompts, include a request for the LLM to not only provide an answer but also to explain its reasoning within the same response. This technique ensures that the model's output is not just accurate, but also that the underlying logic is sound and comprehensible
  • AI를 사용한 프롬프트 최적화(Use AI to Optimize Your Prompts): AI 어시스턴트를 사용하여 프롬프트를 구성하게 되면, 모델의 처리 방식에 더 일치(align)하고 명확(clear)해지게 되어 답변의 정확도(accuracy)가 향상됩니다.
  • Use AI to Optimize Your Prompts: When prompts are constructed with AI assistance, they tend to be clearer and more aligned with the model's processing, thereby enhancing the accuracy of the responses.

프롬프트 만들기 GPT: 메시지를 예시와 함께 명확하고 정확한 프롬프트로 변환합니다. / Promptify GPT: Converts messages into clear, precise prompts with examples.
프롬프트 만들기 GPT: 메시지를 예시와 함께 명확하고 정확한 프롬프트로 변환합니다. / Promptify GPT: Converts messages into clear, precise prompts with examples

평가의 역할: (항해의 기준) 북극성 / The Role of Evals: Your North Star

평가(Evaluation)는 결과의 품질(quality)과 정확도(accuracy)에 초점을 맞춘, 성능 측정치를 제공하는 AI 개발의 주춧돌입니다. 비결정론적(non-deterministic)인 AI 세계에서는 이러한 성능 측정 기준(metric)을 이해하고 지속적으로 모니터링하는 것이 매우 중요합니다.

Evaluations are a cornerstone in AI development, offering a measure of performance that focuses on accuracy and the quality of outcomes. In the non-deterministic world of AI, understanding and continually monitoring these performance metrics is crucial.

AI 평가를 체계적으로 접근하기 / Systematic Approach to AI Evaluations

처음에는 개발자가 다양한 프롬프트를 입력하며 AI의 응답을 관찰하는 수동적 탐색(manual exploration)으로 평가를 시작할 수 있습니다. 시간이 지남에 따라 성능이 안정화되면, 신중하게 선별된 데이터셋을 사용하여 보다 구조화된 평가로 전환하는 것이 중요해집니다.

Initially, evaluations might start off as manual explorations, where developers input various prompts to observe the AI's responses. Over time, as performance stabilizes, it becomes important to shift to a more structured evaluation using carefully curated datasets.


OpenAI 플레이그라운드 / OpenAI Playground

심층 테스트를 위해 데이터셋 활용하기 / Dataset Utilization for In-depth Testing

더 엄격한 테스트를 위한 첫 단계는 맞춤형 데이터셋(tailored dataset)을 생성하는 것입니다. 이를 통해 고품질의 결과를 보장하기 위해 직접 검토(manual review)하여 AI의 답변에 대한 포괄적이고 정밀하게 조사(scrutiny)할 수 있습니다. 일반적으로 데이터셋의 평가 절차는 아래 내용들을 포함합니다:

The creation of a tailored dataset is a foundational step toward more rigorous testing. It allows for comprehensive scrutiny of the AI's responses, with a focus on manual review to ensure high-quality output. The process of evaluating datasets typically involves:

  • LLM으로 데이터셋 실행(Running LLMs over the dataset): 여러분의 데이터셋의 데이터 하나하나를 여러분의 LLM으로 테스트합니다. 이 단계에서는 여러분들이 포함해둔 각각의 특정 시나리오들을 LLM이 얼마나 잘 처리하는지를 확인합니다.
  • Running LLMs over the dataset: Test your LLM with each data point in your dataset. This step is about checking how well the LLM handles each specific scenario you've included.
  • 직접 검토(Manual Review): 자동화된 테스트에만 전적으로 의존하지 마세요. LLM의 답변들을 직접 검토해야 합니다. 이렇게 하면 기계가 놓칠 수 있는 뉘앙스(nuance)와 미묘한 차이(subtlety)들을 포착하는데 도움이 됩니다.
  • Manual Review: Don't rely solely on automated tests. Manually go through the LLM's responses. This helps catch nuances and subtleties that machines might miss.
  • 피드백 매커니즘(Feedback Mechanisms): 시스템을 사용하여 평가 설정 내에 피드백을 수집(record)하세요. 이렇게 하면 더 쉽게 트렌드(trend)를 파악하고 이슈를 빠르게 찾아내어 LLM을 지속적으로 개선할 수 있습니다.
  • Feedback Mechanisms: Use a system within your evaluation setup to record feedback. This makes it easier to spot trends, identify issues quickly, and refine your LLM continually.


Langsmith의 평가용 데이터셋 / Datasets for Evals in Langsmith

AI의 평가로 평가 개선하기 / Refining Evaluations with AI Assessments

평가 절차를 확장성 있게 가져가기 위해서는, 특히 데이터의 양이 증가함에 따라 자동화된 지표(metric)를 사용하여 검토(review)를 가이드할 수 있습니다. 이러한 지표들은 특별히 주의가 필요한 영역을 식별하는 데 도움이 될 수는 있지만, 성능에 대한 절대적 지표(definitive measure)로 활용하기보다는 지침(guide) 정도로 사용해야 합니다.

For a scalable evaluation process, automated metrics can be employed to guide the review, especially as the volume of data increases. These metrics can help identify areas that require special attention, though they should be used as guides rather than definitive measures of performance.

평가를 위한 지표들 / Metrics to evaluate:



BrainTrust에서의 평가 / Evals in BrainTrust

사람의 평가를 모범 기준으로 삼기 / Human Evaluation as the Gold Standard

AI 성능에 대한 최종적인 측정은 여전히 사람의 평가에 의존합니다. 이 과정에는 다음이 포함됩니다:

The ultimate measure of an AI's performance still relies on human evaluation. This process involves:

  • 주관적 분석(Subjective Analysis): 자동화된 시스템이 완전히 포착하지 못할 수 있는 창의성, 유머, 사용자 관여와 같은 요소들을 평가합니다.
  • Subjective Analysis: Assessing elements like creativity, humor, and user engagement that automated systems may not fully capture.
  • 자동화된 지표의 유효성 검사(Validation of Automated Metrics): 자동화된 평가가 사람의 판단과 일치하는지, AI의 출력이 예상했던 기준을 충족하는지를 확인합니다.
  • Validation of Automated Metrics: Confirm that the automated evaluations are aligned with human judgment and that the AI's outputs meet the expected standards.

피드백 통합 및 모델 개선 / Feedback Integration and Model Refinement

사람의 평가를 통한 피드백을 개발 단계에 체계적으로 통합할 수 있습니다. 이는 AI 모델을 미세조정(fine-tuning)하여 정확도를 높이는데 도움이 되며, 비용 효율성이나 품질 개선을 위해 모델을 변경(adapt)할 때도 도움이 됩니다.

Feedback from human evaluations can be systematically integrated into the development process. This not only helps in fine-tuning the AI model to enhance its accuracy but also aids in adapting the model for cost efficiency or quality improvement.

RAG: 필요 시 상황에 맞는 심층 정보 / RAG: Contextual Depth When Needed


RAG (Superannotate)

RAG는 LLM에 추가적인 컨텍스트 계층(layer)이 필요할 때 사용합니다. 이 방법은 외부의 지식을 활용하여 모델의 답변을 향상시킵니다. 하지만, 항상 RAG가 적절한 도구는 아닙니다. 평가를 통해 지식의 격차가 발견되거나 모델에 더 넓은 컨텍스트가 필요한 경우에 RAG를 호출하세요.

RAG comes into play when your LLM needs an extra layer of context. This method is about leveraging external knowledge to enhance the model's responses. However, it's not always the right tool. Invoke RAG when evaluations reveal knowledge gaps or when the model requires a wider breadth of context.

시도해 볼 기법들 / Techniques to Experiment With:

  • 반복 검색(Iterative Retrieval): LLM이 후속 질문을 통해 검색을 구체화(refine)하고 검색된 정보의 연관성을 개선할 수 있도록 반복 검색 전략을 시도(experiment)해보세요. 반복 검색 예시
  • Iterative Retrieval: Experiment with iterative retrieval strategies, where the LLM can ask follow-up questions to refine its search and improve the relevance of the information retrieved. example.
  • 조각 나누기(Chunking Experiments): 데이터를 관리할 수 있는 조각(chunk)으로 나누고 작아진 조각들에 대한 임베딩(embedding)을 생성하세요. 이렇게 하면 검색 절차의 세밀함(granularity)을 개선하고, 보다 목적에 맞는 답변을 제공할 수 있습니다. 조각 나누기 예시
  • Chunking Experiments: Break down your data into manageable chunks and create embeddings for these smaller pieces. This can potentially improve the granularity of the retrieval process and provide more targeted responses. example.
  • Reranking: After the initial retrieval, use a secondary model to rerank the results based on additional criteria for relevance. A classification step can further categorize responses to fine-tune the selection process for the end-user. example.
  • 하이브리드 데이터 포함 검색(HyDE, Hybrid Data-Enabled Retrieval): 가상의 문서를 생성하고 이를 임베딩 조회(lookup) 시에 사용하여 RAG의 기능을 강화합니다. HyDE 예시
  • Hybrid Data-Enabled Retrieval (HyDE): Enhance RAG's capabilities by generating hypothetical documents and using those for embedding lookup. example.
  • 미세 조정된 임베딩(Fine-Tuned Embeddings): 여러분의 LLM의 임베딩 계층을 커스터마이징하여 특정 데이터셋의 미묘한 차이를 더 잘 포착할 수 있도록 맞춤 설정(customize)합니다. 이를 통해 정보에 대한 더 세밀(nuanced)한 이해와 검색이 가능해지며, 사용자의 요청에 더 근접한 정보를 제공할 수 있습니다. 미세 조정된 임베딩 예시
  • Fine-Tuned Embeddings: Customize the embedding layers of your LLM to better capture the subtleties of your specific dataset, allowing for a more nuanced understanding and retrieval of information that is closely matched to the user's request. example.
  • 쿼리 확장(Query Expansion) : 추가적인 용어(term), 동의어(synonym) 및 관련 개념들을 사용하여 쿼리를 변경하거나 보강(augment)하여 정보 검색 시 더 넓은 그물을 펼칠 수 있는 별도 함수를 사용하여 LLM의 이해 범위를 넓힐 수 있습니다.
  • Query Expansion: Utilize specialized functions that can expand the scope of your LLM's understanding by modifying or augmenting queries with additional terms, synonyms, or related concepts, ensuring a wider net is cast for information retrieval.

미세조정: 전문화의 기술 / Fine-Tuning: The Art of Specialization


미세조정(SuperAnnotate) / Fine-tuning (SuperAnnotate)

미세조정은 애플리케이션의 특정 작업(task), 고유한 음성(unique voice) 및 상황(context)에 맞춰 LLM을 개조하는 전문화 작업입니다. 철저한 평가를 통해 모델의 숙련도(proficiency)를 측정한 뒤 미세 조정 여부를 결정할 수 있습니다. 산업별로 특화된 은어(jargon)를 이해해야 하거나, 일관된 개성(personality)을 유지하거나, 특정 영역(domain)에 대한 깊은 이해가 필요하다면, 미세 조정이 바로 필요한 절차입니다.

LLM을 미세조정하는 것은 모델의 성능을 크게 향상시킬 수 있는 미묘(nuance)한 절차입니다 - 올바르게 수행한다면 말이죠. 하지만, 미세조정을 위한 노력을 헛되지 않게 하기 위해서는 몇 가지 주의해야 하는 보편적인 함정이 있습니다. 이제 이러한 함정들을 자세히 살펴보고 어떻게 이러한 함정들을 피할 수 있는지 얘기해보겠습니다:

Fine-tuning an LLM is a nuanced process that can significantly elevate the performance of your model—if done correctly. However, there are several common pitfalls that you need to be aware of to ensure your fine-tuning efforts don't go astray. Let's delve into these pitfalls and discuss how to circumvent them:

학습 데이터의 부족: 양과 질의 균형 문제 / Insufficient Training Data: The Quantity-Quality Equilibrium

가장 널리 퍼진 문제 중 하나는 학습 데이터의 부족입니다. LLM은 대규모(large)의, 다양(diverse)한 데이터셋에서 잘 동작합니다. 따라서 부적절(inadequate)한 데이터로 미세조정을 하게 되면 모델이 과적합(overfitting)하게 되어, 학습 데이터에서는 잘 동작하지만 학습 시 보지 못한(unseen) 데이터로는 제대로 동작하지 않을 수 있습니다. 모델을 학습할 때에는 각 작업별로 최소한 1,000건 이상의 양질의 예시를 포함하는 강건(robust)한 데이터셋을 구성하세요.

One of the most prevalent issues is the scarcity of training data. LLMs thrive on large, diverse datasets; thus, fine-tuning with inadequate data can lead to overfitting where the model performs well on the training data but poorly on unseen data. Aim for a robust dataset with at least 1,000 quality examples for each task you're training the model to perform.

불균형한 학습 데이터: 편향성 딜레마 / Unbalanced Training Sets: The Bias Dilemma

(학습에 사용한) 데이터셋이 현실 세계의 시나리오에 대한 다양성(variety)과 분포(distribution)을 대표하지 못하는 경우 모델의 출력이 왜곡(skew)될 수 있습니다. 이러한 왜곡은 분류(class) 불균형으로 특정한 데이터(outcome)가 과도하게 존재(overrepresent)하는 경우 종종 발생합니다. 데이터가 부족(underrepresent)한 분류(class)에 속한 데이터를 오버샘플링하는 등의 기법을 사용하면 데이터셋의 균형을 맞추고 잠재적 편향성(bias)을 완화하는데 도움이 됩니다.

A dataset that doesn't represent the variety or distribution of real-world scenarios can skew your model's outputs. This often occurs with class imbalances where certain outcomes are overrepresented. Techniques like oversampling the underrepresented classes can help to balance your dataset and mitigate potential biases.

공개 데이터 재사용: 새로운 신호가 필수적 / Reusing Public Data: The New Signal Imperative

LLM은 일반적으로 초기 학습 단계에서 방대한 양의 공개 데이터에 노출됩니다. 미세조정을 위해 이러한 공개 데이터셋에 의존하는 것은 중복적이며 모델의 학습 능력을 제한할 수 있습니다. 모델에 무엇인가 새로운 것을 학습시킬 수 있는 고유하고 독점적인 데이터를 추가하는데 집중하세요.

LLMs have typically been exposed to vast swathes of public data during initial training phases. Relying on these datasets for fine-tuning is redundant and can limit your model's ability to learn. Focus on incorporating unique, proprietary data that can teach the model something new.

부족한 프롬프트 엔지니어링: 명확한 명령 / Poor Prompt Engineering: The Clarity Commandment

LLM 학습 경로의 길잡이 역할을 하는 프롬프트의 품질은 중요합니다. 뜻이 모호(ambiguous)하거나 애매(vague)한 프롬프트는 모델이 안 좋게(poorly) 일반화되는 결과를 초래할 수 있습니다. 명확하고, 풍부한 컨텍스트를 갖춘 프롬프트를 만드는데 시간을 투자하고, 모델의 답변을 기반으로 반복(해서 개선)하면서 프롬프트를 더 효과적으로 만드세요.

The quality of your prompts is instrumental in guiding the LLM's learning path. Vague or ambiguous prompts can result in a model that generalizes poorly. Invest time in crafting clear, context-rich prompts and iterate based on the model's responses to hone their effectiveness.

점진적으로 평가하지 않음: 지속적인 실수 / Not Evaluating Incrementally: The Continuous Oversight

미세조정 시에 "설정 후 잊어버리는" 접근 방식은 흔한 실수입니다. 정기적인 평가 과정이 없다면, 너무 늦을 때까지 문제를 발견하지 못할 수 있습니다. 품질과 성능을 보장하기 위해 미세조정의 여러 단계들에 지속적인 테스트와 검증을 위한 시스템을 구현하세요.

A common oversight in fine-tuning is the "set it and forget it" approach. Without regular evaluations, you might not detect issues until it's too late. Implement a system for continuous testing and validation at various stages of fine-tuning to ensure quality and performance.

이러한 함정들을 피해가면서 성공적인 미세조정을 위한 탄탄한 기반을 마련할 수 있습니다. 이제 LLM의 정확도(accuracy)와 신뢰도(reliability)를 더욱 향상시킬 수 있는 최신(state-of-the-art)의 학습 방법론들을 살펴보겠습니다.

By steering clear of these pitfalls, you lay a solid foundation for fine-tuning success. Now, let's explore state-of-the-art training methodologies that can further enhance your LLM's accuracy and reliability.

모든 것이 필요할 때 / When You Need All

미세조정과 RAG, 프롬프트 엔지니어링은 요구사항을 충족시키기 위해 LLM을 개선하는데 필요한 도구들입니다. 모든 것을 사용한다는 것은 LLM을 내부 및 외부에서 변경하는 것을 뜻합니다.

Finetuning, RAG, and prompt engineering are all necessary tools for improving your LLM until it meets your needs. Using all means changing your LLM from the inside and the outside.

프롬프트 엔지니어링으로 토대(groundwork)를 마련하고 RAG로 컨텍스트를 확장했다면, 학습 예시에 있는 추가적인 RAG 콘텐츠로 미세조정을 하는 것은 경향성(transformative)을 가지게 할 수 있습니다. 이러한 접근 방식은 RAG가 제공하는 풍부하고 구체적인 상황 정보들로 모델의 기반 지식(foundation knowledge)을 강화하는 것입니다. 이렇게함으로써 상용(프로덕션) 환경의 요구 사항에 맞춰 세밀하게 미세조정된 모델을 만듭니다.

When prompt engineering has laid the groundwork, and RAG has expanded the context, fine-tuning with additional RAG content in the training examples can be transformative. This approach is about reinforcing the model's foundational knowledge with the rich, contextual details provided by RAG, leading to a finely-tuned model that's ready for the demands of a production environment.

정확도 극대화를 위한 여정 / The Road to Max Accuracy
정확도 극대화를 위한 여정 / The Road to Max Accuracy

마무리하며 / Closing Thoughts

상용 LLM을 구축하는 것은 정밀한 엔지니어링과 신중한 의사결정이 복잡하게 얽혀있는 종합 예술(intricate dance)입니다. 프롬프트 엔지니어링과 강건한 평가 제품군의 안내, RAG가 제공하는 깊이 있는 상황 정보(contextual depth)와 맞춤형 미세조정을 통한 정교함이 요구되는 공예(craft)입니다.

Building LLMs for production is an intricate dance of precision engineering and deliberate decision-making. It’s a craft that requires a strong foundation in prompt engineering, the guidance of a robust evaluation suite, the contextual depth provided by RAG, and the bespoke refinement of fine-tuning.

끊임없이 반복하고 개선하면서, 여러분의 평가 도구들(suite)을 통해 LLM 개발 과정에 능숙(mastery)해지세요. 이러한 난관들을 AI 개발 분야를 혁신하고 선도할 수 있는 기회로 받아들여보세요.

Keep iterating and refining, and let your suite of evaluations guide you to mastery in LLM development. Embrace these challenges as opportunities to innovate and lead in the field of AI development.


:warning:홍보 링크:warning:: 저자의 새로운 글을 구독하거나 후원해주세요!

원문

2개의 좋아요