Weave: 생성형 AI 적용을 위한 간단한 도구
이 글은 AI로 번역되었습니다. 오역이 있을 수 있으니 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
Comment
6년 전만 해도 딥러닝의 잠재력을 실현하는 데 필요한 도구는 존재하지 않았습니다. 우리는 그 도구를 만들기 위해 Weights & Biases를 시작했습니다. 우리의 도구는 GPT-4와 같은 획기적인 모델을 개발하는 데 필요한 방대한 실험 데이터를 추적하고 협업할 수 있게 만들었습니다.
오늘날 GPT-4는 인류를 위한 애플리케이션에서 놀라운 잠재력을 지니고 있지만, 그 잠재력은 우리가 실제로 적용할 수 있는 역량을 훨씬 뛰어넘습니다. 이를 해결하려면 소프트웨어를 만드는 방식 자체를 다르게 생각해야 합니다. 새로운 도구가 필요합니다.
AI 애플리케이션을 개발하고 프로덕션에 적용하기 위한 도구 모음인 Weave의 공개 출시를 발표하게 되어 매우 자랑스럽습니다.
Weave로 다음을 수행하세요:
- 로그 그리고 버전 개발부터 프로덕션까지의 LLM 상호작용과 주변 데이터
- 실험 프롬프트 기법, 모델 변경, 매개변수와 함께
- 평가 모델의 성능을 추적하고 진행 상황을 측정하세요

데모는 쉽고 프로덕션은 어렵다
생성형 AI 모델은 매우 강력하지만, 본질적으로 비결정적이고 블랙박스입니다. 이제 우리는 놀라운 AI 데모를 만드는 것은 쉽지만, 프로덕션 애플리케이션을 제대로 작동시키려면 상당한 엔지니어링 노력이 필요하다는 것을 알고 있습니다.
이 어려움은 AI 모델의 확률적 특성에서 비롯됩니다. 어떤 애플리케이션이든 입력 공간이 지나치게 커서 완전한 테스트가 불가능합니다.
하지만 해결책이 있습니다: 모델을 블랙박스로 취급하고, 처음에 이 모델들을 만들 때 머신러닝 실무자들이 사용하는 것과 같은 과학적 워크플로를 따르세요.
작동 방식은 다음과 같습니다:
- 모든 것을 기록하세요LLM과 주고받는 모든 상호작용을 개발 단계부터 프로덕션까지 빠짐없이 캡처하세요. 이 데이터는 생성 비용이 크니 반드시 보존해야 합니다. 나중에 모델을 개선하고 평가 세트를 구축하는 데 활용하게 됩니다.
- 실험여러 가지 구성과 매개변수를 폭넓게 시도해 무엇이 효과적인지 찾아보세요.
- 평가진행 상황을 측정할 수 있도록 평가 모음집을 구축하세요. 이걸 하지 않으면 아무런 가늠도 없이 일하는 셈입니다!
Weave는 최소한의 추상화를 도입해 이 과정을 워크플로의 자연스러운 일부로 만듭니다.
Weave 트래킹
AI 모델의 성능을 제대로 활용하려면, 먼저 당신이 하는 모든 작업을 중앙 시스템 오브 레코드에 기록하는 것이 첫 번째 단계입니다.
이 데이터를 활용해 어떤 실험적 변경이 효과를 내는지 파악하고, 평가용 데이터세트를 구축하며, RAG와 파인튜닝 같은 고급 기법으로 모델을 개선하게 됩니다.
무엇을 트래킹해야 할까요?
- 코드: 생성형 AI API 호출을 둘러싼 모든 코드를 버전 관리하고 저장하세요
- 데이터: 가능하다면 모든 데이터세트, 지식 저장소 등을 버전 관리하고 저장하세요
- 트레이스: 생성형 AI 호출을 둘러싼 함수의 트레이스를 영구적으로 캡처하세요
Weave로 아주 간단하게 할 수 있습니다. 어떤 Python 함수든 감싸서 @weave.op(), 그리고 Weave가 함수의 코드를 캡처하고 버전 관리하며, 모든 호출의 입력과 출력까지 포함해 트레이스를 기록합니다.
import openai@weave.op()def extract_first_person_name(doc: str) -> str:client = openai.OpenAI()prompt_template = 'What is first person's name in the following document: {doc}'response = client.chat.completions.create(model='gpt-3.5-turbo',messages=[{'role': 'user', prompt_template.format(doc=doc))})return response.choices[0].message.content
호출 @weave.init("my-project") Weave 추적을 활성화한 뒤, 평소처럼 함수를 호출하세요.

