MMR 알고리즘은 첫번째 단계에서 가장 관련성 높은 항목을 선택한다.
이후의 각 단계에서는 현재 선택된 항목들과 관련성이 높으면서도 가장 차별화된 항목을 찾아 선택합니다. 이는 람다값에 의해 조절되며, 이 값이 클수록 관련성을, 작을수록 다양성을 더 중시합니다.
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_core.example_selectors import (
SemanticSimilarityExampleSelector, MaxMarginalRelevanceExampleSelector
)
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
chroma = Chroma("fewshot_chat", OpenAIEmbeddings())
example_prompt = ChatPromptTemplate.from_messages(
[
("human", "{instruction}:\n{input}"),
("ai", "{answer}"),
]
)
example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
# 여기에는 선택 가능한 예시 목록이 있습니다.
examples,
# 여기에는 의미적 유사성을 측정하는 데 사용되는 임베딩을 생성하는 임베딩 클래스가 있습니다.
OpenAIEmbeddings(),
# 여기에는 임베딩을 저장하고 유사성 검색을 수행하는 데 사용되는 VectorStore 클래스가 있습니다.
chroma,
# 이것은 생성할 예시의 수입니다.
k=1,
)
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
)
Number of requested results 20 is greater than number of elements in index 3, updating n_results = 3
[{'answer': '\n회의록: XYZ 회사 마케팅 전략 회의\n일시: 2023년 12월 25일\n장소: XYZ 회사 회의실\n참석자: 김수진 (마케팅 팀장), 박지민 (디지털 마케팅 담당자), 이준호 (소셜 미디어 관리자)\n\n1. 개회\n - 회의는 김수진 팀장의 개회사로 시작됨.\n - 회의의 목적은 2024년 상반기 마케팅 전략 수립 및 새로운 소셜 미디어 캠페인 아이디어 논의.\n\n2. 시장 동향 개요 (김수진)\n - 김수진 팀장은 최근 시장 동향에 대한 분석을 제시.\n - 소비자 행동 변화와 경쟁사 전략에 대한 통찰 공유.\n\n3. 디지털 마케팅 전략 (박지민)\n - 박지민은 디지털 마케팅 전략에 대해 발표.\n - 온라인 광고와 SEO 최적화 방안에 중점을 둠.\n\n4. 소셜 미디어 캠페인 (이준호)\n - 이준호는 새로운 소셜 미디어 캠페인에 대한 아이디어를 제안.\n - 인플루언서 마케팅과 콘텐츠 전략에 대한 계획을 설명함.\n\n5. 종합 논의\n - 팀원들 간의 아이디어 공유 및 토론.\n - 각 전략에 대한 예산 및 자원 배분에 대해 논의.\n\n6. 마무리\n - 다음 회의 날짜 및 시간 확정.\n - 회의록 정리 및 배포는 박지민 담당.\n',
'input': '2023년 12월 25일, XYZ 회사의 마케팅 전략 회의가 오후 3시에 시작되었다. 회의에는 마케팅 팀장인 김수진, 디지털 마케팅 담당자인 박지민, 소셜 미디어 관리자인 이준호가 참석했다. 회의의 주요 목적은 2024년 상반기 마케팅 전략을 수립하고, 새로운 소셜 미디어 캠페인에 대한 아이디어를 논의하는 것이었다. 팀장인 김수진은 최근 시장 동향에 대한 간략한 개요를 제공했으며, 이어서 각 팀원이 자신의 분야에서의 전략적 아이디어를 발표했다.',
'instruction': '당신은 회의록 작성 전문가 입니다. 주어진 정보를 바탕으로 회의록을 작성해 주세요'}]
FewShotChatMessagePromptTemplate에 대해서 정리하려고 합니다.
시드 문장을 넣어주는 경우
examples = [
{
"instruction": "당신은 회의록 작성 전문가 입니다. 주어진 정보를 바탕으로 회의록을 작성해 주세요",
"input": "2023년 12월 25일, XYZ 회사의 마케팅 전략 회의가 오후 3시에 시작되었다. 회의에는 마케팅 팀장인 김수진, 디지털 마케팅 담당자인 박지민, 소셜 미디어 관리자인 이준호가 참석했다. 회의의 주요 목적은 2024년 상반기 마케팅 전략을 수립하고, 새로운 소셜 미디어 캠페인에 대한 아이디어를 논의하는 것이었다. 팀장인 김수진은 최근 시장 동향에 대한 간략한 개요를 제공했으며, 이어서 각 팀원이 자신의 분야에서의 전략적 아이디어를 발표했다.",
"answer": """
회의록: XYZ 회사 마케팅 전략 회의
일시: 2023년 12월 25일
장소: XYZ 회사 회의실
참석자: 김수진 (마케팅 팀장), 박지민 (디지털 마케팅 담당자), 이준호 (소셜 미디어 관리자)
1. 개회
- 회의는 김수진 팀장의 개회사로 시작됨.
- 회의의 목적은 2024년 상반기 마케팅 전략 수립 및 새로운 소셜 미디어 캠페인 아이디어 논의.
2. 시장 동향 개요 (김수진)
- 김수진 팀장은 최근 시장 동향에 대한 분석을 제시.
- 소비자 행동 변화와 경쟁사 전략에 대한 통찰 공유.
3. 디지털 마케팅 전략 (박지민)
- 박지민은 디지털 마케팅 전략에 대해 발표.
- 온라인 광고와 SEO 최적화 방안에 중점을 둠.
4. 소셜 미디어 캠페인 (이준호)
- 이준호는 새로운 소셜 미디어 캠페인에 대한 아이디어를 제안.
- 인플루언서 마케팅과 콘텐츠 전략에 대한 계획을 설명함.
5. 종합 논의
- 팀원들 간의 아이디어 공유 및 토론.
- 각 전략에 대한 예산 및 자원 배분에 대해 논의.
6. 마무리
- 다음 회의 날짜 및 시간 확정.
- 회의록 정리 및 배포는 박지민 담당.
""",
},
{
"instruction": "당신은 요약 전문가 입니다. 다음 주어진 정보를 바탕으로 내용을 요약해 주세요",
"input": "이 문서는 '지속 가능한 도시 개발을 위한 전략'에 대한 20페이지 분량의 보고서입니다. 보고서는 지속 가능한 도시 개발의 중요성, 현재 도시화의 문제점, 그리고 도시 개발을 지속 가능하게 만들기 위한 다양한 전략을 포괄적으로 다루고 있습니다. 이 보고서는 또한 성공적인 지속 가능한 도시 개발 사례를 여러 국가에서 소개하고, 이러한 사례들을 통해 얻은 교훈을 요약하고 있습니다.",
"answer": """
문서 요약: 지속 가능한 도시 개발을 위한 전략 보고서
- 중요성: 지속 가능한 도시 개발이 필수적인 이유와 그에 따른 사회적, 경제적, 환경적 이익을 강조.
- 현 문제점: 현재의 도시화 과정에서 발생하는 주요 문제점들, 예를 들어 환경 오염, 자원 고갈, 불평등 증가 등을 분석.
- 전략: 지속 가능한 도시 개발을 달성하기 위한 다양한 전략 제시. 이에는 친환경 건축, 대중교통 개선, 에너지 효율성 증대, 지역사회 참여 강화 등이 포함됨.
- 사례 연구: 전 세계 여러 도시의 성공적인 지속 가능한 개발 사례를 소개. 예를 들어, 덴마크의 코펜하겐, 일본의 요코하마 등의 사례를 통해 실현 가능한 전략들을 설명.
- 교훈: 이러한 사례들에서 얻은 주요 교훈을 요약. 강조된 교훈에는 다각적 접근의 중요성, 지역사회와의 협력, 장기적 계획의 필요성 등이 포함됨.
이 보고서는 지속 가능한 도시 개발이 어떻게 현실적이고 효과적인 형태로 이루어질 수 있는지에 대한 심도 있는 분석을 제공합니다.
""",
},
{
"instruction": "당신은 문장 교정 전문가 입니다. 다음 주어진 문장을 교정해 주세요",
"input": "우리 회사는 새로운 마케팅 전략을 도입하려고 한다. 이를 통해 고객과의 소통이 더 효과적이 될 것이다.",
"answer": "본 회사는 새로운 마케팅 전략을 도입함으로써, 고객과의 소통을 보다 효과적으로 개선할 수 있을 것으로 기대된다.",
},
]
시드 문장을 넣어주었습니다.
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_core.example_selectors import (
SemanticSimilarityExampleSelector,
)
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
chroma = Chroma("fewshot_chat", OpenAIEmbeddings())
example_prompt = ChatPromptTemplate.from_messages(
[
("human", "{instruction}:\n{input}"),
("ai", "{answer}"),
]
)
example_selector = SemanticSimilarityExampleSelector.from_examples(
# 여기에는 선택 가능한 예시 목록이 있습니다.
examples,
# 여기에는 의미적 유사성을 측정하는 데 사용되는 임베딩을 생성하는 임베딩 클래스가 있습니다.
OpenAIEmbeddings(),
# 여기에는 임베딩을 저장하고 유사성 검색을 수행하는 데 사용되는 VectorStore 클래스가 있습니다.
chroma,
# 이것은 생성할 예시의 수입니다.
k=1,
)
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
)
SematicsSimilarityExampleSelector를 사용하여 examples에서 추출하도록 합니다.
final_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are a helpful assistant.",
),
few_shot_prompt,
("human", "{instruction}\n{input}"),
]
)
final_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are a helpful assistant.",
),
few_shot_prompt,
("human", "{instruction}\n{input}"),
]
)
# chain 생성
from langchain_openai import ChatOpenAI
from langchain_teddynote.messages import stream_response
from langchain_core.output_parsers import StrOutputParser
# 객체 생성
llm = ChatOpenAI(
temperature=0, # 창의성
model_name=”gpt-4-turbo”, # 모델명
)
chain = final_prompt | llm | StrOutputParser()
# 실행 및 결과 출력
# answer = chain.stream(question)
# stream_response(answer)
answer = chain.invoke(question)
for token in answer:
print(token, end = ”, flush = True)
회의록: ABC 기술 회사 제품 개발 팀 주간 진행 상황 회의
일시: 2023년 12월 26일
장소: ABC 기술 회사 회의실
참석자: 최현수 (프로젝트 매니저), 황지연 (주요 개발자), 김태영 (UI/UX 디자이너)
1. 개회
- 최현수 프로젝트 매니저가 회의를 개회하고, 회의의 목적을 설명함.
- 목적: 프로젝트의 현재 진행 상황 검토 및 다가오는 마일스톤에 대한 계획 수립.
2. 프로젝트 진행 상황 보고
- 황지연 개발자가 개발 진행 상황에 대해 보고.
- 현재 개발 중인 기능들의 진행 상태와 예상 완료 시점 공유.
- 발생한 문제점 및 해결 방안 논의.
- 김태영 디자이너가 UI/UX 디자인 진행 상황에 대해 보고.
- 최근 완성된 디자인 요소와 사용자 피드백에 대한 개요 제공.
- 다음 단계의 디자인 계획 발표.
3. 마일스톤 계획 논의
- 최현수가 다가오는 마일스톤에 대한 전체 일정과 목표를 설명.
- 각 팀원이 마일스톤 달성을 위한 구체적인 계획과 필요 자원을 논의.
4. 다음 주 목표 설정
- 팀은 다음 주까지의 구체적인 목표를 설정.
- 황지연: 주요 기능 중 하나의 개발 완료.
- 김태영: 사용자 테스트를 위한 프로토타입 준비.
5. 문제 해결 및 지원 요청
- 팀원들이 현재 직면한 문제를 공유하고, 필요한 지원에 대해 논의.
6. 마무리
- 다음 회의 날짜 및 시간 확정.
- 최현수가 회의를 마무리하며, 팀원들의 노력에 감사를 표함.
회의록 작성자: 최현수
회의록 배포: 2023년 12월 27일
이제 하다보면 Example Selector의 유사도 계산시에 instruction과 input을 사용하고 있는데 instruction만을 사용하여 검색시 제대로 결과가 나오지 않는 문제가 발생할 수 있음
