大語言模型(LLM)根據複雜的神經網路架構,能學習並生成人類語言,應用範圍涵蓋文字生成、翻譯、問答系統等。雖然本地可執行模型如 Llama 3 已具備一定能力,但仍不及 GPT-4 等大型專有模型。透過 OpenAI API,開發者可探索 GPT-4 的應用並評估生成模型的回應。指令微調能最佳化 LLM 效能,使其更精確地理解指令並完成任務。此過程包含資料準備、建立資料載入器、載入預訓練模型、指令微調及評分等步驟。實際應用中,資料批次處理能提升效率。評估 LLM 效能並據此調整引數或最佳化演算法,能提升模型在特定任務上的表現。

大語言模型的應用與評估

在深入探討大語言模型(LLM)的應用之前,瞭解其工作原理和評估方法是非常重要的。這些模型透過複雜的神經網路結構來學習和生成人類語言,具有廣泛的應用前景,包括但不限於文字生成、語言翻譯、問答系統等。

使用Web API存取更大的LLM

雖然像Llama 3這樣的8億引數模型已經相當強大,並且可以在本地執行,但是它仍然不如一些大型的專有LLM,如GPT-4那樣強大。對於那些想要探索如何透過OpenAI API使用GPT-4來評估生成模型回應的讀者,提供了一個可選的程式碼筆記本。

指令細化流程

指令細化(Instruction Fine-Tuning)是一個對LLM進行最佳化的過程,目的是使模型更好地理解和回應特定的指令或任務。這個過程通常包括以下幾個階段:

  1. 資料準備:這包括下載和格式化資料集,以便於模型的訓練。
  2. 建立資料載入器:為了高效地將資料餵入模型,需要建立資料載入器。
  3. 載入預訓練LLM:利用預訓練的LLM作為基礎,可以節省大量的訓練時間和資源。
  4. 指令細化LLM:這是核心階段,透過迭代的過程,使LLM更好地適應特定的指令或任務。
  5. 評分:最後,需要有一個方法來評估細化後模型的效能,以確保它達到了預期的效果。

資料批次處理

在實際應用中,為了提高效率,往往需要對資料進行批次處理。這涉及到將資料分成多個批次,每個批次包含一定量的資料,然後再餵入模型進行訓練或推理。

評估和最佳化

評估LLM的效能是一個非常重要的步驟。透過量化模型的效能,可以對其進行最佳化,從而使其在特定任務上表現得更好。這可能涉及到調整模型的引數、選擇不同的最佳化演算法等。

內容解密:

上述內容介紹了大語言模型的基本概念、指令細化流程以及評估和最佳化方法。透過這些步驟,可以使LLM更好地適應特定的任務和應用場景。下面是一個簡單的Python程式碼片段,示範瞭如何載入一個預訓練的LLM並進行簡單的文字生成:

import torch
from transformers import LlamaForCausalLM, LlamaTokenizer

# 載入預訓練模型和tokenizer
model = LlamaForCausalLM.from_pretrained("decapoda-research/llama-7b-hf")
tokenizer = LlamaTokenizer.from_pretrained("decapoda-research/llama-7b-hf")

# 定義輸入文字
input_text = "Hello, how are you?"

# 將輸入文字轉換為tokenizer輸入格式
inputs = tokenizer(input_text, return_tensors="pt")

# 生成文字
outputs = model.generate(**inputs)

# 將生成的文字轉換回字串
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)

print(generated_text)

這個程式碼示範瞭如何使用Hugging Face Transformers函式庫載入一個預訓練的LLM,並使用它生成文字。

圖表翻譯:

下面的Mermaid圖表示範了指令細化流程:

  graph LR
    A[資料準備] --> B[建立資料載入器]
    B --> C[載入預訓練LLM]
    C --> D[指令細化LLM]
    D --> E[評分]

這個圖表展示了從資料準備到評分的整個流程,每個步驟之間的邏輯關係非常明確。

使用 Ollama 應用程式進行 LLM 評估

在評估 LLM 的過程中,我們使用另一個 LLM 自動評估由玄貓提取的回應。這個過程涉及多個階段,包括對模型的微調、評估和質性評估。

微調 LLM

首先,我們需要微調 LLM 以使其遵循特定的指示。這個階段對於確保模型能夠生成高品質的回應至關重要。使用 Ollama 應用程式或 ollama serve 命令,可以輕鬆地執行這個過程。

