ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 출처

    https://docs.llamaindex.ai/en/stable/index.html

Designed by Tistory.