AITopicGenerator 类——生成器实例化
def __init__(self, model: str = None):
# 优先使用传入的模型名称,否则从环境变量或默认值中获取
self.model = model or get_env("AI_MODEL", "Qwen/Qwen3-235B-A22B-Instruct-2507")
self.base_url = get_env("AI_BASE_URL", "https://api.deepinfra.com/v1/openai")
self.api_key = get_env("AI_API_KEY", "50fqnVQzRpEvaHJLKGTMLlEaaxvu5QAP")
# 强行设置 NO_PROXY 环境变量,防止本地代理服务拦截内部/API请求
import os, httpx
os.environ["NO_PROXY"] = "localhost,127.0.0.1"
# 初始化 OpenAI SDK 客户端(配置自定义 Base URL 和 HTTP 客户端设置)
self.client = OpenAI(
base_url=self.base_url,
api_key=self.api_key,
http_client=httpx.Client(trust_env=False) # trust_env=False 禁用系统代理配置
)
# 读取同级目录下 config/topic_page.txt 作为系统 Prompt
prompt_file = Path(__file__).resolve().parent / "config" / "topic_page.txt"
self.system_prompt = prompt_file.read_text(encoding='utf-8')
它的核心职责是:在生成器实例化时,完成“AI 大模型客户端配置”、“网络代理绕过”以及“系统提示词(System Prompt)加载”三大准备工作。
def __init__(self, model: str = None):
它的含义是:“当你在创建一个 AITopicGenerator 类的实例对象时,允许你传入一个可选的模型名称参数 model。如果你不传,默认值就是 None。”
__init__:
Python 的内置魔术方法(Magic Method)。每当你使用类名创建对象(例如 generator = AITopicGenerator())时,Python 会自动首先运行这个函数。
self:
代表当前创建的这个实例对象自己。通过 self.model 或 self.client,可以把变量挂载到这个对象上,方便类里的其他函数(如 call_ai)共享使用。
model: str:
类型提示(Type Hint),意思是建议传入的 model 参数应该是字符串(string)类型(如 “gpt-4o”)。这有助于代码编辑器的智能补全和静态检查。
= None:
默认参数值。这意味着 model 是一个可选参数,在实例化类时可以传,也可以不传。
self.model = model or get_env("AI_MODEL", "Qwen/Qwen3-235B-A22B-Instruct-2507")
它的核心含义是:“如果外部传入了 model 参数,就优先使用传入的值;如果没有传(即 model 为 None 或空),就去读取系统环境变量 AI_MODEL;如果连环境变量也没配置,最后兜底使用默认的模型名称 Qwen/Qwen3-235B-A22B-Instruct-2507。”
self.base_url = get_env("AI_BASE_URL", "https://api.deepinfra.com/v1/openai")
这行代码是设置 AI 服务的接口 API 根地址(Base URL)。
什么是 Base URL?
在调用大模型时,所有的请求(如发送提示词、获取回答)都要发送到一个指定的 HTTP 域名地址。支持 OpenAI 兼容协议 的服务商,都会提供一个类似的 Base URL。
只需在环境变量里修改 AI_BASE_URL 和 AI_API_KEY,就能随时把整个系统的 AI 大脑切到不同的服务商!
import os, httpx
os.environ["NO_PROXY"] = "localhost,127.0.0.1"
这两行代码是用来强行屏蔽本地网络代理拦截的防御性设置。
它的核心含义是:“告诉当前运行的 Python 程序,在访问本地服务器(localhost 或 127.0.0.1)时,绝对不要经过任何系统的 VPN 或代理软件。”
避免产生循环死锁/死循环报错:
当 Python 程序尝试访问本地的服务(比如本地运行的 MySQL 数据库、Redis,或者本地部署的 AI 模型 http://localhost:11434)时:
程序把发往 127.0.0.1 的本地请求,打包扔给了代理软件;
代理软件尝试把这个请求再次发给 127.0.0.1…
结果导致请求无限死循环,最终报错 ProxyError、ConnectError 或 500 Internal Server Error!
prompt_file = Path(__file__).resolve().parent / "config" / "topic_page.txt"
-
__file__
Python 的内置全局变量,代表当前正在执行的这个 .py 文件自身的相对或绝对路径(例如:scripts/generate_topics.py)。 -
Path(__file__)
来自 Python 标准库 pathlib,把普通的路径字符串包装成一个功能强大的 Path 路径对象。 -
.resolve()
解析并转为绝对路径。它会自动把相对路径解析成操作系统上的完整绝对路径(比如从 scripts/generate_topics.py 转化为 /Users/username/project/scripts/generate_topics.py),同时还会自动解析和消除软链接(Symbolic Links)。 -
.parent
获取当前文件或目录的上级父目录。
因为 Path(file).resolve() 拿到的是文件本身 (/project/scripts/generate_topics.py),加上 .parent 后,就拿到了脚本所在的文件夹路径 (/project/scripts)。
- / “config” / “topic_page.txt”(路径拼接运算符)
这是 pathlib 模块最优雅的设计!pathlib 重载了除法运算符 /,用来做路径拼接。
它的效果等同于旧式的 os.path.join(…, “config”, “topic_page.txt”)。
假定你的项目放在 Linux 服务器的 /var/www/my_project/ 目录下,那么代码计算过程如下:
1. __file__ ──► "scripts/generate_topics.py"
2. Path(__file__).resolve() ──► "/var/www/my_project/scripts/generate_topics.py"
3. .parent ──► "/var/www/my_project/scripts"
4. / "config" / "topic_page.txt" ──► "/var/www/my_project/scripts/config/topic_page.txt"
用 pathlib 的 / 运算符,Python 会根据操作系统自动使用正确的斜杠,避免跨平台运行时出现路径乱码。
self.system_prompt = prompt_file.read_text(encoding='utf-8')
这行代码的作用是:以 UTF-8 编码读取上一步定位到的 topic_page.txt 文件里的全部文本内容,并将其保存到当前对象的 self.system_prompt 属性中。
prompt_file.read_text(...)
read_text() 是 Python pathlib.Path 对象自带的便利方法。它会自动执行:打开文件 (open) →\rightarrow→ 读取全部文本 (read) →\rightarrow→ 自动关闭文件 (close)。相比于传统写法的 f = open(…); text = f.read(); f.close(),用 read_text() 只需要一行代码,并且完全不用担心因忘记关闭文件而导致的文件句柄泄漏。- encoding=‘utf-8’(非常关键的参数)
为什么必须显式指定 encoding=‘utf-8’?如果省略这个参数,Python 会使用操作系统默认的编码来读取文件:在 Linux / macOS 上,默认通常是 utf-8(能正常读取)。在 Windows 简体中文版 上,默认往往是 gbk!如果你的 txt 文本里包含了中文、特殊 Emoji 符号或标点,不加 encoding=‘utf-8’ 就会直接抛出 UnicodeDecodeError 乱码崩溃异常。显式指定 utf-8,确保了代码在 Windows 和 Linux/Mac 环境下都能完美、一致地读取中文。 - self.system_prompt = …读取出来的文本(即提示词内容)被赋值给了当前实例对象的 self.system_prompt 属性。这样,在后续发起 AI 请求(如 call_ai 方法)时,直接传入 self.system_prompt 作为 System Message 即可。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)