LLM學習(5)——系統評估與最佳化

zddkk發表於2024-04-26

5.1 如何評估 LLM 應用

5.1.1 驗證評估的一般思路

透過不斷尋找Bad Case並進行針對性最佳化,將這些案例逐步加入驗證集,形成一個具有一定樣本數量的驗證集。針對這種驗證集,逐個進行評估變得不切實際,需要一種自動評估方法來對整體效能進行評估。驗證迭代是構建以LLM為核心的應用程式的重要步驟,透過不斷尋找Bad Case、調整Prompt或最佳化檢索效能,推動應用程式達到目標效能和準確性。接下來,將介紹大模型開發評估的幾種方法,並簡要介紹從少數Bad Case針對性最佳化到整體自動評估的一般思路。

5.1.2大模型評估方法

人工評估的一般思路

準則一 量化評估
為保證很好地比較不同版本的系統效能,量化評估指標是非常必要的。我們應該對每一個驗證案例的回答都給出打分,最後計算所有驗證案例的平均分得到本版本系統的得分。量化的量綱可以是05,也可以是0100,可以根據個人風格和業務實際情況而定。
量化後的評估指標應當有一定的評估規範,例如在滿足條件 A 的情況下可以打分為 y 分,以保證不同評估員之間評估的相對一致。
以下是對於問題

  1. 南瓜書和西瓜書有什麼關係?
  2. 應該如何使用南瓜書?

兩個模板的結果

LLM學習(5)——系統評估與最佳化
LLM學習(5)——系統評估與最佳化

以下是相應的程式碼[注:相對於前文這裡我更改了嵌入的方式因為Gemini的嵌入實在太差了,還有pdf的匯入方式,我用PyMuPDFLoader替代了PyPDFLoader因為PyPDFLoader輸出會出現亂碼]

from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA


template_v1 = """使用以下上下文來回答最後的問題。如果你不知道答案,就說你不知道,不要試圖編造答
案。最多使用三句話。儘量使答案簡明扼要。總是在回答的最後說“謝謝你的提問!”。
{context}
問題: {question}
"""

QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],
                                 template=template_v1)



qa_chain = RetrievalQA.from_chain_type(llm,
                                       retriever=vectordb.as_retriever(),
                                       return_source_documents=True,
                                       chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})

print("問題一:")
question = "南瓜書和西瓜書有什麼關係?"
result = qa_chain({"query": question})
print(result["result"])

print("問題二:")
question = "應該如何使用南瓜書?"
result = qa_chain({"query": question})
print(result["result"])
template_v2 = """使用以下上下文來回答最後的問題。如果你不知道答案,就說你不知道,不要試圖編造答
案。你應該使答案儘可能詳細具體,但不要偏題。如果答案比較長,請酌情進行分段,以提高答案的閱讀體驗。
{context}
問題: {question}
有用的回答:"""

QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],
                                 template=template_v2)

qa_chain = RetrievalQA.from_chain_type(llm,
                                       retriever=vectordb.as_retriever(),
                                       return_source_documents=True,
                                       chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})

print("問題一:")
question = "南瓜書和西瓜書有什麼關係?"
result = qa_chain({"query": question})
print(result["result"])

print("問題二:")
question = "應該如何使用南瓜書?"
result = qa_chain({"query": question})
print(result["result"])

我們可以看出來,對於問題1模板A有稍微好一些的結果,對於問題二兩者結果一致,所以這種評估方式其實並不推薦,首先難以確定哪個結果更好,其次需要兩個問題的答案都更好非常困難。

多維評估

對於大模型的評估,可以從多個維度出發,包括知識查詢正確性、回答一致性、回答幻覺比例、回答正確性、邏輯性、通順性和智慧性等方面進行評估。每個維度都可以設計相應的評估指標,並在0~1之間進行打分,以綜合評估系統的效能表現。同時,評估指標應當結合業務實際,量化評估和多維評估相結合,全面評估系統的效能表現。

print("問題:")
question = "應該如何使用南瓜書?"
print(question)
print("模型回答:")
result = qa_chain({"query": question})
print(result["result"])
print(result["source_documents"])


對答案進行多維打分

簡單自動評估

構造客觀題
構造如下客觀題

prompt_template = '''
請你做如下選擇題:
題目:南瓜書的作者是誰?
選項:A 周志明 B 謝文睿 C 秦州 D 賈彬彬
你可以參考的知識片段:
~~
{}
~~
請僅返回選擇的選項
如果你無法做出選擇,請返回空
'''

我們規定如下打分策略:全選1分,漏選0.5分,錯選不選不得分(錯選也可以設為扣1分)這樣我們就可以實現快速的評估

計算相似度

構造標準答案並計算回答與標準答案相似度

使用大模型進行評估

構造 Prompt Engineering 讓大模型充當一個評估者的角色,從而替代人工評估的評估員;同時大模型可以給出類似於人工評估的結果,因此可以採取人工評估中的多維度量化評估的方式,實現快速全面的評估。

# 使用第二章講過的 OpenAI 原生介面

from openai import OpenAI

client = OpenAI(
    # This is the default and can be omitted
    api_key=os.environ.get("OPENAI_API_KEY"),
)


def gen_gpt_messages(prompt):
    '''
    構造 GPT 模型請求引數 messages
    
    請求引數:
        prompt: 對應的使用者提示詞
    '''
    messages = [{"role": "user", "content": prompt}]
    return messages


def get_completion(prompt, model="gpt-3.5-turbo", temperature = 0):
    '''
    獲取 GPT 模型呼叫結果

    請求引數:
        prompt: 對應的提示詞
        model: 呼叫的模型,預設為 gpt-3.5-turbo,也可以按需選擇 gpt-4 等其他模型
        temperature: 模型輸出的溫度係數,控制輸出的隨機程度,取值範圍是 0~2。溫度係數越低,輸出內容越一致。
    '''
    response = client.chat.completions.create(
        model=model,
        messages=gen_gpt_messages(prompt),
        temperature=temperature,
    )
    if len(response.choices) > 0:
        return response.choices[0].message.content
    return "generate answer error"

question = "應該如何使用南瓜書?"
result = qa_chain({"query": question})
answer = result["result"]
knowledge = result["source_documents"]

response = get_completion(prompt.format(question, answer, knowledge))
response

BULE 打分

n-gram:指一個語句裡面連續的n個單片語成的片段
精確度:指Candidate(生成模型的預測文字)語句裡面的n-gram在所有Reference(標準文字)語句裡面出現的機率
modified n-gram recision:\(Modified\ n-gram\ precision=\frac{Number of total generated n-grams}{Number of matching n-grams}\)

  • Number of matching n-grams表示生成文字中與參考文字匹配的n-gram序列數量;
  • Number of total generated n-grams表示生成文字中總的n-gram序列數量。

BP
當待評價譯文同任意一個參考譯文長度相等或超過參考譯文長度時,BP值為1,當待評價譯文的長度較短時加一個權重
\(\left.BP=\left\{\begin{array}{ll}1&if&c>r\\e^{1-r/c}&if&c\leq r\end{array}\right.\right.\)
然後我們就可以計算分數
\(Bleu=BP\cdot\exp(\sum_{n=1}^Nw_n\log p_n)\)

相關文章