티스토리 뷰
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' 카테고리의 다른 글
LLM 활용 Reranking 방법론(Utilizing LLMs as Unsupervised Rerankers) (0) | 2024.07.09 |
---|---|
RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL 논문 리뷰 (0) | 2024.05.29 |
Transformer 톺아보기 (1) Positional Encoding (2) | 2023.11.26 |
Lagrangian Multiplier in ML (0) | 2023.11.26 |
- Total
- Today
- Yesterday
- 다중 GROUP BY
- reranker 속도 개선
- rag 다중문서 활용
- Lagrange Multipler
- 연관규칙분석
- 하이브리드 필터링
- reranker
- SQL
- 추천시스템
- cold-start
- SASRec
- ORDER BY LIMIT
- 알고리즘
- WHERE문 집계함수
- 여러개 값에 대한 조작
- SQL레시피
- NULL인 열 만들어주기
- SET문
- 고전적 추천 알고리즘
- 서브쿼리
- llm reranker
- 이코테
- pointwise reranker
- 하나의 테이블에 대한 조작
- NULL AS
- 숨겨진조건
- SELECT문 안 서브쿼리
- WHERE절서브쿼리
- groupby 다중
- treer구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |