티스토리 뷰

AI | DS

Langchain 정리

오탱 2024. 3. 17. 23:27

Chain이란?

여러개의 LLM을 연결하여 LLM 애플리케이션을 개발할 수 있는 기능

Sequential Chain

: 순차적인 실행뿐만 아니라 병렬로 LLM chain을 호출

예시

  • chain 1,2,3 → 각각 Prompt로 구현!
    • chain1 = resume 전처리
    • chain2 = big question 생성
    • chain3 = big question에서 상관성 낮은 역량 6개 추출??? ( 선택된 핵심 역량)
    • → 그런다음에 langchain의 **SequentialChain**으로 3개 묶어줌!!

RouterChain

: 입력값에 따라 chain을 선택해서 분기하는 것

Prompt 구성요소

  • 지시(Instruction) | 모델에게 특정 작업이나 지시를 제공합니다.예시: "다음 문장을 번역해주세요."
  • 문맥(Context) | 응답을 더 효과적이게 만들기 위해 제공되는 배경 정보나 추가적인 문맥을 의미합니다.예시: "이 문장은 18세기 중반의 영국에서 쓰여진 것입니다."
  • 입력 데이터(Input Data) ㅣ 모델에게 응답을 요청하는 실제 질문이나 데이터입니다.예시: "The sun never sets on the British Empire."
  • 출력 지시자(Output Indicator) | 원하는 출력의 형식이나 특징에 대한 지시를 제공합니다.예시: "영-한 번역으로 제공해주세요."
  • 여기에서 중요한 것은 context나 input_data에 이전 대화 내용을 넣거나 문서 내용을 넣을 수 있다는 것! 
    또한, output_indicator 통해서 응답을 json, csv 형식으로 받을 수 있으며, URL 형식으로 받아 LLM 모델이 API를 호출하는 것도 가능함! 
    => Prompt에 모든 종류의 텍스트를 넣을 수 있고, 원하는 방식으로 응답을 받을 수 있음!

Prompt Template

: LangChain의 프롬프트 템플릿은 LLMs에 메시지를 전달하기 전에 문장 구성을 편리하게 만들어주는 기능입니다.

from langchain.prompts import PromptTemplate

prompt = PromptTemplate.from_template("부산에 대해 알려줘.")
prompt.format() # 결과: "부산에 대해 알려줘."
이게 다라면 그냥 문자열을 쓰는게 더 간편하겠죠? 포맷 기능을 봅시다.

from langchain.prompts import PromptTemplate

prompt = PromptTemplate.from_template("{city}에 대해 알려줘.")
prompt.format(city="부산") # 결과: "부산에 대해 알려줘."

# 다른 방법
prompt = PromptTemplate(input_variables=["city"],
                        template="{city}에 대해 알려줘.")
prompt.format(city="부산") # 결과: "부산에 대해 알려줘."

LLM 애플리케이션 개발을 위한 Langchain #7-PromptTemplate

ChatPromptTemplate

PromptTemplate은 기본적으로 문장 완성 모델(Completion model: llms)을 위한 템플릿입니다. 챗모델(Chat completion model: chat_models)을 위한 템플릿은 ChatPromptTemplate입니다.

Prompt ExampleSelector

Few-shot Prompting 시에 예제를 동적으로 선택하여 프롬프트에 삽입하는 방식

→ 데이터 베이스나 메모리에 여러개의 에제들을 미리 저장해놓고, 질문에 따라서 가장 유사한 예제를 찾아서 선택하는 방식

SemanticSimilarityExampleSelector

: 유사도 기반 예제 선택기

→ 입력되는 프롬프트와 예제 프롬프트 문장간의 유사도를 기반으로 예제를 추천

→ 임베딩과 벡터 DB 이용

!pip install chromadb
 
다음은 유사도 기반 예제 검색을 사용하는 예제 코드이다. 
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
 
