반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

https://python.langchain.com/docs/expression_language/cookbook/

 

Cookbook | 🦜️🔗 Langchain

Example code for accomplishing common tasks with the LangChain Expression Language (LCEL). These examples show how to compose different Runnable (the core LCEL interface) components to achieve various tasks. If you're just getting acquainted with LCEL, the

python.langchain.com

 

Example code for accomplishing common tasks with the LangChain Expression Language (LCEL). These examples show how to compose different Runnable (the core LCEL interface) components to achieve various tasks. If you're just getting acquainted with LCEL, the Prompt + LLM page is a good place to start.

 

LCEL(LangChain Expression Language)을 사용하여 일반적인 작업을 수행하기 위한 예제 코드입니다. 이 예제에서는 다양한 작업을 수행하기 위해 다양한 Runnable(핵심 LCEL 인터페이스) 구성 요소를 구성하는 방법을 보여줍니다. LCEL에 대해 이제 막 익숙해졌다면 Prompt + LLM 페이지부터 시작하는 것이 좋습니다.

 

https://python.langchain.com/docs/expression_language/cookbook/prompt_llm_parser

 

Prompt + LLM | 🦜️🔗 Langchain

The most common and valuable composition is taking:

python.langchain.com

 

Prompt + LLM

 

The simplest composition is just combing a prompt and model to create a chain that takes user input, adds it to a prompt, passes it to a model, and returns the raw model output.

 

가장 간단한 구성은 프롬프트와 모델을 결합하여 사용자 입력을 받아 프롬프트에 추가하고 모델에 전달하고 원시 모델 출력을 반환하는 체인을 만드는 것입니다.

 

Note, you can mix and match PromptTemplate/ChatPromptTemplates and LLMs/ChatModels as you like here.

 

여기에서는 PromptTemplate/ChatPromptTemplate과 LLM/ChatModel을 원하는 대로 혼합하고 일치시킬 수 있습니다.

 

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

prompt = ChatPromptTemplate.from_template("tell me a joke about {foo}")
model = ChatOpenAI()
chain = prompt | model

이 코드는 LangChain의 프롬프트 및 ChatOpenAI 모델을 사용하여 무언가에 대한 농담을 생성하는 방법을 보여줍니다. 코드를 한국어로 설명하면 다음과 같습니다:

  1. ChatPromptTemplate 설정:
    • ChatPromptTemplate.from_template("tell me a joke about {foo}")를 사용하여 질문에 대한 템플릿을 설정합니다. 이 템플릿은 "{foo}" 부분에 대상 주제(또는 대상 단어)를 대신하여 사용자로부터 농담을 요청하는 용도로 사용됩니다.
  2. ChatOpenAI 모델 설정:
    • ChatOpenAI()를 사용하여 ChatOpenAI 모델을 설정합니다. 이 모델은 주어진 텍스트 입력에 대해 자연스러운 대화를 생성하는 역할을 합니다.
  3. 대화 체인 설정:
    • prompt | model을 사용하여 prompt에서 생성한 템플릿과 ChatOpenAI 모델을 연결하여 대화 체인을 설정합니다. 이렇게 구성된 체인은 주어진 주제(대상)를 사용하여 농담을 생성할 수 있습니다.
  4. 대화 체인 호출:
    • chain.invoke({"foo": "elephants"})와 같이 chain을 호출하면, "{foo}" 부분에 "elephants"와 같은 대상이 삽입되어서 "elephants"에 관한 농담을 생성하게 됩니다.
chain.invoke({"foo": "bears"})

이 코드는 사용자로부터 주제를 받아 해당 주제에 대한 농담을 생성하는 간단한 대화 체인을 설정하고 호출하는 방법을 보여줍니다.

 

    AIMessage(content="Why don't bears wear shoes?\n\nBecause they have bear feet!", additional_kwargs={}, example=False)

 

Often times we want to attach kwargs that'll be passed to each model call. Here are a few examples of that:

 

종종 우리는 각 모델 호출에 전달될 kwargs를 첨부하려고 합니다. 다음은 이에 대한 몇 가지 예입니다.

 

Attaching Stop Sequences

chain = prompt | model.bind(stop=["\n"])
chain.invoke({"foo": "bears"})
    AIMessage(content='Why did the bear never wear shoes?', additional_kwargs={}, example=False)

