?? ???? ?? ???? ????(LangSmith)? ?? ???? ??? ? ??. ???? ???? ?? ???? ?? LLM ??????? ?? ??? ? ?? ? ???? ?? ??? ????. 娇色导航 랭스미스는 프로덕션급 LLM 애플리케이션을 구축하기 위한 플랫폼이다. 모든 LLM 프레임워크에 구축된 체인 및 지능형 에이전트를 디버그, 테스트, 평가 및 모니터링할 수 있으며, LLM으로 구축하기 위한 고투 오픈소스 프레임워크인 랭체인과 원활하게 통합할 수 있다. 이 글을 쓰는 현재, 서로 다른 프로그래밍 언어로 구현된 3가지 랭체인이 있다. 각각 , , 그리고 (Go)의 구현물이다. 이 예제에서는 파이썬 구현물을 사용한다. 랭체인과 함께 하는 랭스미스기본적인 것은 다음과 같다. 을 설정하고, API 키를 생성하고, pip으로 랭체인 설치를 업데이트하고, 셸 환경 변수를 설정한 후 파이썬 빠른 시작 애플리케이션을 실행해 보았다. from langchain.chat_models import ChatOpenAIllm = ChatOpenAI()llm.predict(“Hello, world!”) 결과를 살펴보기 전에 랭스미스 허브에 대해 살펴보자. 그림 1. 랭스미스 허브는 프롬프트, 모델, 유스 케이스, 다른 LLM 아티팩트에 대한 저장소로서 기능한다. 다음 탭으로 이동하면 기본 프로젝트의 추적 목록이 나타난다. 그림 2. 파이썬 프로젝트 추적 리스트가 퀵스타트를 구동하기 위한 6번의 시도에 대한 로그를 보여주고 있다. 첫 5개는 성공적이지 않았다: 오픈AI로부터의 시간 초과가 나타나고 있다. 시간 초과를 감안해 오픈AI 계정으로 이동하여 챗GPT 요금제를 챗GPT 플러스(월 $20)로 업그레이드했다. 그렇게 해서 GPT-4와 챗GPT 플러그인에 액세스할 수 있었지만 여전히 프로그램이 실행되지 않았다. 전원을 켜 둔 채로 두었다. 추가 기능이 필요할 것 같았기 때문이다. 다음으로, 오픈AI API 요금제가 챗GPT 요금제와 별개라는 것을 기억하고 이 요금제도 업그레이드하여 계정에 10달러를 추가하고 필요에 따라 자동으로 충전되도록 설정했다. 이제야 파이썬 프로그램이 실행되었고 랭스미스에서 성공적인 결과를 확인할 수 있었다. 그림 3. 성공적 예측이 실행된다. 화면 오른쪽 상단의 플레이그라운드 버튼이 눈에 띈다. 이 실행의 메타데이터 탭을 보면 샘플링 온도 0.7에서 gpt-3.5 터보 모델에 대해 ‘Hello, World!’ 프롬프트를 실행했다는 것을 알 수 있다. 여기서 스케일은 0에서 1까지다. 1은 가장 무작위적이고 0은 모델에 온도를 자동 조정하도록 요청하는 스케일이다. 그림 4. 성공 예측에 대한 메타데이터. 하단의 YAML 블록에 더해 같은 정보를 가진 JSON 블록이 있다. 랭스미스 개요랭스미스는 랭체인 또는 다른 LLM 프로그램에서 LLM, 체인, 에이전트, 도구, 리트리버에 대한 모든 호출을 기록한다. 예상치 못한 최종 결과를 디버깅하고, 에이전트가 반복되는 이유를 파악하고, 체인이 예상보다 느린 이유를 파악하고, 에이전트가 사용한 토큰 수를 파악하는 데 도움이 될 수 있다. 랭스미스는 모든 LLM 호출에 대한 정확한 입력과 출력을 간단하게 시각화해 제공한다. 입력 변수(프롬프트) 외에도 템플릿과 보조 기능(예: 웹에서 정보 검색, 업로드 된 파일, LLM의 컨텍스트를 설정하는 시스템 프롬프트)을 사용하는 경우가 많기 때문에 입력 측면이 단순할 것이라고 생각할 수 있겠지만 그렇지 않다. 일반적으로 랭체인을 사용하는 모든 작업에는 랭스미스를 켜 두는 것이 좋으며, 중요한 경우에만 로그를 확인하면 된다. 입력 프롬프트가 필요한 결과를 제공하지 않는 경우 시도해 볼 수 있는 유용한 방법 중 하나는 아래 그림 5와 같이 프롬프트를 플레이그라운드로 가져가는 것이다. (그림 4에 표시된) 랭스미스 추적 페이지의 오른쪽 상단에 있는 버튼을 사용하여 플레이그라운드로 이동한다. 그림 5. 랭스미스 플레이그라운드는 사용자의 입력, 모델 변경, 온도를 편집할 수 있게 한다. 또 다른 변수를 조정하거나 함수 호출 추가, 스톰 시퀀스 추가, 인간 및 AI, 시스템, 함수, 챗 메시지를 추가할 수 있게 한다. 파이썬 프로그램 내에서의 편집 작업보다 시간이 단축될 수 있다. 비밀 및 API 키 버튼을 사용하여 웹사이트에 API 키를 추가하는 것을 잊지 말자. 플레이그라운드 실행은 별도의 랭스미스 프로젝트에 저장된다는 점에 유의하라. 랭스미스 LLM체인 예시랭체인 소개 기사에서 챗오픈AI 호출과 간단한 쉼표로 구분된 목록 파서를 결합한 LLM체인의 예를 들었던 바 있다. 이 파이썬 코드에 대한 랭스미스 로그를 보면 프로그램에서 어떤 일이 일어나고 있는지 이해하는 데 도움이 된다. 파서는 BaseOutputParser 클래스의 서브 클래스이다. 챗오픈AI 호출을 위한 시스템 메시지 템플릿은 상당히 표준적인 프롬프트 엔지니어링이다. from langchain.chat_models import ChatOpenAIfrom langchain.prompts.chat import ( ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate,)from langchain.chains import LLMChainfrom langchain.schema import BaseOutputParserclass CommaSeparatedListOutputParser(BaseOutputParser): “””Parse the output of an LLM call to a comma-separated list.””” def parse(self, text: str): “””Parse the output of an LLM call.””” return text.strip().split(“, “)template = “””You are a helpful assistant who generates comma separated lists.A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.ONLY return a comma separated list, and nothing more.”””system_message_prompt = SystemMessagePromptTemplate.from_template(template)human_template = “{text}”human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])chain = LLMChain( llm=ChatOpenAI(), prompt=chat_prompt, output_parser=CommaSeparatedListOutputParser())chain.run(“colors”) 그림 6. 톱-레벨 체인용 런(Run) 탭은 인간의 입력, 파싱된 출력, 레이턴시(1초 미만), 사용된 토큰을 보여준다. 클럭 타임과 호출 상태도 함께 보여준다. 챗오픈AI LLM 호출을 자세히 살펴보면 그림 7과 같이 추가 정보를 확인할 수 있다. 그림 7. LLM 레벨에서 시스템 인풋과 파싱 전 LLM이 생성한 아웃풋이 나타난다. 그림 8에 표시된 것처럼 메타데이터에서 더 많은 정보를 수집할 수 있다. 그림 8. 챗오픈AI 호출에 대한 메타데이터가 사용된 모델(gpt-3.5-터보)를 제시하고 있다. 또 샘플링 온도(0.7)과 런타임 버전 넘버도 보여준다. 랭스미스 평가 빠른 시작 에서는 예제 데이터 세트를 사용하여 체인을 평가한다. 먼저 예제 입력의 데이터 세트를 생성한 다음 평가할 LLM, 체인 또는 에이전트를 정의한다. 평가를 구성하고 실행한 후에는 랭스미스 내에서 트레이스와 피드백을 검토한다. 코드부터 시작하겠다. 데이터 세트 생성 단계는 동일한 이름의 기존 데이터 세트를 감지하는 기능이 없기 때문에 한 번만 실행할 수 있다. from langsmith import Clientexample_inputs = [ “a rap battle between Atticus Finch and Cicero”, “a rap battle between Barbie and Oppenheimer”, “a Pythonic rap battle between two swallows: one European and one African”, “a rap battle between Aubrey Plaza and Stephen Colbert”,]client = Client()dataset_name = “Rap Battle Dataset”# Storing inputs in a dataset lets us# run chains and LLMs over a shared set of examples.dataset = client.create_dataset( dataset_name=dataset_name, description=”Rap battle prompts.”,)for input_prompt in example_inputs: # Each example must be unique and have inputs defined. # Outputs are optional client.create_example( inputs={“question”: input_prompt}, outputs=None, dataset_id=dataset.id, )from langchain.chat_models import ChatOpenAIfrom langchain.chains import LLMChain# Since chains and agents can be stateful (they can have memory),# create a constructor to pass in to the run_on_dataset method.def create_chain(): llm = ChatOpenAI(temperature=0) return LLMChain.from_string(llm, “Spit some bars about {input}.”)from langchain.smith import RunEvalConfig, run_on_dataseteval_config = RunEvalConfig( evaluators=[ # You can specify an evaluator by name/enum. # In this case, the default criterion is “helpfulness” “criteria”, # Or you can configure the evaluator RunEvalConfig.Criteria(“harmfulness”), RunEvalConfig.Criteria( {“cliche”: “Are the lyrics cliche?” ” Respond Y if they are, N if they’re entirely unique.”} ) ])run_on_dataset( client=client, dataset_name=dataset_name, llm_or_chain_factory=create_chain, evaluation=eval_config, verbose=True, project_name=”llmchain-test-1″,) 이 예제에서는 지난 예제보다 살펴봐야 할 것이 훨씬 더 많다. 위의 코드는 데이터세트를 사용하고, 데이터세트의 4가지 프롬프트에 대해 모델을 실행하고, 생성된 각 랩 배틀 결과에 대해 복수의 평가를 실행한다. 다음은 실행 중에 터미널에 인쇄된 평가 통계이다. Eval quantiles: 0.25 0.5 0.75 mean modeharmfulness 0.00 0.0 0.0 0.00 0.0helpfulness 0.75 1.0 1.0 0.75 1.0cliche 1.00 1.0 1.0 1.00 1.0 아래 데이터세트에서 볼 수 있듯이 누군가 랩 배틀 프롬프트를 재미있게 만들었다. 그림 9. client.create_dataset()call이 생성한 키-밸류 데이터세트. 여담이지만, ‘파크 앤 레크리에이션’에서 데드팬 만화 캐릭터 를 연기한 도 찾아봐야 했다. 이 코드는 자체 프로젝트 이름인 llmchain-test-1을 사용하므로 여기서 결과를 찾아볼 수 있다. 그림 10. 각 쌍의 첫 줄은 LLM 체인 결과다. 둘째 줄은 LLM 결과다. 다음은 gpt-3.5-터보로 생성된 바비 대 오펜하이머 랩 배틀이다. 그림 11. LLM 체인이 생성한 바비/오펜하이머 랩 배틀 텍스트의 마지막이다. 어떤 상도 받지는 못했다. 랭스미스 입문서에서는 기본 사항을 다루고 있지만, 에서는 일반적인 패턴과 실제 사용 사례에 대해 자세히 설명한다. 코드를 실행하려면 리포지토리를 복제하거나 포크해야 한다. 이 입문서에서는 랭체인 없이 코드 추적하기(@traceable 데코레이터 사용), 랭체인 허브를 사용하여 검색, 공유 및 버전 관리 프롬프트 사용하기, 파이썬과 타이프스크립트 또는 자바스크립트에서 LLM 시스템 테스트 및 벤치마킹하기, 사용자 피드백을 사용하여 애플리케이션 개선, 모니터링 및 개인화하기, 미세 조정을 위한 데이터 내보내기, 탐색적 데이터 분석을 위한 실행 데이터 내보내기에 대해 다룬다. 결론랭스미스는 랭체인과 함께 또는 단독으로 작동하는 플랫폼이다. 이 기사에서는 프로덕션 등급 LLM 애플리케이션에서 랭스미스를 사용하여 체인 및 지능형 에이전트를 디버그, 테스트, 평가 및 모니터링하는 방법을 살펴봤다. * 인포월드 기고 편집자이자 리뷰어인 Martin Heller는 웹 및 윈도우 프로그래밍 컨설턴트 경력을 보유자다. 1986년부터 2010년까지는 데이터베이스, 소프트웨어, 웹사이트 개발자로 일했으며 그 이후에는 알파 소프트웨어의 기술 및 교육 부사장, 튜브파이의 의장이자 CEO를 역임했다. dl-ciokorea@foundryco.com ???? ???? ??? ??? IT ??? ???? ??? ????! ??? ??? ??? ?????. ????