-
[LlamaIndex] Prompt카테고리 없음 2024. 1. 16. 22:23
Prompt는 LLM이 출력을 생성할때 가장 많은 영향을 미치는 요소 중 하나 입니다. Prompt는 답변 합성, 검색, 인덱스 구성 등에 사용됩니다. LlamaIndex에서는 Prompt를 개선하기 위한 간단한 방법부터 고급 방법까지 제공하고 있습니다.
○ Prompt 사용 패턴
# 사용자 정의 프롬프트
LlamaIndex에서는 PromptTemplate 클래스를 사용하여 간단하게 기본 Prompt를 수정 할 수 있습니다.
from llama_index.prompts import PromptTemplate # 텍스트 질의응답 프롬프트 수정 text_qa_template_str = ( "Context information is" " below.\n---------------------\n{context_str}\n---------------------\nUsing" " both the context information and also using your own knowledge, answer" " the question: {query_str}\nIf the context isn't helpful, you can also" " answer the question on your own.\n" ) text_qa_template = PromptTemplate(text_qa_template_str) # 메시지 프롬프트 수정 template = ( "We have provided context information below. \n" "---------------------\n" "{context_str}" "\n---------------------\n" "Given this information, please answer the question: {query_str}\n" ) qa_template = PromptTemplate(template) # you can create text prompt (for completion API) prompt = qa_template.format(context_str=..., query_str=...) # or easily convert to message prompts (for chat API) messages = qa_template.format_messages(context_str=..., query_str=...)
○ 고급 Prompt 기능
# 부분 서식
프롬프트의 형식을 부분적으로 지정하여, 일부 변수는 나중에 채우도록 합니다.
from llama_index.prompts import PromptTemplate prompt_tmpl_str = "{foo} {bar}" prompt_tmpl = PromptTemplate(prompt_tmpl_str) partial_prompt_tmpl = prompt_tmpl.partial_format(foo="abc") fmt_str = partial_prompt_tmpl.format(bar="def")
# 템플릿 변수 매핑
프롬프트에는 특정 키가 필요합니다. 예를 들어 text_qa_prompt에서는 'context_str'과 'query_str'이 필요합니다. LlamaIndex에서는 해당 키의 이름을 아래와 같이 변경 할 수 있습니다.
template_var_mappings = {"context_str": "my_context", "query_str": "my_query"} prompt_tmpl = PromptTemplate( qa_prompt_tmpl_str, template_var_mappings=template_var_mappings )
# 기능 매핑
고정된 값 대신 템플릿 변수로 함수를 전달 합니다. 이 기능은 동적 퓨샷 프롬프트에 활용 할 수 있습니다.
def format_context_fn(**kwargs): # format context with bullet points context_list = kwargs["context_str"].split("\n\n") fmtted_context = "\n\n".join([f"- {c}" for c in context_list]) return fmtted_context prompt_tmpl = PromptTemplate( qa_prompt_tmpl_str, function_mappings={"context_str": format_context_fn} ) prompt_tmpl.format(context_str="context", query_str="query")
○ RAG를 위한 Prompt Engineering
# Few-Shot 예시 추가
쿼리에 따라 동적으로 예시를 추가하는 Dynamic Few-Shot 구현 방법입니다.
from llama_index.schema import TextNode few_shot_nodes = [] for line in open("../llama2_qa_citation_events.jsonl", "r"): few_shot_nodes.append(TextNode(text=line)) few_shot_index = VectorStoreIndex(few_shot_nodes) few_shot_retriever = few_shot_index.as_retriever(similarity_top_k=2)
import json def few_shot_examples_fn(**kwargs): query_str = kwargs["query_str"] retrieved_nodes = few_shot_retriever.retrieve(query_str) # go through each node, get json object result_strs = [] for n in retrieved_nodes: raw_dict = json.loads(n.get_content()) query = raw_dict["query"] response_dict = json.loads(raw_dict["response"]) result_str = f"""\ Query: {query} Response: {response_dict}""" result_strs.append(result_str) return "\n\n".join(result_strs)
# write prompt template with functions qa_prompt_tmpl_str = """\ Context information is below. --------------------- {context_str} --------------------- Given the context information and not prior knowledge, \ answer the query asking about citations over different topics. Please provide your answer in the form of a structured JSON format containing \ a list of authors as the citations. Some examples are given below. {few_shot_examples} Query: {query_str} Answer: \ """ qa_prompt_tmpl = PromptTemplate( qa_prompt_tmpl_str, function_mappings={"few_shot_examples": few_shot_examples_fn}, )
# Source 출처