大語言模型(LLM)和嵌入模型的統一調用接口

ChatModelFactory、EmbeddingModelFactory

講解代碼:import os
from dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv())from langchain_openai import ChatOpenAI, OpenAIEmbeddings, AzureChatOpenAI, AzureOpenAIEmbeddingsclass ChatModelFactory:model_params = {"temperature": 0,"seed": 42,}@classmethoddef get_model(cls, model_name: str, use_azure: bool = False):if "gpt" in model_name:if not use_azure:return ChatOpenAI(model=model_name, **cls.model_params)else:return AzureChatOpenAI(azure_deployment=model_name,api_version="2024-05-01-preview",**cls.model_params)elif model_name == "deepseek":# 換成開源模型試試# https://siliconflow.cn/# 一個 Model-as-a-Service 平臺# 可以通過與 OpenAI API 兼容的方式調用各種開源語言模型。return ChatOpenAI(model="deepseek-ai/DeepSeek-V2-Chat",  # 模型名稱openai_api_key=os.getenv("SILICONFLOW_API_KEY"),  # 在平臺注冊賬號后獲取openai_api_base="https://api.siliconflow.cn/v1",  # 平臺 API 地址**cls.model_params,)@classmethoddef get_default_model(cls):return cls.get_model("gpt-3.5-turbo")class EmbeddingModelFactory:@classmethoddef get_model(cls, model_name: str, use_azure: bool = False):if model_name.startswith("text-embedding"):if not use_azure:return OpenAIEmbeddings(model=model_name)else:return AzureOpenAIEmbeddings(azure_deployment=model_name,openai_api_version="2024-05-01-preview",)else:raise NotImplementedError(f"Model {model_name} not implemented.")@classmethoddef get_default_model(cls):return cls.get_model("text-embedding-ada-002")

以下是這段代碼的逐層解析,該代碼實現了大語言模型(LLM)和嵌入模型的統一調用接口,支持多種云服務和開源模型:


一、環境初始化

import os
from dotenv import load_dotenv, find_dotenv# 加載.env文件中的環境變量
_ = load_dotenv(find_dotenv())
  • 關鍵技術
    • dotenv庫自動尋找項目根目錄下的.env文件(包括上級目錄)
    • 將環境變量(如API Key)注入系統環境變量
  • 典型.env內容
    OPENAI_API_KEY = "sk-xxx"
    AZURE_OPENAI_KEY = "azure-xxx"
    SILICONFLOW_API_KEY = "sf-xxx"
    

二、聊天模型工廠(ChatModelFactory)

1. 基礎配置
class ChatModelFactory:model_params = {"temperature": 0,  # 控制生成隨機性(0=確定性最高)"seed": 42,        # 固定隨機種子保證可復現性}
  • 核心參數
    • temperature: 影響生成多樣性(0為最保守,1為最隨機)
    • seed: 確保相同輸入得到相同輸出(對測試和調試至關重要)
2. 模型選擇邏輯
@classmethod
def get_model(cls, model_name: str, use_azure: bool = False):# OpenAI官方服務if "gpt" in model_name:if not use_azure:return ChatOpenAI(model=model_name, **cls.model_params)else:return AzureChatOpenAI(azure_deployment=model_name,  # Azure部署名稱api_version="2024-05-01-preview",  # 最新API版本**cls.model_params)# 第三方開源模型平臺elif model_name == "deepseek":return ChatOpenAI(model="deepseek-ai/DeepSeek-V2-Chat",openai_api_key=os.getenv("SILICONFLOW_API_KEY"),openai_api_base="https://api.siliconflow.cn/v1",**cls.model_params,)
  • 多服務支持

    服務類型適用場景關鍵參數
    OpenAI官方直接使用OpenAI的APImodel="gpt-3.5-turbo"
    Azure OpenAI企業級Azure云服務azure_deployment
    SiliconFlow平臺調用DeepSeek等國產開源模型自定義API Base URL
  • 設計亮點