이 코드는 주어진 대화 체인에 대한 변경 사항을 설명하고, "chain.invoke" 메소드를 통해 어떻게 호출하는지 설명하는 것입니다. 코드를 한국어로 설명하면 다음과 같습니다:

  1. 대화 체인 설정:
    • 이전 코드와 마찬가지로 chain이라는 대화 체인을 설정합니다. 이 대화 체인은 특정 주제에 관한 농담을 생성하기 위해 prompt와 model을 연결한 것과 동일합니다.
  2. model.bind 설정:
    • model.bind(stop=["\n"])를 사용하여 model에 대한 추가적인 설정을 지정합니다. 여기서 "stop" 파라미터는 모델이 대화 생성을 중지할 때 사용할 중지 토큰을 정의합니다. "\n"은 줄 바꿈 문자로, 모델은 이 문자를 만나면 대화 생성을 중지합니다.
  3. 대화 체인 호출:
    • chain.invoke({"foo": "bears"})를 통해 chain을 호출하면, "{foo}" 부분에 "bears"가 대입되어 해당 주제("bears"에 관한 농담)에 대한 대화를 생성합니다. 중지 토큰 설정이 적용되어 모델이 줄 바꿈 문자를 만나면 대화 생성을 중지합니다.

이 코드는 대화 체인에 대한 중지 토큰 설정을 추가하여 모델이 특정 지점에서 대화 생성을 중지하도록 하는 방법을 보여줍니다.

 

 

Attaching Function Call information

functions = [
    {
      "name": "joke",
      "description": "A joke",
      "parameters": {
        "type": "object",
        "properties": {
          "setup": {
            "type": "string",
            "description": "The setup for the joke"
          },
          "punchline": {
            "type": "string",
            "description": "The punchline for the joke"
          }
        },
        "required": ["setup", "punchline"]
      }
    }
  ]
chain = prompt | model.bind(function_call= {"name": "joke"}, functions= functions)
chain.invoke({"foo": "bears"}, config={})
    AIMessage(content='', additional_kwargs={'function_call': {'name': 'joke', 'arguments': '{\n  "setup": "Why don\'t bears wear shoes?",\n  "punchline": "Because they have bear feet!"\n}'}}, example=False)

이 코드는 대화 체인과 함수 호출을 사용하여 농담을 생성하는 방법을 설명합니다. 

  1. 함수 정의:
    • functions 리스트에 농담을 생성하는 함수를 정의합니다. 이 함수는 "setup"과 "punchline" 두 가지 매개변수를 받아서 농담을 생성합니다. "setup"은 농담의 시작 부분을, "punchline"은 농담의 결말 부분을 나타냅니다.
  2. 대화 체인 설정:
    • prompt와 model을 연결하여 대화 체인을 설정합니다. 이전과 마찬가지로 prompt는 대상 주제를 사용하여 농담을 생성하는 템플릿을 나타내고, model은 대화 생성에 사용됩니다.
    • model.bind(function_call={"name": "joke"}, functions=functions)를 사용하여 model에 대한 추가 설정을 지정합니다. 여기서 "function_call"은 호출할 함수의 이름을 "joke"로 지정하고, "functions"은 이 함수가 사용할 정의한 함수 리스트입니다.
  3. 대화 체인 호출:
    • chain.invoke({"foo": "bears"}, config={})를 통해 chain을 호출하면, "{foo}" 부분에 "bears"가 대입되어 해당 주제("bears"에 관한 농담)에 대한 대화를 생성합니다. 또한, "config" 파라미터는 추가적인 설정을 나타냅니다.

이 코드는 함수 호출과 대화 체인을 결합하여 주어진 주제에 대한 농담을 생성하는 방법을 보여줍니다. 설정된 함수가 사용자가 제공한 주제를 기반으로 농담을 생성합니다.

 

PromptTemplate + LLM + OutputParser

We can also add in an output parser to easily transform the raw LLM/ChatModel output into a more workable format

 

또한 출력 파서를 추가하여 원시 LLM/ChatModel 출력을 보다 실행 가능한 형식으로 쉽게 변환할 수 있습니다.

 

from langchain.schema.output_parser import StrOutputParser

chain = prompt | model | StrOutputParser()

Notice that this now returns a string - a much more workable format for downstream tasks

 

이제 이는 다운스트림 작업에 훨씬 더 실행 가능한 형식인 문자열을 반환합니다.

 

chain.invoke({"foo": "bears"})
    "Why don't bears wear shoes?\n\nBecause they have bear feet!"

이 코드는 대화 체인에 대한 설명을 제공하고, "chain.invoke" 메소드를 사용하여 어떻게 호출하는지 설명하는 것입니다. 

  1. 대화 체인 설정:
    • 이전 코드와 마찬가지로 chain이라는 대화 체인을 설정합니다. 이 대화 체인은 특정 주제("foo"에 대한 값)에 관한 농담을 생성하기 위해 prompt와 model을 연결한 것과 동일합니다.
  2. 대화 체인 호출:
    • chain.invoke({"foo": "bears"})를 통해 chain을 호출하면, "{foo}" 부분에 "bears"가 대입되어 해당 주제("bears"에 관한 농담)에 대한 대화를 생성합니다.
  3. 출력 파싱:
    • StrOutputParser()를 사용하여 대화 체인의 출력을 문자열로 파싱하고 반환합니다.

이 코드는 대화 체인을 호출하여 특정 주제에 대한 농담을 생성하고, 생성된 결과를 문자열로 파싱하여 반환하는 예를 보여줍니다.

 

Functions Output Parser

When you specify the function to return, you may just want to parse that directly

 

반환할 함수를 지정할 때 해당 함수를 직접 구문 분석하고 싶을 수도 있습니다.

 

from langchain.output_parsers.openai_functions import JsonOutputFunctionsParser

chain = (
    prompt 
    | model.bind(function_call= {"name": "joke"}, functions= functions) 
    | JsonOutputFunctionsParser()
)
chain.invoke({"foo": "bears"})
    {'setup': "Why don't bears like fast food?",
     'punchline': "Because they can't catch it!"}

이 코드는 대화 체인의 출력을 JSON 형식으로 파싱하는 방법을 설명합니다. 

  1. 대화 체인 설정:
    • chain을 설정하고, prompt와 model을 연결하여 대화 체인을 생성합니다.
    • model.bind(function_call={"name": "joke"}, functions=functions)를 사용하여 model에 대한 추가 설정을 지정합니다. 여기서 "function_call"은 호출할 함수의 이름을 "joke"로 지정하고, "functions"는 이 함수가 사용할 함수 리스트입니다.
  2. 출력 파싱 설정:
    • JsonOutputFunctionsParser()를 사용하여 대화 체인의 출력을 JSON 형식으로 파싱하도록 설정합니다.
  3. 대화 체인 호출:
    • chain.invoke({"foo": "bears"})를 통해 chain을 호출하면, "{foo}" 부분에 "bears"가 대입되어 해당 주제("bears"에 관한 농담)에 대한 대화를 생성합니다.
  4. JSON 출력 파싱:
    • JsonOutputFunctionsParser()가 설정되어 있으므로, 대화 체인의 출력은 JSON 형식으로 파싱되며, 파싱된 JSON 객체를 반환합니다.

이 코드는 대화 체인의 출력을 JSON 형식으로 파싱하여 반환하는 방법을 보여줍니다. 이것은 출력 결과를 구조화된 데이터로 처리하거나 다른 목적에 활용할 때 유용합니다.

 

from langchain.output_parsers.openai_functions import JsonKeyOutputFunctionsParser

chain = (
    prompt 
    | model.bind(function_call= {"name": "joke"}, functions= functions) 
    | JsonKeyOutputFunctionsParser(key_name="setup")
)
chain.invoke({"foo": "bears"})
    "Why don't bears wear shoes?"

 

이 코드는 대화 체인의 출력에서 특정 JSON 키를 추출하는 방법을 설명합니다. 

  1. 대화 체인 설정:
    • chain을 설정하고, prompt와 model을 연결하여 대화 체인을 생성합니다.
    • model.bind(function_call={"name": "joke"}, functions=functions)를 사용하여 model에 대한 추가 설정을 지정합니다. 여기서 "function_call"은 호출할 함수의 이름을 "joke"로 지정하고, "functions"는 이 함수가 사용할 함수 리스트입니다.
  2. 출력 파싱 설정:
    • JsonKeyOutputFunctionsParser(key_name="setup")를 사용하여 대화 체인의 출력에서 "setup"이라는 특정 키의 값을 추출하도록 설정합니다.
  3. 대화 체인 호출:
    • chain.invoke({"foo": "bears"})를 통해 chain을 호출하면, "{foo}" 부분에 "bears"가 대입되어 해당 주제("bears"에 관한 농담)에 대한 대화를 생성합니다.
  4. JSON 출력 파싱:
    • JsonKeyOutputFunctionsParser(key_name="setup")가 설정되어 있으므로, 대화 체인의 출력에서 "setup"이라는 특정 키의 값을 추출하고, 이 값을 반환합니다.

이 코드는 대화 체인의 출력에서 특정 JSON 키를 추출하여 반환하는 방법을 보여줍니다. 이것은 대화 결과에서 원하는 정보를 추출하거나 가공할 때 유용합니다.

 

 

Simplifying input

To make invocation even simpler, we can add a RunnableMap to take care of creating the prompt input dict for us:

 

호출을 더욱 간단하게 만들기 위해 RunnableMap을 추가하여 프롬프트 입력 사전 생성을 처리할 수 있습니다.

 

from langchain.schema.runnable import RunnableMap, RunnablePassthrough

