반응형

이전 포스팅을 통해서 OpenAI API를 사용하는 방법에 대해서 배웠으며, 랭체인이 무엇인지를 알아보았고, 그리고 랭체인을 설치하는 방법에 대해서 알아보았습니다.

이번 시간에는 랭체인을 이용해서 간단한 어플리케이션을 만들고 모니터링하고 서빙을(배포를) 해 보겠습니다. 다시 말하면, (이전의 내용들을 잘 따라오셨다면) 랭체인을 이용해서 간단한 언어 모델 어플리케이션을 만들 수 있다는 의미 입니다. 아주 멋지고 유용한 어플리케이션을 만들기 위해 먼저 간단한 어플리케이션을 만들어보는 과정이라고 하겠습니다. 

주요 내용은 다음을 참고했고 하나씩 번역하면서 추가로 필요한 설명을 작성하였습니다.          https://python.langchain.com/docs/get_started/quickstart         (2024년 1월 부터 Quickstart 페이지의 내용이 업그레이드 되었습니다. 따라서 아래의 내용과 일부 다릅니다.)

 

이번 포스팅(Quickstart)에서는 다음과 같은 것들을 보실 수 있습니다.

  • LangChain, LangSmith, LangServe 설정방법
  • 랭체인에서 가장 기본적이고 공통적인 요소의 사용법: prompt templates, models, 그리고 output parser 같은 것들
  • LCEL(LangChain Expression Language)의 사용법: LCEL은 LangChain이 구축된 프로토콜로, 구성 요소들을 체이닝(묶는 것)을 용이하게 합니다.
  • 랭체인을 이용한 간단한 어플리케이션 개발 방법
  • 랭스미스를 이용한 어플리케이션 추적 방법
  • 랭서브를 이용한 어플리케이션 서빙(배포) 방법

살짝 많아보이긴 하지만 매우 기본적이고 중요한 내용입니다. 가보실까요!~~~

전체 내용은 이렇습니다. 먼저 환경 및 필요한 내용을 Setup 하고, LangChain을 만들어보고, LangSmith로 추적해보고, LangServe로 서빙해 보겠습니다.

 

 

Setup

 

Installation

이 내용은 랭체인 설치 방법으로 바로 지난 포스팅에서 다룬 내용입니다. 아래의 명령어를 실행합니다.

pip install langchain

conda 환경에서는 아래를 실행합니다.

conda install langchain -c conda-forge

 

Environment

랭체인을 사용한다면 보통 하나 이상의 모델 제공자나 데이터 저장소, 또는 APIs와의 통합이 필요합니다. 이번 예제에서는 OpenAI의 모델 API를 이용하려 합니다. 따라서 OpenAI 패키지 사용을 위해서 다음과 같은 OpenAI 패키지 설치 명령어를 실행 시켜 줍니다.

pip install openai