    • 統一接口:不同服務使用相同調用方式(均繼承自BaseChatModel
    • 無縫切換:通過use_azure布爾參數切換云服務商
    • 開箱即用:預置最新API版本(2024-05-01-preview
3. 默認模型配置
@classmethod
def get_default_model(cls):return cls.get_model("gpt-3.5-turbo")
  • 最佳實踐:將gpt-3.5-turbo設為默認模型(性價比與性能平衡)

三、嵌入模型工廠(EmbeddingModelFactory)

1. 模型分發邏輯
class EmbeddingModelFactory:@classmethoddef get_model(cls, model_name: str, use_azure: bool = False):if model_name.startswith("text-embedding"):if not use_azure:return OpenAIEmbeddings(model=model_name)else:return AzureOpenAIEmbeddings(azure_deployment=model_name,openai_api_version="2024-05-01-preview",)else:raise NotImplementedError(f"Model {model_name} not implemented.")
  • 模型識別:通過text-embedding前綴判斷為嵌入模型
  • 服務兼容性
    • OpenAI:直接指定模型名稱(如text-embedding-ada-002
    • Azure:使用部署名稱(需與Azure門戶中的部署名一致)
2. 默認配置
@classmethod
def get_default_model(cls):return cls.get_model("text-embedding-ada-002")
  • 行業標準text-embedding-ada-002是OpenAI最常用的嵌入模型

四、關鍵技術點解析

1. 環境變量管理
  • 安全實踐:通過.env文件隔離敏感信息
  • 多平臺支持
    # SiliconFlow示例
    openai_api_key=os.getenv("SILICONFLOW_API_KEY")
    openai_api_base="https://api.siliconflow.cn/v1" 
    
    即使使用非OpenAI服務,也復用openai_前綴的參數名,保持接口統一
2. 工廠模式優勢
優勢具體體現
解耦合業務代碼無需關心模型初始化細節
擴展性新增模型只需修改工廠類
配置集中化所有模型參數在單個類中管理
3. 多云服務兼容
# Azure的特殊參數
AzureChatOpenAI(azure_deployment="gpt-35-turbo",  # 部署名稱(可能與模型名不同)api_version="2024-05-01-preview"   # 必須指定
)
  • 注意差異:Azure的部署名稱可能與OpenAI模型名稱不同(如gpt-35-turbo對應OpenAI的gpt-3.5-turbo

五、使用示例

1. 基礎調用
# 獲取默認聊天模型
chat_model = ChatModelFactory.get_default_model()# 獲取Azure版嵌入模型
embed_model = EmbeddingModelFactory.get_model("text-embedding-ada-002", use_azure=True
)
2. 完整工作流
from langchain.schema import HumanMessage# 初始化模型
model = ChatModelFactory.get_model("gpt-4", use_azure=False)# 執行對話
messages = [HumanMessage(content="你好!")]
response = model.invoke(messages)
print(response.content)

六、擴展建議

1. 添加新模型支持
# 在ChatModelFactory中添加
elif model_name == "moonshot":return ChatOpenAI(model="moonshot-v1",openai_api_key=os.getenv("MOONSHOT_API_KEY"),openai_api_base="https://api.moonshot.cn/v1",**cls.model_params)
2. 動態參數配置
# 允許運行時修改參數
@classmethod
def get_model(cls, model_name: str, **kwargs):params = {**cls.model_params, **kwargs}return ChatOpenAI(model=model_name, **params)
3. 錯誤處理增強
try:return AzureChatOpenAI(...)
except AuthenticationError as e:print("Azure認證失敗,請檢查API Key和部署名稱")

七、架構圖示

User Code
ChatModelFactory
EmbeddingModelFactory
OpenAI
Azure
SiliconFlow
text-embedding-ada-002
Azure Embedding

該代碼為構建多模型AI應用提供了標準化基礎設施,開發者可以通過簡單的參數切換實現:

  • 不同云服務商之間的遷移
  • 開源模型與商業模型的混合使用
  • 嵌入模型與對話模型的協同工作

@Classmethod

@classmethod 是 Python 中一個重要的裝飾器,用于定義類方法。它的核心作用是為類提供一種不依賴實例卻能操作類本身或類層級數據的途徑。以下是逐層解析:


一、核心特性

1. 方法簽名
class MyClass:@classmethoddef my_method(cls, arg1, arg2):  # 第一個參數必須是類本身(慣例命名為`cls`)pass
  • cls參數:自動接收當前類(而非實例)作為第一個參數
  • 調用方式:可通過類名.方法名()實例.方法名()調用
2. 與普通實例方法的對比
方法類型第一個參數可訪問內容典型用途
實例方法self實例屬性/方法操作實例級數據
類方法cls類屬性/其他類方法工廠模式、類配置操作

二、核心應用場景

1. *工廠模式(核心代碼中的用法)
class ChatModelFactory:@classmethoddef get_model(cls, model_name: str):  # 不創建實例即可獲取模型if model_name == "gpt":return cls._create_openai_model()else:return cls._create_custom_model()# 直接通過類調用
model = ChatModelFactory.get_model("gpt")
  • 優勢:無需實例化工廠類即可創建目標對象
  • 擴展性:子類可重寫方法改變創建邏輯
2. 替代構造函數
class Date:def __init__(self, year, month, day):self.year = year@classmethoddef from_string(cls, date_str):  # 接受不同格式的輸入year, month, day = map(int, date_str.split("-"))return cls(year, month, day)  # 調用主構造函數# 使用示例
date = Date.from_string("2023-08-01")
3. 類狀態管理
class Counter:_count = 0@classmethoddef increment(cls):cls._count += 1  # 修改類屬性@classmethoddef get_count(cls):return cls._count  # 讀取類屬性Counter.increment()
print(Counter.get_count())  # 輸出: 1

三、繼承場景下的行為

class Animal:@classmethoddef identify(cls):print(f"I am {cls.__name__}")class Dog(Animal):passAnimal.identify()  # 輸出: I am Animal
Dog.identify()     # 輸出: I am Dog  🐛 cls自動指向實際調用類
  • 多態性:子類調用父類方法時,cls指向子類
  • 應用價值:實現繼承鏈中的工廠方法

四、與 @staticmethod 的對比

特性@classmethod@staticmethod
第一個參數自動傳入類 (cls)無自動參數
訪問類屬性? 可直接通過cls訪問? 需通過類名硬編碼訪問
調用其他類方法? 可通過cls.method()? 需硬編碼類名
典型應用場景需要類引用的操作工具函數
代碼示例對比
class Utilities:@classmethoddef class_util(cls):print(f"Called from {cls.__name__}")@staticmethoddef static_util():print("Generic utility")class SubUtilities(Utilities):passSubUtilities.class_util()  # 輸出: Called from SubUtilities
SubUtilities.static_util() # 輸出: Generic utility

五、在示例代碼中的作用

class ChatModelFactory:model_params = {"temperature": 0}  # 類屬性@classmethoddef get_model(cls, model_name: str):return ChatOpenAI(**cls.model_params)  # 通過cls訪問類屬性
  1. 統一配置管理:通過cls.model_params確保所有方法使用相同配置
  2. 無需實例化:直接ChatModelFactory.get_model()調用
  3. 擴展性:子類可重寫model_params改變默認參數

六、最佳實踐原則

  1. 優先用于工廠方法:當需要創建類實例但需封裝復雜邏輯時
  2. 避免濫用:不需要訪問類狀態時使用@staticmethod
  3. 命名規范:始終將第一個參數命名為cls(非強制但強烈建議)
  4. 繼承友好設計:通過cls實現多態,而非硬編碼類名

掌握 @classmethod 的使用,能大幅提升面向對象代碼的靈活性和可維護性,尤其在需要類層級操作而非實例層級操作的場景下表現出色。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72833.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Linux開發板中使用.NET實現音頻開發

本文將以Linux開發板為基礎,使用ALSA音頻框架和C#語言,演示如何實現基礎的音頻錄制與播放功能。 1. 背景 音頻處理是嵌入式開發中常見的需求,無論是語音交互、環境監測還是多媒體應用都離不開音頻模塊的支持。在Linux系統中,ALSA…

Windows控制臺函數:控制臺輸出函數WriteConsoleA()

目錄 什么是 WriteConsoleA? 函數簽名 參數詳解 返回值 一個最簡單的例子 跟 ReadConsoleA 對比 再試一個有趣的例子 為什么傳地址給 lpNumberOfCharsWritten? 注意事項 什么是 WriteConsoleA? WriteConsoleA 是一個 Windows API 函…

【貪心算法】將數組和減半的最小操作數

1.題目解析 2208. 將數組和減半的最少操作次數 - 力扣(LeetCode) 2.講解算法原理 使用當前數組中最大的數將它減半,,直到數組和減小到一半為止,從而快速達到目的 重點是找到最大數,可以采用大根堆快速達到…

Prompt engineering設計原則

目錄 一、清晰具體的prompt1. 使用分隔符2. 結構化的輸出(JSON)3. 要求模型檢查是否滿足條件4. 提供少量案例 二、給模型時間去思考1.指定完成任務所需的步驟2. 指導模型在下結論之前找出一個自己的解法 一、清晰具體的prompt 一個合理的prompt設計決定…

Vue 過濾器 filter(s) 的使用

即過濾器是用來格式化數據的一個函數。過濾器不會修改原始數據,它的作用是過濾數據,就是對數據進行加工處理并返回處理后的數據,比如做一些數據格式上的修改,狀態轉換等。 過濾器分為兩種 組件內的過濾器(組件內有效) 全局過濾器…

ESP8266UDP透傳

1. 配置 WiFi 模式 ATCWMODE3 // softAPstation mode 響應 : OK 2. PC 連?入 ESP8266 softAP 就是連接wifi 3.查詢ESP8266設備的IP地址 ATCIFSR 響應: CIFSR: APIP, "192.168.4.1" CIFSR: APMAC, "1a: fe: 34: a5:8d: c6" CIFSR: STAIP, "192.…

高效運行 QwQ-32B + 錯誤修復

文章目錄 QwQ-32B 錯誤修復?? 官方推薦設置👍 推薦的 llama.cpp 設置📖 教程:運行和修復的 QwQ-32B1、對于 llama.cpp 及使用 llama.cpp 的引擎:2、下載模型 測試3、測試/評估4、嘗試不使用我們的修復方案: &#x…

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). )

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). ) 題目大意: 在這個交互式問題中,你需要通過查詢系統,逐步找出隱藏的位字符串 S。給定一個偶數 n,表示目標位字符串 S 的長度,你需要通…

Leetcode 刷題記錄 06 —— 矩陣

本系列為筆者的 Leetcode 刷題記錄,順序為 Hot 100 題官方順序,根據標簽命名,記錄筆者總結的做題思路,附部分代碼解釋和疑問解答。 目錄 01 矩陣置零 方法一:標記數組 方法二:兩個標記變量 02 螺旋矩陣…

Java【網絡原理】(3)網絡編程續

目錄 1.前言 2.正文 2.1ServerSocket類 2.2Socket類 2.3Tcp回顯服務器 2.3.1TcpEchoServer 2.3.2TcpEchoClient 3.小結 1.前言 哈嘍大家好,今天繼續進行計算機網絡的初階學習,今天學習的是tcp回顯服務器的實現,正文開始 2.正文 在…

C++11新特性 8.final關鍵字、override關鍵字

一.final 用法: 1.修飾函數 只能修飾虛函數,阻止子類重寫這個函數,final關鍵字寫在函數名的后面。 即該虛函數不可以再被重寫。 注意:一般不會在基類中使用,不然沒有意義,因為只能修飾虛函數。 2.修飾…

Python實現網絡通信:Socket模塊與TCP/IP協議全解析

Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

click house擴容方案

《ClickHouse擴容方案解析》 當我們談論數據庫的時候,尤其是像ClickHouse這樣專為處理大規模數據分析而設計的列式存儲數據庫時,擴容是一個不可避免的話題。隨著數據量的增長和查詢復雜度的提升,原有的硬件資源可能不足以支撐高效的查詢響應…

【AGI】智譜開源2025:一場AI技術民主化的革命正在到來

智譜開源2025:一場AI技術民主化的革命正在到來 引言:開源,一場技術平權的革命一、CogView4:中文AI生成的里程碑1. 破解漢字生成的“AI魔咒”2. 開源協議與生態賦能 二、AutoGLM:人機交互的范式躍遷1. 自然語言驅動的跨…

java8中young gc的垃圾回收器選型,您了解嘛

在 Java 8 的 Young GC(新生代垃圾回收)場景中,對于 ToC的場景,即需要盡可能減少垃圾回收停頓時間以滿足業務響應要求的場景,以下幾種收集器各有特點,通常 Parnew和 G1 young表現較為出色,下面詳…

【數學 矩陣快速冪】P7108 移花接木|普及+

本文涉及知識點 數學 移花接木 題目背景 遙遠的圣地生長著一棵不為人知的靈樹,或有萬山之高。 但有一日,藏匿于根系的腐朽力量爆發,靈樹已無法支撐往日屹立沖天的高度。 題目描述 靈樹最初的形態可以看作一棵高度為 10 10 10 10 {10}…

2025-03-09 學習記錄--C/C++-PTA 習題10-7 十進制轉換二進制

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 裁判測試程序樣例&#xff1a; #include <stdio.h>void dectobin( int n );int main() {int n;scanf(…

前端 | CORS 跨域問題解決

問題&#xff1a;Access to fetch at http://localhost:3000/save from origin http://localhost:5174 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the request…

fastapi房產銷售系統

說明&#xff1a; 我希望用fastapi寫幾個接口&#xff0c;查詢房產交易系統的幾條數據&#xff0c;然后在postman里面測試 查詢客戶所有預約記錄&#xff08;含房源信息&#xff09;需要對應銷售經理查詢客戶所有訂單&#xff08;含房源信息&#xff09;統計銷售經理名下所有房…

導軌式ARM工業控制器:組態軟件平臺的“神經中樞”

工業自動化領域&#xff0c;組態軟件平臺扮演著至關重要的角色。它不僅是工業控制系統的“大腦”&#xff0c;更是實現智能化、高效化生產的關鍵工具。而作為組態軟件平臺的硬件支撐&#xff0c;導軌式ARM工控機&#xff08;以下簡稱“工控機”&#xff09;憑借其緊湊的設計、強…