import os
os.environ["OPENAI_API_KEY"] = "{YOUR_API_KEY}"
 
examples = [
    {"input":"Happy.","category":"emotion"},
    {"input":"BBQ","category":"food"},
    {"input":"Golf","category":"Sports"},
    {"input":"Student","category":"Person"}
]
 
example_prompt = PromptTemplate(template="Input:{input} Category:{category}",
                                input_variables=["input","category"])       
example_selector = SemanticSimilarityExampleSelector.from_examples(examples, OpenAIEmbeddings(),Chroma,k=1,)
dynamic_prompt = FewShotPromptTemplate(
    example_selector = example_selector,
    example_prompt = example_prompt,
    prefix = "What is the category of the input? .",
    suffix = "input: {input}",
    input_variables = ["input"]
)
 
output=dynamic_prompt.format(input="Sushi")
print(output)

→ 직무별로 프롬프트 예시 다르게 준다든지 이런 식으로 활용할 수 있을듯?

OutputParser

: 원하는 형식의 출력을 얻을 수 있도록 OutputParser 기능을 제공

출력 파서 (Output Parser) 는 모델의 출력을 처리하고, 그 결과를 원하는 형식으로 변환하는 역할

출력 파서는 모델에서 반환된 원시 텍스트를 분석하고, 특정 정보를 추출하거나, 출력을 특정 형식으로 재구성하는 데 사용됨! 

LLMChain: PromptTemplate + LLM

from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains importLLMChain

llm = ChatOpenAI(temperature=0.9)

prompt = PromptTemplate(
    input_variables=["what"],
    template="{what} 이름 세 개를 추천해줘.",
)

chain =LLMChain(llm=llm, prompt=prompt)

print(chain.run("새로 만든 거대 언어 모델"))

 

 

Retrieval기반 QA Chain

Semantic Search로 찾은 문서를 사용자 질문과 함께 ChatGPT에 보내서 답변 생성하기 LangChain에 제공하는 Retrieval 기반 QA 클래스에는 RetrievalQA와 ConversationalRetrievalChain 의 두가지 종류가 있음

  • RetrievalQA.from_chain_type : retrieval만을 사용하여 답변 생성
PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"]
)

chain_type_kwargs = {"prompt": PROMPT}
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vector_index.as_retriever(),
    chain_type_kwargs=chain_type_kwargs)
  • ConversationalRetrievalChain.from_llm : Chat history 기억과 retrieval을 같이 사용하여 답변 생성
conv_chain = ConversationalRetrievalChain.from_llm(
    ChatOpenAI(temperature=0, model="gpt-4"), 
    retriever=retriever,
)
chat_history = []
query = "What is LangChain?"
result = conv_chain.invoke({"question": query, "chat_history": chat_history})

print(result["answer"])

출처: <https://rfriend.tistory.com/849> [R, Python 분석과 프로그래밍의 친구 (by R Friend):티스토리]

https://discuss.streamlit.io/t/build-your-own-notion-chatbot/51497

ConversationChain

ConversationChain  = (Chat Model + Memory)

ConversationChain 의 경우, 자체적으로 내장 메모리를 가지고 있어서 자동으로 Memory 에 대화내용을 저장

→ 이전의 대화 내용을 기록하는 메모리에 대한 별도작업 생략 가능 !

 

 

 

참고자료

https://pkgpl.org/2023/09/17/langchain-prompt-template

https://rfriend.tistory.com/849

https://pkgpl.org/2023/09/09/프롬프트-엔지니어링-좋은-프롬프트-작성하기/

/https://teddylee777.github.io/langchain/langchain-tutorial-03/https://pkgpl.org/2023/09/17/langchain-prompt-template

https://teddylee777.github.io/langchain/langchain-tutorial-03/

'AI | DS' 카테고리의 다른 글

Transformer 톺아보기 (1) Positional Encoding  (2) 2023.11.26
Lagrangian Multiplier in ML  (0) 2023.11.26