1️⃣Basic Modules

LangChaing: Basic Module

1. Model I/O

  • LLMs

  • Chat Models

  • Text Embedding Models

2. Prompts

  • Prompt Templates

  • Example Selectors

  • Output Parsers: Completion for output as csv, json, xml etc.

3. Retrieval

  • vector store

  • knowledge graph

  • RAG

4. Chains

  • Generic Chains

  • Utility Chains

5. Agents

  • Action Agents

    1. Receives user input

    2. Decides which tool, if any, to sue and the tool input

    3. Calls the tool and records the output(observation)

    4. Decides the next step using the history of tools, tool inputs, and observation

    5. Repeats 3-4 until it determines it can respond directly to the user

6. Memory

  • Conversation Buffer Memory

  • Conversation Buffer Window Memory

  • Entity Memory

  • Conversation Knowledge Graph Memory

  • Conversation Summary Memory

  • Conversation Summary Buffer Memory

  • Conversation Token Buffer Memory

  • Vector Store-Backed Memory

# 패키지 설치
#%pip install langchain
#%pip install openai
import os
from dotenv import load_dotenv  

!echo "OPENAI_API_KEY=<Your_OpenAI_Key>" >> .env
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")

1. LLMs

대규모 언어 모델(LLM): LLM 모델은 텍스트 문자열을 입력으로 받아 텍스트 문자열을 출력으로 반환

  • 채팅 모델(Chat Models): 채팅 모델은 일반적으로 언어 모델에 의해 지원되지만 API가 더 구조화. 특히 채팅 모델은 채팅 메시지 목록을 입력으로 받아 채팅 메시지를 반환

  • 텍스트 임베딩 모델(Text Embedding Models): 텍스트 임베딩 모델은 텍스트를 입력으로 받아 실수(float) 목록을 반환

from langchain.llms import OpenAI

# LLM 준비
llm = OpenAI(
    model="gpt-3.5-turbo-instruct",
    temperature=0.9,
    openai_api_key=api_key,
)

# LLM 호출
print(llm("컴퓨터 게임을 만드는 새로운 한국어 회사명을 하나 제안해 주세요"))
.

"네오레디스크"