그리고 API에 접근하기 위해서는 OpenAI API Key가 필요합니다. OpenAI의 API Key를 받기 위해서는 OpenAI 계정이 필요하구요. 없으신 분은 다음의 링크를 따라가서 만드실 수 있습니다.(https://platform.openai.com/account/api-keys)

OpenAI API Key에 대해서 낮설으신 분은 이전 포스팅 내용인 다음의 링크를 통해 먼저 이해하고 진행하시면 좋겠네요.(https://bigdatamaster.tistory.com/203)

키를 발급 받으신 다음에는 아래와 같은 명령어를 이용해서 환경번수에 Key 값을 설정해 주세요.

export OPENAI_API_KEY="..."

이처럼 환경변수에 설정하고 싶지 않다면, 아래와 같이 프로그램에서 openai_api_key의 파라메터에 key 값을 전달할 수도 있습니다.

from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(openai_api_key="...")

 

LangSmith

여러분이 만드시는 많은 어플리케이션은 LLM(LargeLanguageModel) 호출을 여러번 실행하는 멀티 스텝을 갖게 될 것입니다. 이러한 어플리케이션이 점점더 복잡해 짐에 따라서 여러분의 체인과 에이전트가 정확하게 무엇을 하고 있는지 조사하는 것 또한 점점 더 중요해 집니다. 이를 위해 가장 좋은 방법이 바로 LangSmith를 이용하는 것 입니다.

LangSmith가 반드시 필요한 것은 아닙니다. 그러나 도움이 됩니다. 바로 위의 링크를 통해 LangSmith에 접속해서 LangSmith Key를 받고, 아래와 같이 설정해서 사용할 수 있습니다. 참고로 LangSmith는 베타버전의 서비스 입니다. 따라서 품질에 대한 보증은 어렵습니다. 그래도 방금 페이지에 접속해보니 사용을 위해서는 대기해야할 정도로 인기가 있네요.

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."

참고로 LangSmith는 베타버전의 서비스 입니다. 따라서 품질에 대한 보증은 어렵습니다. 그래도 방금 페이지에 접속해보니 사용을 위해서는 대기해야할 정도로 인기가 있네요.

 

LangServe

LangServe는 LangChain의 chain들을 REST API로 배포하는 것을 도와 줍니다. LangChain을 사용하기 위해서 LangServe를 사용할 필요는 없습니다. 그렇치만 이번 내용에서는 간단하게 LangServe를 이용해서 앱을 어떻게 배포하는지 보여드리겠습니다. 설치는 아래 명령어를 실행하세요.

pip install "langserve[all]"

 

 

Building with LangChain

LangChain은 언어 모델 어플리케이션을 만들기 위해 사용될 수 있는 많은 모듈들을 제공합니다. 이러한 모듈들은 간단한 어플리케이션을 위해서 홀로 사용될 수도 있고. 복잡한 use case에서 사용을 위해 여러 모듈과 함께 구성되어 사용될 수 있습니다. 이런 구성은 LangChain Expression Language(LCEL)에 의해 제공되는데 이것은 많은 모듈에서 일관되게 구현되어 있는 Runnable 인터페이스를 통해 정의 됩니다. 이를 통해서 component들을 끈김 없이 연결 하는 것이 가능합니다.

가장 단순하고 공통적인 체인은 다음의 3가지를 포함합니다.

  • LLM/Chat Mode: 언어 모델은 추론 엔진의 핵심입니다. 랭체인과 함께 사용하기위해서 여러분은 언어모델의 다른 종류들에 대해 이해하고 어떻게 사용하는지를 이해하는 것이 필요합니다.
  • Prompt Template: 이것은 언어 모델에 지시를 제공합니다. 이것은 언어 모델 아웃풋을 제어 합니다. 따라서, 프롬프트를 어떻게 생성하고 프롬프트 전략의 차이점을 이해하는 것은 매우 중요합니다.
  • Output Parser: 이것은 언어모델로부터의 답변내용을 좀더 작업할 수 있는 포맷으로 변환합니다. 이것은 이후 처리에서 아웃풋을 쉽게 사용할 수 있도록 합니다. 

이번 내용에서는 이 3가지에 대해서 각각 어떻게 사용하는지 설명하고, 그리고 나서 통합적으로 어떻게 연결하여 사용하는지를 설명할 예정입니다. 이러한 컨셉을 이해하는 것은 여러분이 나중에 LangChain 어플리케이션을 커스터마이즈하거나 사용하는데에 도움이 됩니다. 대부분의 LangChain 애플리케이션에서는 모델 그리고/또는 프롬프트를 구성할 수 있는 기능이 제공되므로, 이를 어떻게 활용하는지 아는 것은 큰 도움이 될 것입니다.

 

LLM/Chat Model

언어 모델에는 다음과 같이 2종류가 있습니다.

  • LLM: 기본 모델은 문자열을 입력으로 받고 문자열을 반환합니다.
  • ChatModel: 기본 모델은 메시지의 리스트를 입력으로 받고 하나의 메시지를 반환합니다.

문자열은 단순합니다. 그러나 메시지는 무엇일까요? 기본 메시지 인터페이스는 BaseMessage에 정의 되어 있는데 다음의 2개 특성이 필요합니다.

  • content: 메시지의 내용으로 일반적으로 문자열 입니다.
  • role: BaseMessage가 만들어 내는 엔티티 입니다.

LangChain은 서로 다른 role들을 쉽게 구분하기 위해서 다음과 같이 몇 개의 오브젝트를 제공합니다.

  • HumanMessage: 사람/사용자로 부터 오는 BaseMessage
  • AIMessage: AI/assistant로 부터 오는 BaseMessage
  • SystemMessage: 시스템으로부터오는 BaseMessage
  • FunctionMessage / Tool Message: 함수나 도구의 호출의 결과를 포함하는 BaseMessage

만약이러한 role들이 맞지 않는 다면, ChatMessage 클래스를 이용해서 역할을 수작업으로 만들 수 있습니다.

LangChain은 LLM과 ChatModel 모두에게 공유되는 공통 인터페이스를 제공합니다. 그럼에도 불구하고 주어진 언어 모델에 맞는 효과적인 프롬프트를 만들기 위해서 이러한 차이점을 이해하는 것은 매우 도움이 됩니다.

LLM 또는 ChatModel을 호출하는 가장 간단한 방법은 .invoke()를 사용하는 것 입니다. 이것은 모든 LCEL 오브젝트를 위한 통일된 동기 호출 방법입니다.

  • LLM.invoke: 문자열을 입력받고, 문자열을 반환합니다.
  • ChatModel.invoke: BaseMessage의 리스트를 입력받고, BaseMessage를 반환 합니다.

이러한 메소드의 입력 유형은 사실 이보다 더 일반적입니다. 그러나 여기서는 간단히 LLM은 문자열만을, Chat 모델은 메시지 리스트를 입력으로 받는 것으로 가정할 수 있습니다. 모델 호출에 대한 자세한 내용은 여기를 확인하세요.

이제 이러한 다른 유형의 모델과 다양한 입력 유형을 다루는 방법을 살펴보겠습니다. 먼저 LLM과 ChatModel을 가져와보겠습니다.

from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

llm = OpenAI()
chat_model = ChatOpenAI()

LLM과 ChatModel 객체는 효과적으로 구성된 객체입니다. 여러분은 temperature나 다른 파라메터들을 함께 전달함으로서 초기화 할 수 있습니다. 

from langchain.schema import HumanMessage

text = "What would be a good company name for a company that makes colorful socks?"
messages = [HumanMessage(content=text)]

llm.invoke(text)
# >> Feetful of Fun

chat_model.invoke(messages)
# >> AIMessage(content="Socks O'Color")

 

Prompt templates

대부분의 LLM 애플리케이션에서는 사용자 입력을 직접 LLM으로 전달하지 않습니다. 일반적으로 사용자 입력을 프롬프트 템플릿이라고 불리는 더 큰 텍스트 조각에 추가하게 되며, 이는 특정 작업에 대한 추가적인 맥락을 제공합니다.

이전 예에서 모델에 전달한 텍스트에는 회사 이름을 생성하기 위한 지침이 포함되어 있었습니다. (text변수에 할당한 What would be....를 말합니다.) 그러니 우리의 애플리케이션이 제품을 제시하면 적절한 회사명을 답변하는 어플리케이션이라고 한다면, 사용자가 모델에 다른 지침을 주지 않고 제품에 대한 설명만 제공하면 될 것입니다.

이를 구현할 때 PromptTemplates이 도움이 됩니다! 이들은 사용자 입력을 서식이 있는 프롬프트로 전환하는 모든 로직을 묶어냅니다. 이는 매우 간단하게 시작할 수 있는데요 예를 들어, 위에서 말한 것처럼 제품을 입력 받아서 전체 문자열을 생성하는 프롬프트는 단순히 다음과 같을 수 있습니다.

from langchain.prompts import PromptTemplate

prompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?")
prompt.format(product="colorful socks")
What is a good name for a company that makes colorful socks?

어떠신가요?! 지침 전체를 바꿀 필요가 없기 때문에 변경이 필요한 부분만 선택적으로 변경해서 문자열을 만들어 낼 수 있습니다.

템플릿을 사용하는 이점은 여러 가지입니다. 변수를 "부분적"으로 처리할 수 있습니다. 즉, 한 번에 일부 변수만 서식을 지정할 수도 있습니다. 이러한 것 들을 쉽게 결합하여 다양한 템플릿을 하나의 프롬프트로 조합할 수도 있습니다. 이러한 기능에 대한 자세한 설명은 프롬프트 섹션을 참조하세요.

PromptTemplates은 또한 메시지 리스트(목록)을 생성하는 데 사용할 수 있습니다. 이 경우 프롬프트에는 컨텐츠 정보뿐만 아니라 각 메시지에 대한 정보(역할, 목록에서의 위치 등)가 포함됩니다. 이러한 가장 일반적인 경우에는 ChatPromptTemplate가 있고, 이것은 ChatMessageTemplate의 목록을 말합니다. 각 ChatMessageTemplate은 해당 ChatMessage를 어떤 서식으로 지정할지에 대한 지침과 함께 역할(role) 및 컨텐츠(content)를 포함합니다. 아래에서 이를 자세히 살펴보겠습니다.

from langchain.prompts.chat import ChatPromptTemplate

template = "You are a helpful assistant that translates {input_language} to {output_language}."
human_template = "{text}"

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])

chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")
[
    SystemMessage(content="You are a helpful assistant that translates English to French.", additional_kwargs={}),
    HumanMessage(content="I love programming.")
]

ChatPrompttemplates는 또한 다른 방법으로 생성될 수 있습니다. 프롬프트 섹션을 참고하세요.

 

Output parsers

OutputParsers는 언어 모델의 원시 출력을 이후의 처리에서 사용할 수 있는 형식으로 변환합니다. OutputParsers의 주요 유형 몇 가지가 있으며, 이에는 다음이 포함됩니다:

  • LLM의 텍스트를 구조화된 정보로 변환 (예: JSON)
  • ChatMessage를 하나의 단순 문자열로 변환
  • 메시지 이외에 호출에서 반환된 추가 정보 (예: OpenAI 함수 호출)를 문자열로 변환

자세한 내용은 output parsers 섹션을 참조하세요.

이 시작 가이드(포스팅)에서는 우리만의 출력 파서를 작성할 것입니다. 즉, 쉼표로 구분된 목록을 그냥 목록으로 변환하는 출력 파서입니다.

from langchain.schema import BaseOutputParser

class 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(", ")

CommaSeparatedListOutputParser().parse("hi, bye")
# >> ['hi', 'bye']

지금까지는 LLM/Chat Model, Prompt templates, Output parsers 별로 알아 보았으며 이번에는 통합해서 구성하는 방법을 알아 보겠습니다.

 