함수의 코드를 변경한 뒤 다시 호출하면, Weave가 해당 함수의 새 버전을 추적합니다.
이렇게 하면 어떤 코드가 정확히 어떤 출력을 만들어냈는지 정확히 확인할 수 있습니다. LLM으로 실험하다 보면 정리를 유지하기가 어렵습니다. Weave는 최소한의 추상화로 사용자의 조직적 부담을 완전히 없애줍니다.

실험을 더 쉽게 하려면 함수에 매개변수를 도입하는 것이 유용합니다. Weave에서 이렇게 할 수 있습니다:
class PersonExtractor(weave.Object):prompt_template: str@weave.op()def extract(doc: str) -> str:client = openai.OpenAI()response = client.chat.completions.create(model='gpt-3.5-turbo',messages=[{'role': 'user', self.prompt_template.format(doc=doc))})return response.choices[0].message.content
Weave 객체는 내부적으로 pydantic 라이브러리를 사용합니다. 다음과 같이 인스턴스화하고 호출할 수 있습니다:
person_extractor = PersonExtractor('What is first person's name in the following document: {doc}')name = person_extract.extract("There were three of them: Kara, Frank, and Shaun")
Weave 객체도 자동으로 정리되고 버전 관리됩니다. 이제 함수 본문에서 프롬프트 템플릿을 분리해냈으므로, 이를 조회할 수 있습니다. 프롬프트 템플릿에 특정 단어를 사용한 호출만 손쉽게 필터링할 수 있습니다.

개발과 프로덕션 모두에서 Weave 추적을 사용해 AI 개발 과정에서 생성되는 모든 가치 있는 데이터를 손쉽게 수집하고 체계적으로 정리하세요.
Weave 평가
평가는 AI 애플리케이션을 위한 유닛 테스트와 비슷합니다. 다만 AI 모델은 비결정적이므로, 엄격한 합격/불합격 단언 대신 점수화 함수(스코어링 함수)를 사용합니다.
소프트웨어에 유닛 테스트 모음을 작성하듯, 개발하는 모든 AI 애플리케이션에도 평가 모음을 지속적으로 발전시켜야 합니다.
간단한 예시는 다음과 같습니다:
import asyncioimport weaveimport openai@weave.op()def score_match(expected, prediction):return expected == predictioneval = weave.Evaluation(dataset=[{"doc": "The first person to land on the moon was Neil Armstrong.","expected": "Neil Armstrong",},{"doc": "There were three of them: Kara, Frank, and Shaun","expected": "Kara",},{"doc": "There are two cats: Jimbob, and Zelda.", "expected": None},],scorers=[score_match],)@weave.op()def extract_first_person_name(doc):client = openai.OpenAI()prompt_template = "What is the name of the first person in the following document? Just give the name and nothing else. Document: {doc}"response = client.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": prompt_template.format(doc=doc)}],)return response.choices[0].message.contentweave.init("weave-announcement-draft-eval-1")asyncio.run(eval.evaluate(extract_first_person_name))
결과는 다음과 같습니다:

우리 모델이 고양이 이름까지 추출하고 있는 것 같네요! 간단한 프롬프트 엔지니어링으로 해결할 수 있을 거예요.
평가를 통해 추세를 파악하고 회귀를 식별하며, 향후 반복 개선에 대한 근거 있는 결정을 내릴 수 있습니다.
나아가 만들어보세요
훌륭한 도구를 만드는 가장 좋은 방법은 사용자와 대화하는 것입니다. 모든 형태의 피드백을 환영합니다. 언제든지 연락해 주세요: @weights_biases X에서 또는 이메일로: support@wandb.com
💜 Weights & Biases의 Shawn과 팀
Add a comment