2.Prompts

  1. 프롬프트(Prompts)를 통해 모델을 프로그래밍하는 새로운 방식으로 "프롬프트(Prompts)"는 모델에 대한 입력을 의미

  2. 이 입력은 하드 코딩되는 경우는 거의 없지만 여러 컴포넌트로 구성

  3. 프롬프트 템플릿(PromptTemplate)은 이 입력의 구성으로 LangChain은 프롬프트를 쉽게 구성하고 작업할 수 있도록 여러 클래스와 함수를 제공

  • 프롬프트 값(PromptValue): 각 모델에 맞는 정확한 입력 타입(텍스트 또는 채팅 메시지)으로 변환할 수 있는 메서드를 제공하는 클래스

  • 프롬프트 템플릿(Prompt Templates): 프롬프트 값(PromptValue)을 생성하는 클래스입니다. 입력 변수를 받아 PromptValue 구성하고 반환하는 메서드를 제공

  • 예시 선택기((Example Selectors): 사용자 입력을 받은 다음 사용할 예시 목록을 반환하는 클래스로 프롬프트에 예시를 포함하는 것이 유용

  • 출력 파서(Output Parsers): 언어 모델 응답을 구조화하는 데 도움이 되는 클래스로 언어 모델(및 채팅 모델)은 텍스트를 출력함. 단순한 텍스트보다 더 구조화된 정보를 얻고 싶을 때가 많습니다. 이때 출력 파서(Output Parsers)가 필요 출력 파서는 (1) 모델에 출력 형식을 지정하고, (2) 원하는 형식으로 출력을 파싱하는 것을 담당(필요한 경우 재시도 포함).

    • get_format_instructions() -> str: 언어 모델의 출력 형식을 지정하는 방법에 대한 지침이 포함된 문자열을 반환하는 메서드

    • parse(str) -> Any: 문자열(언어 모델의 응답)을 받아 어떤 구조화된 데이터로 파싱하는 메서드

    • parse_with_prompt(str) -> Any: 문자열(언어 모델의 응답)과 프롬프트(해당 응답을 생성한 프롬프트)를 받아 어떤 구조화된 데이터로 파싱하는 메서드. 프롬프트는 주로 출력 파서가 어떤 식으로든 출력을 다시 시도하거나 수정하려고 할 때 제공되며, 이를 위해 프롬프트 정보가 요구

from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 프롬프트 템플릿 만들기
prompt = PromptTemplate(
    input_variables=["product"],
    template="{product}을 만드는 새로운 한국어 회사명을 하나 제안해 주세요",
)

# 프롬프트 생성
print(prompt.format(product="가정용 로봇"))
가정용 로봇을 만드는 새로운 한국어 회사명을 하나 제안해 주세요

3. Chains

체인은 목적을 달성하기 위해 특정한 방식으로 결합된 일련의 모듈형 컴포넌트(또는 다른 체인)로 돌아가는 매우 일반적인 개념 Chain: 여러 개별 컴포넌트를 포괄하는 종단 간 래퍼(end-to-end wrapper)

  • LLMChain: 가장 일반적인 유형의 체인입니다.

    • PromptTemplate, 모델(LLM 또는 ChatModel), 옵셔널 출력 파서로 구성됩니다.

    • 이 체인은 여러 입력 변수를 받아 PromptTemplate을 사용하여 프롬프트로 포맷을 지정합니다. 그런 다음 이를 모델에 전달합니다.

    • 마지막으로 출력 파서(제공된 경우)를 사용하여 LLM의 출력을 최종 포맷으로 파싱합니다.

  • 프롬프트 선택기(Prompt Selector): 전달된 모델에 따라 기본 프롬프트를 선택하는 역할을 담당합니다.

  • Index-related chains: 이 체인의 목적은 인덱스에 저장된 자신의 데이터를 LLM과 결합하는 것입니다. 가장 좋은 예시는 자신의 문서에서 질문에 대한 답변을 찾는 것입니다.

    • 스터핑(Stuffing): 스터핑은 모든 관련 데이터를 프롬프트에 콘텍스트로 채워 언어 모델에 전달합니다. 스터핑은 StuffDocumentsChain으로 구현됩니다.

      • 장점: LLM을 한 번만 호출합니다. 텍스트를 생성할 때 LLM은 모든 데이터에 한 번에 액세스 할 수 있습니다.

      • 단점: 대부분의 LLM에는 입력 가능한 최대 컨텍스트 길이가 정해져 있습니다. 따라서 큰 문서(또는 많은 문서)를 프롬프트에 포함시킬 경우, 컨텍스트 길이가 제한을 넘어버리므로 작동하지 않을 수 있습니다.

    • 맵 리듀스(Map Reduce): 맵 리듀스는 각 데이터 청크에 대해 초기 프롬프트를 실행하는 것입니다(요약 작업의 경우 해당 청크에 대한 요약일 수 있고, 질문 답변 작업의 경우 해당 청크에 기반한 답변일 수 있습니다). 그런 다음 다른 프롬프트가 실행되어 모든 초기 출력을 결합합니다. 맴 리듀스는 MapReduceDocumentsChain으로 구현됩니다.

      • 장점: StuffDocumentsChain 보다 더 큰 문서(및 더 많은 문서)로 확장할 수 있습니다. 개별 문서에 대한 LLM 호출은 독립적이므로 병렬화할 수 있습니다.

      • 단점: StuffDocumentsChain 보다 훨씬 더 많은 LLM 호출이 필요합니다. 마지막 결합 호출 중에는 일부 정보가 손실됩니다.

    • 리파인(Refine): 리파인은 첫 번째 데이터 청크에서 초기 프롬프트를 실행하여 일부 출력을 생성합니다. 나머지 문서의 경우에는, 해당 출력이 다음 문서와 함께 전달되어 새 문서를 기반으로 출력을 구체화하도록 LLM에 요청합니다.

      • 장점: 더 관련성 높은 컨텍스트를 가져올 수 있으며, MapReduceDocumentsChain 보다 손실이 적을 수 있습니다.

      • 단점: StuffDocumentsChain 보다 LLM에 대한 호출이 더 많이 필요합니다. 또한 호출은 독립적이지 않으므로 MapReduceDocumentsChain 처럼 병렬로 실행할 수 없습니다. 또한 문서 순서에 대한 잠재적인 종속성이 있습니다.

    • 맵-리랭크(Map-Rerank): 맵-리랭크은 각 데이터 청크에 대해 초기 프롬프트를 실행하여 작업을 완료하려고 시도할 뿐만 아니라, 답변이 얼마나 확실한지에 대한 점수를 부여합니다. 그런 다음 이 점수에 따라 응답의 순위가 매겨지고 가장 높은 점수를 반환합니다.

      • 장점: MapReduceDocumentsChain 장점과 비슷합니다. 하지만MapReduceDocumentsChain에 비해 호출이 더 적습니다.

      • 단점: 문서 간의 정보를 결합할 수 없습니다. 즉, 하나의 문서에 하나의 간단한 답변이 있을 것으로 예상할 때 가장 유용합니다.

from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

# 프롬프트 템플릿 만들기
prompt = PromptTemplate(
    input_variables=["product"],
    template="{product}을 만드는 새로운 한국어 회사명을 하나 제안해 주세요",
)

# 체인 생성
chain = LLMChain(
    llm=OpenAI(
        model="gpt-3.5-turbo-instruct",
        temperature=0.9
    ),
    prompt=prompt
)

# 체인 실행
chain.run("가정용 로봇")
'\n\n"가인로봇" (가정과 인간의 도움을 주는 로봇을 의미하는 조합어)'

4. Agents

일부 애플리케이션은 LLM/기타 도구에 대한 미리 정해진 체인을 호출하는 것뿐만 아니라, 사용자의 입력에 따라 달라지는 알려지지 않은 체인이 필요할 수 있습니다. 에이전트는 도구를 사용하여 이러한 유형의 체인에 액세스할 수 있습니다. 에이전트는 사용자 입력에 따라 이러한 도구 중 어떤 도구를 호출할지 결정할 수 있습니다.

  • 도구(Tools): 언어 모델이 다른 리소스와 상호 작용하는 방법입니다.

    • 언어 모델과 쉽게 상호 작용할 수 있도록 하는 특정 기능에 대한 추상화 함수입니다.

    • 구체적으로 도구의 인터페이스는 단일 텍스트 입력과 단일 텍스트 출력을 가지고 있습니다.

  • 툴킷(Toolkits): 특정 문제를 해결하거나 특정 작업을 수행할 때 필요한 도구 세트입니다.

  • 에이전트(Agents): 의사 결정을 내리는 데 사용되는 언어 모델입니다.

    • 에이전트는 모델을 감싸는 래퍼(wrapper)로, 사용자 입력을 받아 수행할 "액션(action)"과 그에 해당하는 "입력 액션(action input)"에 해당하는 응답을 반환합니다.

  • 에이전트 실행자(Agent Executor): 도구와 함께 에이전트를 실행하기 위한 로직입니다.

    • 에이전트 실행자는 에이전트와 도구 세트입니다.

    • 에이전트 실행기는 (1) 에이전트를 호출하고, (2) "액션"과 "액션 입력"을 다시 받아서, (3) 해당 입력으로 액션이 참조하는 도구를 호출하고, (4) 도구의 출력을 가져온 다음 모든 정보를 다시 에이전트로 전달하여 (5) 다음 액션을 가져오는 일을 담당합니다.

# 패키지 설치
#%pip install google-search-results
# 환경변수 준비
import os

os.environ["SERPAPI_API_KEY"] = "<SERP API Key>" #Serf API 가입 후 무료 key 발급
from langchain.agents import load_tools
from langchain.llms import OpenAI

# 도구 준비
tools = load_tools(
    tool_names=["serpapi", "llm-math"], 
    llm=OpenAI(
        model="gpt-3.5-turbo-instruct",
        temperature=0,
    )
)
from langchain.agents import initialize_agent

# 에이전트 생성
agent = initialize_agent(
    agent="zero-shot-react-description",
    llm=OpenAI(
        model="gpt-3.5-turbo-instruct",
        temperature=0
    ),
    tools=tools,
    verbose=True
)
# 에이전트 실행
agent.run("123*4를 계산기로 계산하세요")
> Entering new AgentExecutor chain...
 I should use a calculator to solve this math problem
Action: Calculator
Action Input: 123*4
Observation: Answer: 492
Thought: I now know the final answer
Final Answer: 492

> Finished chain.





'492'
# 에이전트 실행
agent.run("오늘 한국 서울의 날씨를 웹 검색으로 확인하세요")
> Entering new AgentExecutor chain...
 I should use a search engine to find the weather in Seoul, South Korea today
Action: Search
Action Input: "weather in Seoul, South Korea today"
Observation: {'type': 'weather_result', 'temperature': '53', 'unit': 'Fahrenheit', 'precipitation': '0%', 'humidity': '95%', 'wind': '9 mph', 'location': 'Seoul, South Korea', 'date': 'Monday', 'weather': 'Mostly cloudy'}
Thought: I now know the final answer
Final Answer: The weather in Seoul, South Korea today is mostly cloudy with a temperature of 53 degrees Fahrenheit, 0% chance of precipitation, 95% humidity, and 9 mph winds.

> Finished chain.





'The weather in Seoul, South Korea today is mostly cloudy with a temperature of 53 degrees Fahrenheit, 0% chance of precipitation, 95% humidity, and 9 mph winds.'

5. Memory

메모리는 대화 과정에서 데이터를 저장하고 검색하는 개념입니다. 두 가지 메서드를 제공합니다.

  1. 입력에 따라 관련 데이터를 가져옵니다.

  2. 입력 및 출력을 기반으로 그에 따라 상태를 업데이트합니다.

메모리에는 단기 메모리(Short term memory)와 장기 메모리(Long term memory)의 두 가지 타입이 있습니다.

  • 단기 메모리(Short term memory): 단일 대화의 맥락에서 데이터를 전달하는 방법을 말합니다(일반적으로 이전 채팅메시지(ChatMessage) 또는 그 요약).

  • 장기 메모리(Long term memory): 서로의 대화에서 정보를 가져오고 업데이트하는 방법을 다룹니다.

from langchain.chains import ConversationChain
from langchain.llms import OpenAI

# 대화 체인 생성
chain = ConversationChain(
    llm=OpenAI(
        model="gpt-3.5-turbo-instruct",
        temperature=0
    ),
    verbose=True
)
# 체인 실행
chain.run("우리집 반려견 이름은 보리입니다")
> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.

Current conversation:

Human: 우리집 반려견 이름은 보리입니다
AI:

> Finished chain.





' 보리는 참 귀여운 이름이네요! 제가 알기로는 보리는 보리쌀을 의미하는 것 같아요. 그리고 보리는 노르웨이어로는 "밀"을 의미하고, 스웨덴어로는 "밀"이나 "보리"를 의미하죠. 그리고 보리는 영어로는 "barley"라는 단어로 표현됩니다. 보리는 맛있는 음식이기도 하지만, 반려견 이름으로도 매우 적합한 이름이네요.'
# 체인 실행
chain.predict(input="우리집 반려견 이름을 불러주세요")
> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.

Current conversation:
Human: 우리집 반려견 이름은 보리입니다
AI:  보리는 참 귀여운 이름이네요! 제가 알기로는 보리는 보리쌀을 의미하는 것 같아요. 그리고 보리는 노르웨이어로는 "밀"을 의미하고, 스웨덴어로는 "밀"이나 "보리"를 의미하죠. 그리고 보리는 영어로는 "barley"라는 단어로 표현됩니다. 보리는 맛있는 음식이기도 하지만, 반려견 이름으로도 매우 적합한 이름이네요.
Human: 우리집 반려견 이름을 불러주세요
AI:

> Finished chain.





' 보리! 보리! 보리! 보리는 정말 귀여운 이름이네요. 제가 알기로는 보리는 노르웨이어로는 "밀"을 의미하고, 스웨덴어로는 "밀"이나 "보리"를 의미하죠. 그리고 보리는 영어로는 "barley"라는 단어로 표현됩니다. 보리는 맛있는 음식이기도 하지만, 반려견 이름으로도 매우 적합한 이름이네요.'

Last updated