Composing with LCEL

이제 이들을 하나의 체인으로 결합할 수 있습니다. 이 체인은 입력 변수를 가져와서 프롬프트 템플릿에 전달하여 프롬프트를 생성하고, 이 프롬프트를 언어 모델에 전달한 다음 출력을 (선택적으로) Output parsers에 전달합니다. 이는 모듈화된 논리를 간편하게 묶어내는 방법입니다. 이것이 실제로 동작하는 것을 확인해보시죠.

from typing import List

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import BaseOutputParser

class CommaSeparatedListOutputParser(BaseOutputParser[List[str]]):
    """Parse the output of an LLM call to a comma-separated list."""


    def parse(self, text: str) -> List[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."""
human_template = "{text}"

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])
chain = chat_prompt | ChatOpenAI() | CommaSeparatedListOutputParser()
chain.invoke({"text": "colors"})
# >> ['red', 'blue', 'green', 'yellow', 'orange']

이러한 구성 요소를 결합하기 위해 | 구문(기호, 문법)을 사용하고 있습니다. 이 | 구문은 LangChain Expression Language (LCEL)에서 파생되며, 이 모든 객체가 구현하는 범용 Runnable 인터페이스에 의존합니다. LCEL에 대해 더 알아보려면 여기서 문서를 읽어보세요.

 

 

Tracing with LangSmith

만약 우리가 처음에 보여준 대로 환경 변수를 설정했다면, 우리가 지금까지 한 모든 모델 및 체인 호출은 자동으로 LangSmith에 로그될 것입니다. (즉, LangSmith에 계정도 만들고 Key를 등록했다면 말이지요.) 그런 다음 LangSmith를 사용하여 애플리케이션 추적을 디버그하고 주석을 달고, 이를 향후 애플리케이션 반복 평가를 위한 데이터 세트로 변환할 수 있습니다.

위 체인에 대한 추적이 어떻게 보일지는 다음을 통해 확인하세요: https://smith.langchain.com/public/09370280-4330-4eb4-a7e8-c91817f6aa13/r

LangSmith에 대한 자세한 내용은 여기를 참조하세요.

 

 

Serving with LangServe

이제 애플리케이션을 구축했으므로 서비스를 해야 합니다. 이때 LangServe가 등장합니다. LangServe는 개발자가 LCEL 체인을 REST API로 배포하는 데 도움을 주는 도구입니다. 이 라이브러리는 FastAPI와 특히 데이터 유효성 검사를 위해 pydantic과 통합되어 있습니다.

 

Server

우리의 애플리케이션을 위한 서버를 만들기 위해 serve.py 파일을 만들 것입니다. 이 파일에는 세 가지가 들어갑니다.

  1. 체인의 정의 (위와 동일)
  2. FastAPI 앱
  3. 체인을 서비스하는 데 사용할 경로의 정의, 이는 langserve.add_routes를 사용하여 설정됩니다.
#!/usr/bin/env python
from typing import List

from fastapi import FastAPI
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import BaseOutputParser
from langserve import add_routes

# 1. Chain definition

class CommaSeparatedListOutputParser(BaseOutputParser[List[str]]):
    """Parse the output of an LLM call to a comma-separated list."""


    def parse(self, text: str) -> List[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."""
human_template = "{text}"

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])
category_chain = chat_prompt | ChatOpenAI() | CommaSeparatedListOutputParser()

# 2. App definition
app = FastAPI(
  title="LangChain Server",
  version="1.0",
  description="A simple API server using LangChain's Runnable interfaces",
)

# 3. Adding chain route
add_routes(
    app,
    category_chain,
    path="/category_chain",
)

if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="localhost", port=8000)

위 내용을 serve.py로 저장합니다.

이게 끝입니다. 우리가 이 파일을 다음과 같이 실행 시키면 됩니다.

python serve.py

이렇게 하고나면 우리는 localhost:8000에서 서빙되는 우리의 체인을 볼 수 있습니다.

 

Playground

