引言
大語言模型(LLM)為行業帶來變革,具備強大的生成能力,在與知識庫和檢索器等工具相結合時,能夠高效推動聊天機器人和 Agent 等高級生成式 AI(GenAI)應用的發展。與 LLMs 互動的過程中,最核心的部分是提示(prompt)。Prompt 是指用于指導這些模型執行特定任務的命令。然而,制定有效的 Prompt 是一個細致且復雜的過程,常需借助如思維鏈(Chain-of-Thought)和 ReAct 等高級技術。隨著這些技術的發展,Prompt 的復雜性日益增加。此外,即使是相同的 Prompt ,在不同的 LLM(如 GPT-4 和 Gemini)之間也可能因其預訓練方法和數據集的不同而產生差異化的結果。這一挑戰引發了業內對 Prompt 工程的研究,這是一項專注于調整和優化 Prompt 以獲得更佳和更定制化結果的勞動密集型任務。
盡管手動制作 Prompt 對于簡單的 LLM 應用效果尚可,但對于涉及多個組件的復雜 LLM 基礎設施,這一過程十分耗時。DSPy 為開發者與語言模型互動方式帶來了變革——通過引入一個可編程接口,實現了模型 Prompt 和權重的算法優化,從而幫助相關人員更高效地開發語言模型。DSPy 已支持無縫集成 Milvus 向量數據庫,通過程序化方法自動優化檢索增強生成(RAG)應用。
在接下來的部分中,我們將探討 DSPy 的本質及其操作機制,并提供一個實際示例,展示如何使用 DSPy 和 Milvus 向量數據庫構建和優化一個 RAG 應用。
什么是 DSPy?
DSPy 是由斯坦福 NLP 組推出的一種程序化框架,旨在優化語言模型中的 Prompt 和權重,這在 LLM 跨多個 pipeline 階段集成時尤其有用。它提供了各種可組合和聲明式模塊,以 Python 語法指導 LLM。
與依賴手動制作和調整提示的傳統提示工程技術不同,DSPy 學習查詢-答案示例,并模仿這一學習過程來生成為特定結果量身定做的優化提示。這種方法允許動態重組整個 pipeline,精確地針對任務的細微差別進行定制,從而免去了開發人員持續手動調整提示的麻煩。
關鍵概念和基本組件
DSPy 的自動化 Prompt 優化和模型微調部分由三個基本組件構成:簽名(Signatures)、模塊(Modules)和優化器(Optimizers,之前被稱為 Teleprompters)。
簽名(Signature)
簽名是聲明性的規范,定義了 DSPy 模塊的輸入/輸出行為,用于告訴語言模型應執行哪些任務,而不是我們應如何設置 prompt 語言模型。
一個簽名包括三個基本元素:
語言模型旨在解決的子任務的簡潔描述。
我們提供給語言模型的一個或多個輸入字段的描述(例如,輸入問題)。
我們期望從語言模型得到的一個或多個輸出字段的描述(例如,問題的答案)。
以下是一些流行的 LLM 任務的簽名示例:
問題回答:"question -> answer"
情感分類:"sentence -> sentiment"
檢索增強型問題回答:"context, question -> answer"
帶推理的多項選擇題回答:"question, choices -> reasoning, selection"
這些簽名指導 DSPy 高效地在各種模塊中協調 LLM 操作,促進 LLM 流暢且精確地執行任務。
模塊(Module)
DSPy 模塊在 LLM pipeline 中抽象了傳統的 prompting 技術。它們具有三個關鍵特性:
每個內置模塊抽象出一個特定的 prompting 技術(如 Chain of Thoughts 或 ReAct)并處理 DSPy 簽名。
DSPy 模塊具有可學習的參數,包括 prompt 組件和 LLM 權重,使它們能夠處理輸入并生成輸出。
DSPy 模塊可以組合,從而創建更大、更復雜的模塊。