map_ = RunnableMap(foo=RunnablePassthrough())
chain = (
    map_ 
    | prompt
    | model.bind(function_call= {"name": "joke"}, functions= functions) 
    | JsonKeyOutputFunctionsParser(key_name="setup")
)
chain.invoke("bears")
    "Why don't bears wear shoes?"

 

이 코드는 대화 체인의 출력에서 특정 JSON 키를 추출하는 방법을 보여주며, 중간 단계에서 매핑을 사용하는 예제를 제공합니다. 

  1. 매핑 설정:
    • RunnableMap(foo=RunnablePassthrough())를 사용하여 map_을 설정합니다. 이 매핑은 "foo"라는 키를 가진 데이터를 "RunnablePassthrough()"로 전달합니다.
  2. 대화 체인 설정:
    • chain을 설정하고, map_를 첫 번째 단계로 연결합니다.
    • 그 다음으로 prompt와 model을 연결하여 대화 체인을 생성합니다.
    • model.bind(function_call={"name": "joke"}, functions=functions)를 사용하여 model에 대한 추가 설정을 지정합니다. 여기서 "function_call"은 호출할 함수의 이름을 "joke"로 지정하고, "functions"는 이 함수가 사용할 함수 리스트입니다.
    • JsonKeyOutputFunctionsParser(key_name="setup")를 사용하여 대화 체인의 출력에서 "setup"이라는 특정 키의 값을 추출하도록 설정합니다.
  3. 대화 체인 호출:
    • chain.invoke("bears")를 통해 chain을 호출하면, "bears"가 "foo" 키로 전달됩니다. 이 데이터가 대화 체인으로 전달되어 해당 주제("bears"에 관한 농담)에 대한 대화를 생성합니다.
  4. JSON 출력 파싱:
    • JsonKeyOutputFunctionsParser(key_name="setup")가 설정되어 있으므로, 대화 체인의 출력에서 "setup"이라는 특정 키의 값을 추출하고, 이 값을 반환합니다.

이 코드는 데이터를 중간 단계에서 매핑하고, 그 후 대화 체인의 결과에서 특정 키를 추출하는 방법을 보여줍니다. 이것은 데이터 전달 및 처리를 효율적으로 관리할 때 유용합니다.

 

Since we're composing our map with another Runnable, we can even use some syntactic sugar and just use a dict:

 

다른 Runnable을 사용하여 맵을 구성하고 있으므로 syntactic sugar 을 사용하고 dict 만 사용할 수도 있습니다.

 

chain = (
    {"foo": RunnablePassthrough()} 
    | prompt
    | model.bind(function_call= {"name": "joke"}, functions= functions) 
    | JsonKeyOutputFunctionsParser(key_name="setup")
)
chain.invoke("bears")
    "Why don't bears like fast food?"

이 코드는 대화 체인을 설정하고 호출하는 방법을 보여주며, 중간 단계에서 데이터를 매핑합니다. 

  1. 대화 체인 설정:
    • {"foo": RunnablePassthrough()}를 사용하여 데이터를 "foo" 키에 대한 "RunnablePassthrough()"로 설정합니다. 이 매핑은 "foo" 키를 가진 데이터를 "RunnablePassthrough()"로 전달합니다.
  2. 대화 체인 구성:
    • chain을 설정하고, 매핑된 데이터를 첫 번째 단계로 연결합니다. "foo" 키에 "bears" 데이터가 전달됩니다.
    • 그 다음으로 prompt와 model을 연결하여 대화 체인을 생성합니다.
    • model.bind(function_call={"name": "joke"}, functions=functions)를 사용하여 model에 대한 추가 설정을 지정합니다. 여기서 "function_call"은 호출할 함수의 이름을 "joke"로 지정하고, "functions"는 이 함수가 사용할 함수 리스트입니다.
    • JsonKeyOutputFunctionsParser(key_name="setup")를 사용하여 대화 체인의 출력에서 "setup"이라는 특정 키의 값을 추출하도록 설정합니다.
  3. 대화 체인 호출:
    • chain.invoke("bears")를 통해 chain을 호출하면, "bears"가 "foo" 키로 전달됩니다. 이 데이터가 대화 체인으로 전달되어 해당 주제("bears"에 관한 농담)에 대한 대화를 생성합니다.
  4. JSON 출력 파싱:
    • JsonKeyOutputFunctionsParser(key_name="setup")가 설정되어 있으므로, 대화 체인의 출력에서 "setup"이라는 특정 키의 값을 추출하고, 이 값을 반환합니다.

이 코드는 데이터를 중간 단계에서 매핑하고, 그 후 대화 체인의 결과에서 특정 키를 추출하는 방법을 보여줍니다. 이것은 데이터 전달 및 처리를 효율적으로 관리할 때 유용합니다.

 

 

 

 

반응형