모든 LangServe 서비스에는 응용 프로그램을 구성하고 호출하는 간단한 내장 UI가 포함되어 있습니다. 이 UI를 통해 스트리밍 출력 및 중간 단계의 가시성을 제공받을 수 있습니다. http://localhost:8000/category_chain/playground/로 이동하여 사용해 보세요!

 

Client

이제 서비스와 프로그래밍 방식으로 상호 작용할 클라이언트를 설정해 봅시다. langserve.RemoteRunnable을 사용하면 클라이언트 측에서 실행 중인 것처럼 서비스된 체인과 상호 작용할 수 있습니다.

from langserve import RemoteRunnable

remote_chain = RemoteRunnable("http://localhost:8000/category_chain/")
remote_chain.invoke({"text": "colors"})
# >> ['red', 'blue', 'green', 'yellow', 'orange']

위의 코드를 실행하면 로컬호스트의 8000번 포트를 통해 category_chain을 실행하게되고 그 결과로 제일 하단의 내용을 반환하게 됩니다.

LangServe에 대한 다른 많은 기능에 대한 것을 배우려면 여기를 참고하세요.

 

 

Next steps

LangChain을 사용하여 애플리케이션을 만들고 LangSmith로 추적하며 LangServe로 서비스하는 방법에 대해 간략하게 살펴보았습니다. 여기에서 다룰 수 있는 것보다 이 세 가지 모두에는 훨씬 더 많은 기능이 있습니다. 계속해서 학습하려면:

 

 

이상은 2023년 버전의 Quickstart 내용이었습니다. 이후 최신 버전의 내용은 아래 링크를 참고하세요.

https://bigdatamaster.tistory.com/211

 

LangChain Quickstart(2024년 1월 기준)

이 포스팅은 2024년 1월 기준으로 새롭게 변경된 LangChain Quickstart에 대한 내용입니다. 이전 버전의 Quickstart 내용보다 상위 수준에서 설명하면서도 동시에 구체적인 예제 코드를 제시하고 있습니다

bigdatamaster.tistory.com

 

동영상 설명은 아래 링크를 참고하세요.

https://youtu.be/qM2hzIMFhuo

 

반응형
반응형

목차  LangChain - Get started

  1. Introduction
  2. Installation (이번 포스팅 내용)
  3. Quickstart
  4. Security

 

지난 시간에는 LangChain이 무엇인지에 대해서 알아보았습니다.

랭체인은 프레임웍이라고 했으며, 이 프레임웍을 이용하면 어플리케이션이 더 잘 알아듣고 추리/추론을 더 잘 할 수 있도록 개발 할 수 있다고 했습니다. 또한 전반적으로 언어모델을 활용한 어플리케이션을 쉽게 만들 수 있도록 도와 줍니다.

https://bigdatamaster.tistory.com/208

 

랭체인(LangChain) 이란? : 개요

