山东大源建设集团网站/seo网站关键词优化怎么做

山东大源建设集团网站,seo网站关键词优化怎么做,南靖企业网站建设公司,深圳做网站需要多少费用ChatModelFactory、EmbeddingModelFactory 讲解代码:import os from dotenv import load_dotenv, find_dotenv_ load_dotenv(find_dotenv())from langchain_openai import ChatOpenAI, OpenAIEmbeddings, AzureChatOpenAI, AzureOpenAIEmbeddingsclass ChatModelF…

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.mzph.cn/diannao/72833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Linux开发板中使用.NET实现音频开发

本文将以Linux开发板为基础,使用ALSA音频框架和C#语言,演示如何实现基础的音频录制与播放功能。 1. 背景 音频处理是嵌入式开发中常见的需求,无论是语音交互、环境监测还是多媒体应用都离不开音频模块的支持。在Linux系统中,ALSA…

【贪心算法】将数组和减半的最小操作数

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.正文 在…

click house扩容方案

《ClickHouse扩容方案解析》 当我们谈论数据库的时候,尤其是像ClickHouse这样专为处理大规模数据分析而设计的列式存储数据库时,扩容是一个不可避免的话题。随着数据量的增长和查询复杂度的提升,原有的硬件资源可能不足以支撑高效的查询响应…

【数学 矩阵快速幂】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…

导轨式ARM工业控制器:组态软件平台的“神经中枢”

工业自动化领域&#xff0c;组态软件平台扮演着至关重要的角色。它不仅是工业控制系统的“大脑”&#xff0c;更是实现智能化、高效化生产的关键工具。而作为组态软件平台的硬件支撑&#xff0c;导轨式ARM工控机&#xff08;以下简称“工控机”&#xff09;凭借其紧凑的设计、强…

25年携程校招社招求职能力北森测评材料计算部分:备考要点与误区解析

在求职过程中&#xff0c;能力测评是筛选候选人的重要环节之一。对于携程这样的知名企业&#xff0c;其能力测评中的材料计算部分尤为关键。许多求职者在备考时容易陷入误区&#xff0c;导致在考试中表现不佳。本文将深入解析材料计算部分的实际考察方向&#xff0c;并提供针对…

RuoYi框架添加自己的模块(学生管理系统CRUD)

RuoYi框架添加自己的模块&#xff08;学生管理系统&#xff09; 框架顺利运行 首先肯定要顺利运行框架了&#xff0c;这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…

2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB

一、山羊优化算法 山羊优化算法&#xff08;Goat Optimization Algorithm, GOA&#xff09;是2025年提出的一种新型生物启发式元启发式算法&#xff0c;灵感来源于山羊在恶劣和资源有限环境中的适应性行为。该算法旨在通过模拟山羊的觅食策略、移动模式和躲避寄生虫的能力&…

博弈论算法

一、减法游戏 初始有一个数 n。 两个玩家轮流操作&#xff0c;每次可以减去 1 到 9 之间的任意整数。 将数减到 0 的玩家获胜。 可以发现规律&#xff1a; 减法游戏只需要判断当前数取模是否为0&#xff0c;即可快速判断胜负。 例题&#xff1a; Leetcode 292. Nim 游戏 …

Excel·VBA江西省预算一体化工资表一键处理

每月制作工资表导出为Excel后都需要调整格式&#xff0c;删除0数据的列、对工资表项目进行排序、打印设置等等&#xff0c;有些单位还分有“行政”、“事业”2个工资表就需要操作2次。显然&#xff0c;这种重复操作的问题&#xff0c;可以使用VBA代码解决 目录 代码使用说明1&a…

嵌入式学习笔记-卡尔曼滤波,PID,MicroPython

文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型&#xff08;预测系统状态&#xff09;2. 观测模型&#xff08;预测测量值&#xff09; 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…