評估 LLM

評估 LLM 的效能是確保其符合要求的關鍵步驟。這包括提取回應、檢查模型的損失函式以及進行質性評估。透過這些步驟,可以全面瞭解模型的強項和弱項。

執行 Llama 3 模型

要試用 8 億引數的 Llama 3 模型,可以執行以下命令:

ollama run llama3

這個命令會下載模型(如果尚未下載)並執行它。第一次執行時,模型會被自動下載,佔用約 4.7 GB 的儲存空間。下載過程會顯示進度條,直到模型完全下載並驗證完成。

下載和驗證模型

下載過程包括多個步驟,例如提取模型的各個部分、驗證 SHA-256 數字簽名以及寫入manifest檔案。這些步驟確保模型下載和安裝正確無誤。

  flowchart TD
    A[開始] --> B[下載模型]
    B --> C[驗證SHA-256數字簽名]
    C --> D[寫入manifest檔案]
    D --> E[移除未使用的層]
    E --> F[完成]

圖表翻譯:

此圖表描述了下載和驗證 Llama 3 模型的過程。從開始到完成,圖表展示了每一步驟,包括下載模型、驗證數字簽名、寫入manifest檔案、移除未使用的層以及最終完成。

執行Ollama的兩種選擇

執行Ollama有兩種方式。第一種方式是透過終端命令ollama serve啟動Ollama。另一種方式是在macOS系統中,直接執行Ollama應用程式並將其置於背景執行,而不是使用ollama serve命令啟動。

第一種選擇:使用終端命令啟動Ollama

首先,開啟一個單獨的終端視窗,輸入命令ollama serve以啟動Ollama。然後,輸入命令ollama run llama3下載並使用8億引數的Llama 3模型。

第二種選擇:在macOS中背景執行Ollama應用程式

如果您使用的是macOS系統,可以直接執行Ollama應用程式,並確保它在背景中執行,而不是使用ollama serve命令啟動。

評估微調後的LLM

當模型下載完成後,我們會看到一個命令列介面,允許我們與模型互動。例如,試著問模型:“駱駝吃什麼?”

>>> 駱駝吃什麼?
駱駝是反芻動物,這意味著它們有四個胃室,吃高纖維的植物。在野外,駱駝通常以以下食物為食:
1. 草:它們喜歡在各種型別的草上放牧,包括高草、麥子、小麥和大麥。

注意,由於Ollama不是決定性的,因此您看到的回應可能會有所不同。

您可以使用輸入 /bye 來結束這個Ollama會話。但是,請確保在本章節的剩餘部分保持 ollama serve 命令或 Ollama 應用程式在背景中執行。

以下程式碼驗證Ollama會話是否正常執行,以便我們使用Ollama評估測試集回應:

import psutil

def check_if_running(process_name):
    running = False
    for proc in psutil.process_iter(["name"]):
        if process_name in proc.info["name"]:
            running = True
            break

內容解密:

上述程式碼定義了一個函式 check_if_running,用於檢查指定的程式是否正在執行。它使用 psutil 函式庫來迭代系統中的所有程式,並檢查程式名稱是否包含指定的字串。如果找到匹配的程式,則設定 running 變數為 True。這個函式可以用於驗證Ollama會話是否正常執行。

執行Ollama模型前檢查

在開始使用Ollama模型之前,首先需要檢查Ollama是否正在執行。這可以透過檢查ollama_running變數來實作。如果Ollama尚未啟動,則會引發一個RuntimeError,提示使用者先啟動Ollama。

ollama_running = check_if_running("ollama")

if not ollama_running:
    raise RuntimeError("Ollama not running. Launch ollama before proceeding.")
print("Ollama running:", check_if_running("ollama"))

選擇合適的Ollama模型

Ollama提供了多種模型可供選擇,包括8億引數的Llama 3模型(llama3)和3.8億引數的Phi 3模型(phi3)。選擇模型時需要考慮到機器的RAM容量,因為不同的模型對RAM的要求不同。例如,llama3模型需要約16 GB的RAM,而phi3模型只需要約8 GB的RAM。

# 選擇模型
model = "llama3"  # 或 "phi3"

使用REST API與模型互動

除了使用命令列工具外,還可以透過REST API使用Python與Ollama模型互動。以下示範瞭如何定義一個query_model函式來傳送請求給Ollama API:

import urllib.request

def query_model(prompt, model="llama3"):
    data = {
        "model": model,
        "messages": [{"role": "user", "content": prompt}],
        "options": {"seed": 123},
    }
    #... 傳送請求給Ollama API...

載入資料和重新定義函式

如果您已經關閉了Python會話或偏好在不同的會話中執行剩餘的程式碼,可以使用以下程式碼載入先前建立的輸入和回應資料檔案,並重新定義先前使用的format_input函式:

import json

# 載入資料
with open("data.json", "r") as f:
    data = json.load(f)

# 重新定義函式
def format_input(input_data):
    #... 函式實作...

內容解密:

以上程式碼示範瞭如何檢查Ollama是否正在執行、選擇合適的Ollama模型以及使用REST API與模型互動。同時,也展示瞭如何載入資料和重新定義函式以便在新的Python會話中繼續執行程式碼。這些步驟對於確保Ollama模型的正確使用和與之互動至關重要。

使用TQDM函式庫讀取JSON檔案並格式化輸入

import json
from tqdm import tqdm

# 定義檔案路徑
file_path = "instruction-data-with-response.json"

# 讀取JSON檔案
with open(file_path, "r") as file:
    test_data = json.load(file)

# 定義格式化輸入函式
def format_input(entry):
    """
    格式化輸入,包含指令和輸入文字。
    
    Args:
        entry (dict): 包含指令和輸入文字的字典。
    
    Returns:
        str: 格式化的輸入文字。
    """
    instruction_text = (
        f"以下是描述任務的指令。"
        f"請寫一個回應來完成請求。"
        
        f"\n\n### 指令:\n{entry['instruction']}"
    )
    
    input_text = (
        f"\n\n### 輸入:\n{entry['input']}" if entry["input"] else ""
    )
    
    return instruction_text + input_text

# 範例使用
for entry in tqdm(test_data):
    formatted_input = format_input(entry)
    print(formatted_input)

內容解密:

上述程式碼使用TQDM函式庫讀取JSON檔案並格式化輸入。首先,定義檔案路徑和讀取JSON檔案。然後,定義格式化輸入函式,該函式接受一個字典作為輸入,包含指令和輸入文字。函式傳回格式化的輸入文字,包含指令和輸入文字。最後,範例使用迴圈讀取JSON檔案中的每個專案,格式化輸入,並列印結果。

圖表翻譯:

  flowchart TD
    A[開始] --> B[讀取JSON檔案]
    B --> C[定義格式化輸入函式]
    C --> D[範例使用]
    D --> E[列印結果]

上述Mermaid圖表描述了程式碼的流程。首先,開始讀取JSON檔案。然後,定義格式化輸入函式。接下來,範例使用迴圈讀取JSON檔案中的每個專案,格式化輸入,並列印結果。

HTTP 請求與 JSON 處理

在進行 HTTP 請求和 JSON 處理時,我們需要確保正確地構建請求、傳送請求以及解析回應。以下是相關步驟的詳細解釋:

建立 HTTP 請求

首先,我們需要建立一個 HTTP 請求物件。這個物件包含了我們想要存取的 URL、請求方法(如 GET 或 POST)、以及任何需要傳送的資料。

import urllib.request
import json

url = "https://example.com/api/endpoint"
payload = {"key": "value"}  # 範例資料

# 將字典轉換為 JSON 格式的字串
payload_json = json.dumps(payload)

# 建立請求物件
request = urllib.request.Request(
    url,
    data=payload_json.encode("utf-8"),  # 將 JSON 字串編碼為 bytes
    method="POST"
)

# 設定 Content-Type 標頭為 application/json
request.add_header("Content-Type", "application/json")

傳送請求並處理回應

接下來,我們傳送請求並讀取伺服器的回應。

response_data = ""

with urllib.request.urlopen(request) as response:
    while True:
        line = response.readline().decode("utf-8")
        if not line:
            break

        # 將 JSON 格式的回應解析為 Python 字典
        response_json = json.loads(line)
        response_data += response_json["message"]["content"]

return response_data

使用 query_model 函式

假設我們已經定義了一個 query_model 函式,用於向模型傳送查詢並取得回應。以下是如何使用它的示例:

model = "llama3"
query = "What do Llamas eat?"
result = query_model(query, model)

print(result)

這將輸出有關羊駝飲食的資訊,展示瞭如何使用 query_model 函式與模型進行互動。

評估模型回應

最後,我們可以根據給定的測試集回應,在 0 到 100 的範圍內評估玄貓的回應品質。這涉及到比較模型生成的回應與參考回應之間的相似度和相關性。

def evaluate_response(response, reference_response):
    # 根據需要實作評估邏輯,例如計算兩個字串之間的相似度
    similarity = calculate_similarity(response, reference_response)
    score = int(similarity * 100)  # 將相似度轉換為 0 到 100 的分數
    return score

# 範例使用
response = query_model("What do Llamas eat?", "llama3")
reference_response = "Llamas are ruminant animals, which means they have a four-chambered stomach that allows them to digest plant-based foods."
score = evaluate_response(response, reference_response)
print(f"評估分數:{score}")

這個示例展示瞭如何評估模型生成的回應品質,並根據參考回應給出一個分數。

運用POST方法與設定標頭

在進行網路請求時,需要使用POST方法來傳送資料,並設定必要的標頭以確保請求的正確性。以下是相關步驟的描述:

設定標頭

為了確保請求的正確性,需要設定適當的標頭。這些標頭可以包含如內容型別(Content-Type)等資訊,以便伺服器正確地處理請求。

傳送請求與捕捉回應

使用POST方法傳送請求後,需要捕捉伺服器的回應。這個回應可能包含伺服器對請求的處理結果、錯誤訊息等資訊。

內容解密:

import requests

def send_post_request(url, data, headers):
    try:
        response = requests.post(url, json=data, headers=headers)
        response.raise_for_status()  # 引發異常如果HTTP請求傳回了錯誤狀態碼
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"請求異常:{e}")
        return None

# 範例使用
url = "https://example.com/api/endpoint"
data = {"key": "value"}
headers = {"Content-Type": "application/json"}

response_data = send_post_request(url, data, headers)
if response_data is not None:
    print("伺服器回應:", response_data)

在上述程式碼中,send_post_request函式使用requests函式庫來傳送POST請求,並設定了必要的標頭和資料。函式會捕捉伺服器的回應,並傳回回應的JSON資料。如果發生請求異常,函式會列印錯誤訊息並傳回None

圖表翻譯:

  sequenceDiagram
    participant 客戶端
    participant 伺服器
    客戶端->>伺服器: 傳送POST請求
    伺服器->>客戶端: 回應處理結果

此Mermaid圖表描述了客戶端和伺服器之間的POST請求和回應過程。客戶端傳送POST請求給伺服器,伺服器接收請求並進行處理,然後回應處理結果給客戶端。

從技術架構視角來看,大語言模型(LLM)的應用與評估涉及到複雜的流程,涵蓋資料準備、模型訓練、效能評估以及與實際應用場景的整合。本文深入探討了指令微調、資料批次處理、評估指標等關鍵技術環節,並以Llama 3 和 Phi 3 模型在 Ollama 應用程式中的實際操作為例,展現瞭如何利用開源工具鏈進行 LLM 的評估和佈署。

分析 Ollama 的 REST API 與 Python 程式碼的整合方式,可以發現,透過標準化的介面和程式函式庫,開發者能更有效率地操作和評估 LLM。然而,模型的效能評估仍存在挑戰,例如評估指標的選擇、評估資料集的建構以及評估結果的可解釋性等。此外,LLM 的本地佈署和執行需要一定的硬體資源,這也限制了其在資源受限環境下的應用。

展望未來,隨著模型架構的持續最佳化和硬體效能的提升,LLM 的應用門檻將逐步降低。同時,更精細的評估指標和更自動化的評估工具也將不斷湧現,進一步推動 LLM 在各個領域的落地應用。預計 LLM 與其他技術的融合,例如知識圖譜、強化學習等,將催生更多創新應用場景。

玄貓認為,LLM 的發展仍處於快速迭代階段,開發者應密切關注技術趨勢,積極探索最佳實踐,才能充分發揮 LLM 的潛力,並將其轉化為實際的商業價值。對於資源有限的團隊,建議優先探索根據開源模型和工具的解決方案,並專注於特定領域的應用,以最大化效益。