지난 두번의 포스팅에[서 OpenAI API에 대한 개요와 활용하기 위한 기본적인 방법에 대해서 알아보았습니다. 이번에는 보다 복잡하고 쓸만한 어플리케이션을 만들기 위해서 필요한 랭체인(LangChain)

bigdatamaster.tistory.com

 

이번 포스팅의 내용은 이러한 랭체인을 사용할 수 있도록 패키지를 설치하는 방법에 대한 설명입니다.

 

공식 배포 버전 설치 방법

아주 간단합니다. 파이썬이 설치되어 있다면 간단히 아래 명령어로 랭체인을 설치할 수 있습니다.

pip install langchain

콘다를 설치해서 사용중이라면 아래의 명령을 사용하시면 됩니다.

conda install langchain -c conda-forge

이러한 명령은 랭체인을 사용하기 위해 아주 기본적이고 최소한의 내용만 설치 합니다. 랭체인의 가장 큰 가치는 다양한 모델 또는 데이터 저장소 등과 같이 통합될 때 나타납니다. 기본적으로 이런 통합을 의한 의존성이 있는 패키지들은 설치되지 않습니다. 따라서 이러한 통합 사용을 원한다면 별도로 필요한 의존성 패키지들의 설치가 필요니다.

소스를 이용한 설치

소스를 이용해서 설치가 필요하다면 소스 레포지토리를 클로닝 해서 할 수 있습니다. 이때는 PATH/TO/REPI/langchain/libs/langchain 와 같이 경로를 명확하게 해주고 아래의 명령어를 실행하면 됩니다.

pip install -e .

 LangChain community

langchain-community 패키지는 제3자 통합하는 것을 가지고 있습니다. langchain을 설치하면 자동으로 함께 설치되지만, 아래의 명령어를 통해 개별적으로도 설치할 수 있습니다.

pip install langchain-community

LangChain core

langchain-core 패키지는 LangChain 생태계의 나머지 부분에서 사용하는 기본 추상화와 LangChain 표현 언어(LCEL)가 포함되어 있습니다. 이는 langchain에 의해 자동으로 설치되지만 독립적으로 사용될 수도 있습니다. 다음 명령어로 설치할 수 있습니다:

pip install langchain-core

LangChain experimental

langchain-experimental 패키지는 실험적인 LangChain 코드와 연구와 실험 사용을 위한 코드들을 가지고 있습니다. 이를 설치하기 위해서는 다음과 같은 명령어를 사용합니다.

pip install langchain-experimental

LangServe

LangServe는 개발자들이 LangChain runnables과 chain 들을 REST API로 배포하는 것을 도와 줍니다. LangServe는 LangChain CLI에 의해서 자동으로 설치됩니다. 만약 LangChain CLI를 사용하지 않는 다면 다음을 이용해서 설치하세요.

pip install "langserve[all]"

서버와 클라이언트 모두 설치시 위와 같이하면 되고

클라이언트 코드만 필요시 pip install "langserve[client'" 를

그리고 서버 코드만 필요시 pip install "langserve[server]" 를 이용합니다.

LangChain CLI

LangChain CLI는 LangChain templates나 다른 LangServe 프로젝트의 사용이 필요할 때 유용합니다.

pip install langchain-cli

LangSmith SDK

LangSmith는 LangChain 설치시 자동으로 설치됩니다. LangChain을 사용하지 않는다면 다음을 이용해서 설치할 수 있습니다.

pip install langsmith

 

이로써 LangChain 에 필요한 다양한 패키지들의 설치 방법에 대해서 알아보았습니다.

모든 설치가 끝난뒤에 pip list 명령어를 통해 정상적으로 설치되었는지를 확인 할 수 있습니다.

기본적으로는 pip install langchain 만 해도 기본적인 사용이 가능하며 module import error가 나면 필요한 패키지를 설치해줘도 됩니다.

 

다음 시간에는 예제를 통해 이들의 간단한 활용 방법에 대해서 알아보도록 하겠습니다.

 

 

아래 링크는 langchain 설치와 관련된 내용을 구글 colab에서 하나씩 실행하는 주피터 노트북 파일 입니다. 참고해서 직접 하나씩 실행시켜보세요.

https://colab.research.google.com/drive/1NTVYI564LLX46ugb9egDH0imLEtMmHfo?usp=sharing

 

아래는 내용을 좀더 자세히 설명하는 동영상 입니다.

https://youtu.be/hfbt30g4w5k

 

 

 

 

반응형
반응형

목차  LangChain - Get started

  1. Introduction (이번 포스팅 내용)
  2. Installation
  3. Quickstart
  4. Security

 

지난 두번의 포스팅에서 OpenAI API에 대한 개요와 활용하기 위한 기본적인 방법에 대해서 알아보았습니다. 이번에는 보다 복잡하고 쓸만한 어플리케이션을 만들기 위해서 필요한 랭체인(LangChain)이라는 라이브러리에 대해서 알아보겠습니다. 

일반적으로 OpenAI API를 그대로 쓰는 것 보다는 더 복잡하고 특정 업무를 처리하기 위한, 그런 어플리케이션을 만들어 사용합니다. 그도 그럴 것이 안그러면 그냥 ChatGPT의 웹을 이용하면 되겠지요. 그러나 특정 업무를 처리하기 위한, 특별한 어플리케이션을 만들려면 많은 추가적인 노력이 필요합니다. 이러한 노력을 줄여주는 라이브러리가 바로 랭체인 입니다. 이전 마지박 포스팅에서 언급한 것처럼, 살짝 특별한 대답을 위하는 경우에 가장 간단한 방법은 프롬프트 엔지니어링(Prompt Engineering)이라고 불리우는 방법으로, 사용자 입력 내용에 더하여 미리 설정된 문구를 함께 제공하는 방법이 있습니다. 이 방법은 쉽지만 한계가 많이 있습니다. 따라서 다양한 방법으로 어플리케이션의 품질을 높이는 방법이 필요한데요, 이러한 개발에 도움을 주는 라이브러리가 바로 랭체인입니다. 그래서 오늘은 먼저 랭체인의 개요에 대해서 알아보고자 합니다.

 

먼저, 주요 내용은 아래와 같은 페이지를 참조했음을 알립니다.

https://python.langchain.com/docs/get_started/introduction

 

랭체인(LangChain) 이란

LangChain 은 프레임웍입니다.  언어모델을 이용해서 어플리케이션을 개발할 때 어플리케이션이 맥락을 이해하고 추리 할 수 있도록 랭체인이 도와줍니다. 즉, 랭체인을 이용하면 언어모델을 이용한 어플리케이션이 맥락을 더 잘 이해하고, 추리를 더 잘 하게 만들 수 있습니다. 더 똑똑하게 만들 수 있습니다.

LangChain 프레임웍은 다음과 같이 4가지 파트로 구성됩니다.

  • LangChain Libraries: 파이썬과 자바스크립트 라이브러리 입니다. 이것은 많은 콤포넌트들 간의 연결과 통합을 제공합니다. 예를들면, 컴포넌트들을 체인, 에이전트와 연결하여 기본 실행 환경을 제공하고 바로 쓸수 있는 체인과 에이전트를 제공합니다.
  • LangChain Templates: 다양한 종류의 작업을 위한 쉽게 배포할 수 있는 참조 아키텍처의 집합입니다.
  • LangServe: LangChain을 REST API로 배포하기 위한 라이브러리 입니다.
  • LangSmith: LLM 프레임웍하에서 개발되고 랭체인으로 유연하게 연결된 채인들을 디버그하고, 테스트, 평가 그리고 모니터링 할 수 있도록 기능을 제공하는 개발자 플랫폼입니다.

이러한 제품들을 이용하면 어플리케이션 라이프사이클을 단순하게 만듭니다. 개발, 제품화, 배포 등에서 활용됩니다.

  • Develop: 라이브러리를 이용하여 어플리케이션을 작성하고 참조 템플릿을 이용해서 개발을 시작할 수 있습니다. 즉, 밑바닥부터 시작하는 것이 아니라 라이브러리 import, 호출 만으로 쉽게 어플리케이션을 개발 할 수 있습니다.
  • Productionize: 랭스미스를 사용해서 여러분이 만든 체인을 조사, 테스트, 모니터링 할 수 있습니다. 그래서 여러분은 자신감을 가지고 지속해서 어플리케이션을 개선/배포 할 수 있습니다. 정확히 어떻게 돌아가는지 확인하고, 검증, 모니터링해서 어플리케이션의 품질을 확인할 수 있습니다.
  • Deploy: 랭서브를 이용해서 어떤 체인이든지 API로 바꿀 수 있습니다. 라이브러리를 이용하여 필요한 어플리케이션을 만들면 쉽게 API화 할 수 있습니다. 즉, 쉽게 Backend를 만들 수 있습니다.

보시는 것처럼 랭체인의 파트 들이 개발 라이프 사이클에 각각 녹아 들어가서 사용됩니다.

 

LangChain Libraries

랭체인 패키지들의 가치있는 주요 도구들은 바로 콤포넌트들과 미리 개발된 체인들입니다.

  1. Components: 구성 가능한 툴과 언어모델과의 동작을 통합합니다. 여러분이 랭체인 프레임웍의 일부를 사용하던 안하던 간에, 콤포넌트들은 모듈화되어있고 사용하기 쉽습니다.
  2. Off-the-shelf chains: 상위 수준의 작업을 완수하기 위한 콤포넌트들의 (미리 만들어진) 빌트인 체인 집합을 말합니다.

빌트인 체인들은 랭체인을 사용한 어플리케이션의 개발 시작을 쉽게 해줍니다. 콤포넌트들은 이런 빌트인 체인들을 이용해서 기존 체인을 쉽게 수정하고 새로운 체인을 만들수 있습니다. 

랭체인 라이브러리 자체는 아래 3 개의 다른 패키지들로 구성됩니다.

  • langchain-core: 기본 추상화 모듈과 랭체인 표현언어(LCEL: LangChain Expression Language) 패키지입니다.
  • langchain-community: 제3자들의 개발을 통합하는 패키지입니다. 패키지에는 Models I/O, Retrieval, AgentTooling 모듈이 있습니다.
  • langchain: 체인, 에이전트, 그리고 어플리케이션의 인지 아키텍처를 보완하는 회수 전략(retrieval strategies)들의 패키지입니다.

 

Get started: 시작하기

여기에서는 어떻게 랭체인을 설치하고 여러분의 환경에 맞게 설정하고 만드는 것을 시작하는지 알려줍니다. 관련해서 별도 포스팅 예정입니다.

여러분이 첫번째 랭체인 어플리케이션을 만듬으로써 랭체인에 좀더 익숙해지도록 Quickstart 가이드를 따라해 보시기 바랍니다.

여러분이 보안 모범 사례 를 읽어 봄으로써 랭체인을 개발할 때 더욱 안전하게 만들어 보세요.

 

 

LangChain Expression Language (LCEL)

LCEL은 체인을 구성하기위해 선언적인 방법을 사용합니다. LCEL은 하루만에 프롬프트와 LLM의 간단한 체인부터 가장 복잡한 체인까지 코드 변경 없이 프로덕션에 프로토타입을 배포할 수 있도록 설계되었습니다. 이내용도 별도 포스팅 예정입니다. 여기서는 랭체인의 체인을 만들 떼 쉬운 방법이 (LCEL) 있구나 정도만 이해하시면 될 것 같습니다.

  • Overview: LCEL과 그 장점들
  • Interface: 객체들을 위한 표준 인터페이스
  • How-to: LCEL의 주요 기능
  • Cookbook: 공통 작업을 완료하기 위한 예시 코드

 

Modules

랭체인은 표준, 확장가능한 인터페이스와 통합을 위해 다음의 모듈들을 제공합니다.

     Model I/O :  언어 모델과의 인터페이스 제공

     Retrieval :  어플리케이션 특화 데이터와의 인터페이스 제공

     Agents :  모델들이 주어진 상위 수준의 지시문을 이용하여 어떤 툴을 선택 할지를 제공하는 모듈

이러한 모듈들을 개발에 이용하여 어플리케이션을 만들게 됩니다. 따라서 어떻게 보면 개발자에게는 제일 중요한 파트라고 할 수 있습니다.

 

Examples, ecosystem, and resources

Use cases: 사용사례

Integrations: 통합 integrations.

 

Guides: 랭체인을 활용한 개발 모범 사례

 

API reference   파이썬 패키지에서 사용하기 위한 랭체인 클래스와 메소드들에 대한 문서 제공

 

Developer's guide

 

Community

 

아래는 내용을 좀더 자세히 설명하는 동영상 입니다.

https://youtu.be/HtmpB9CAdHY

 

 

 

 

반응형
반응형
langchain 설치 (pip install langchain) 중에 아래와 같은 에러 발생
 
Error Message:
 
In file included from src/greenlet/greenlet.cpp:9:      /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/usr/include/c++/v1/cstdlib:135:9: error: no member named 'at_quick_exit' in the global namespace      using ::at_quick_exit _LIBCPP_USING_IF_EXISTS;            ~~^      /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/usr/include/c++/v1/cstdlib:136:9: error: no member named 'quick_exit' in the global namespace      using ::quick_exit _LIBCPP_USING_IF_EXISTS;            ~~^      2 errors generated.      error: command '/usr/bin/clang' failed with exit code 1      [end of output]    note: This error originates from a subprocess, and is likely not a problem with pip.  ERROR: Failed building wheel for greenletFailed to build greenletERROR: Could not build wheels for greenlet, which is required to install pyproject.toml-based projects(venv) $ 
 
에러 메시지의 이미지

 

에러 내용을 자세히 보면 /usr/bin/clang 과 관련해서 문제가 있다고 나와서 인터넷 검색해보니 아래와 같은 페이지가 나왔음.

How to fix Error: command ‘/usr/bin/clang’ failed with exit code 1?

 
여기서 권장하는 대로 여러가지를 upgrade하고 나니 잘 됬음.
 
1,2,3 brew install openssl re2
 
이렇게 업그레이드 하고 다시 install langchain을 하니 grpcio error가 발생했음.
그래서 잘 돌아가는 가상환경에서 grpcio의 버전을 확인해서 설치를 했으나
 
실패
 
다시 그냥 langchain을 설치하려하니 이번에는 아래 같은 에러 발생
 
  note: This error originates from a subprocess, and is likely not a problem with pip.  ERROR: Failed building wheel for greenletFailed to build greenletERROR: Could not build wheels for greenlet, which is required to install pyproject.toml-based projects
 
내용을 뜯어 보니 greenlet이 문제 인 것 같아서..
다시 잘 돌아가는 가상 환경에서 greenlet이 있는지 찾아보고 같은 버전으로 설치
 
이런 젠장, 그래도 안되서 인터넷을 찾아보니 아래 명령을 실행하라고...
 
pip install --only-binary :all: greenlet
 
이렇게 하는 이유를 아래와 같이 설명하고 있는데..
 
Python packages are often distributed as "wheels" (.whl files), which are pre-compiled binary packages. Try installing "greenlet" and "Flask-SQLAlchemy" using wheels instead of source distribution`
 
이말을 풀어보면, 소스 배포형태에서 wheels 를 사용해서 설치하지말고 pre-compiled된 바이너리 패키지를 이용해서 설치하니까 잘 되더라 라는 의미임.
 
음.... 그러니까 소스를 가져다가 컴파일해서 쓰러면 컴피일과 관련 라이브러리, 경로 환경 등 여러가지가 맞아야 설치가 되는 데....바이너리 패키지를 설치하면 이런 복잡한 것 필요없이 쉽게 설치가 되더라 라는 의미로 이해됨.
 
이러고 나서 langchain을 설치하니까 잘 설치됨.
 
즉, 아래 명령 실행 후 langchain을 설치 했음.
pip install --only-binary :all: greenlet
 
 
 
 
 
반응형

+ Recent posts