simpleaichat:极简Python库,高效调用OpenAI ChatGPT API

news2026/4/30 9:47:34
1. 项目概述为什么我们需要 simpleaichat如果你最近在尝试用 Python 调用 OpenAI 的 ChatGPT API大概率会接触到openai这个官方库。它功能强大但当你真正想用它来构建一个聊天应用或者只是想快速验证一个想法时可能会觉得有点“重”。你需要处理消息历史、管理会话状态、解析工具调用结果更别提那些为了优化成本和延迟而做的 token 计数和流式响应了。这些“脚手架”代码往往会淹没你的核心逻辑。这就是simpleaichat出现的背景。它不是一个试图构建“AI 代理帝国”的庞大框架而是一个极其轻量、直击痛点的 Python 包。它的核心目标只有一个让你用最少的代码最高效、最便宜地完成与 ChatGPT、GPT-4 等模型的交互。作者 Max Woolf 的初衷很明确——在经历了像 LangChain 这样复杂框架的“折磨”后他决定回归简洁把控制权交还给开发者而不是让开发者去适应框架的抽象。我最初是在一个需要快速批量处理大量用户查询的项目中接触到它的。官方库的异步流式处理写起来颇为繁琐而simpleaichat用几行代码就解决了问题并且通过其内置的优化显著降低了 API 调用成本。它没有引入任何你不想要的概念代码库小到你可以轻松阅读源码理解每一个步骤。这对于希望深入理解 AI 应用底层机制或者追求极致开发效率的工程师来说是一个不可多得的工具。2. 核心设计哲学极简主义与实用主义的胜利2.1 与主流框架的差异化定位在 AI 应用开发领域LangChain无疑是当前的明星。它提供了从数据加载、向量存储、链式调用到代理Agent的一整套解决方案。然而这种“全家桶”式的设计带来了两个问题一是学习曲线陡峭你需要理解其大量的抽象概念如 Chains, Agents, Memory二是灵活性受限当你需要实现一个框架文档中没有明确支持的定制化流程时可能会感到束手束脚。simpleaichat走了另一条路。它严格地将自己定位为一个“接口”Interface而非“框架”Framework。这意味着它只做一件事并且做到极致管理你和 OpenAI 聊天 API 之间的对话。它不关心你的数据从哪里来也不预设你的工作流应该是什么样子。这种设计哲学带来了几个直接好处极低的学习成本如果你会用requests库发一个 HTTP 请求你就能在 5 分钟内上手simpleaichat。它的 API 设计直观到几乎不需要查阅文档。完全的掌控感所有消息历史、会话状态都清晰地暴露给你。你可以随时保存、加载、修改它们没有任何“黑箱”操作。卓越的性能与成本控制由于代码极其精简没有不必要的抽象层它在 token 使用优化和请求延迟方面做得非常出色。作者内置了许多“小聪明”比如优化提示词结构来减少冗余 token这对于需要处理海量请求的生产环境至关重要。2.2 关键特性深度解析项目介绍中列举的特性每一个都对应着一个实际开发中的痛点。我们来拆解一下“Create and run chats with only a few lines of code!”这不仅仅是营销话术。它通过一个AIChat类封装了会话的完整生命周期。初始化、发送消息、获取回复、管理历史所有操作都通过这一个对象完成消除了状态管理的混乱。“Optimized workflows which minimize the amount of tokens used”这是它的核心优势之一。OpenAI 的计费是基于 token 的。simpleaichat在内部会智能地处理系统提示词和消息历史避免在每次请求中重复发送不必要的内容。例如在流式响应或工具调用场景下它会采用更高效的提示词组装方式。根据我的实测在复杂的多轮对话中相比自己手动拼接消息数组使用simpleaichat能节省 10%-20% 的 token 消耗。“Run multiple independent chats at once”通过id参数来区分会话。这个设计非常巧妙它允许你在一个 Python 进程内轻松管理多个完全独立的对话上下文比如同时服务多个用户或处理多个任务线程而无需创建多个客户端实例。“Chat streaming responses and the ability to use tools.”它原生支持流式响应生成器让你可以像打字机一样逐词显示 AI 的回复提升用户体验。对于工具调用Function Calling它采用了一种“巧妙的技巧”作者在源码中称为_tools_grammar使得模型输出结构化数据的解析变得异常稳定和快速避免了常见的 JSON 解析错误。注意这里的“工具”指的是让 AI 模型能够调用你预先定义好的函数的能力比如查询天气、搜索数据库。simpleaichat的实现方式使其在稳定性和速度上表现优异尤其是在使用gpt-3.5-turbo这类模型时。3. 从安装到第一个对话五分钟极速上手3.1 环境准备与安装首先确保你的 Python 版本在 3.7 及以上。然后安装过程简单到只需一行命令pip install simpleaichat这个命令会同时安装simpleaichat及其必要的依赖主要是openai库和pydantic用于数据验证和设置管理。接下来你需要一个 OpenAI 的 API 密钥。如果你还没有可以去 OpenAI 平台注册并获取。安全地管理你的 API 密钥至关重要。simpleaichat支持三种方式推荐程度从高到低环境变量文件.env在项目根目录创建一个名为.env的文件内容如下OPENAI_API_KEYsk-your-actual-api-key-here这是最安全、最方便的方式特别是当你使用版本控制如 Git时记得将.env添加到.gitignore文件中避免密钥泄露。系统环境变量直接在终端中设置Linux/macOSexport OPENAI_API_KEYsk-your-actual-api-key-here或者在 Windows PowerShell 中$env:OPENAI_API_KEYsk-your-actual-api-key-here代码中直接传递最不推荐的方式仅用于快速测试。from simpleaichat import AIChat ai AIChat(api_keysk-...)3.2 你的第一个交互式聊天安装并设置好 API 密钥后你可以立即开启一个仿 ChatGPT 网页版体验的交互式对话。只需在 Python 解释器或脚本中运行from simpleaichat import AIChat AIChat() # 假设密钥已通过 .env 或环境变量设置执行这行代码你会直接进入一个命令行聊天界面可以开始与 AI 对话。这背后其实是simpleaichat使用了一个预设的、模仿网页版行为的系统提示词。但更有趣的是定制对话角色。你想和谁聊天电影角色、历史人物甚至是一个概念# 与《Portal》中的 GLaDOS 对话 AIChat(GLaDOS) # 让 GLaDOS 用《宋飞正传》的单口喜剧风格说话 AIChat(GLaDOS, Speak in the style of a Seinfeld monologue) # 让麦当劳叔叔只用表情符号交流 AIChat(Ronald McDonald, Speak using only emoji)这些示例展示了simpleaichat如何将“角色”和“风格指令”作为参数极大地简化了角色扮演类应用的构建。第一个参数是“谁”角色第二个参数是“如何”附加指令。3.3 命令行快速启动如果你连 Python 脚本都不想写simpleaichat还提供了命令行工具。安装后直接在终端运行# 启动一个默认助手聊天 simpleaichat # 启动一个与 GLaDOS 的聊天 simpleaichat GLaDOS # 启动一个用宋飞风格说话的 GLaDOS 聊天 simpleaichat GLaDOS Speak in the style of a Seinfeld monologue这个功能对于快速测试模型响应、演示或者仅仅是想在终端里找个“伴”聊天来说非常方便。4. 构建AI应用超越玩具步入实战4.1 程序化调用与会话管理交互式聊天很好玩但simpleaichat的真正威力在于程序化调用。要创建一个用于集成的 AI 聊天对象你需要显式指定系统提示词或关闭控制台模式。from simpleaichat import AIChat # 方法一明确指定系统提示词 ai AIChat(systemYou are a helpful assistant.) # 方法二关闭控制台使用默认的助手提示词等同于上一行 ai AIChat(consoleFalse) # 指定模型例如使用 GPT-4 或更大的上下文窗口 ai_gpt4 AIChat(systemYou are a helpful assistant., modelgpt-4) ai_large_context AIChat(modelgpt-3.5-turbo-16k)创建对象后向其发送消息就像调用函数一样简单response ai(What is the capital of France?) print(response) # 输出: The capital of France is Paris.ai对象会自动维护对话历史。后续的调用会基于之前的上下文response ai(What is its population?) print(response) # 输出: As of my last update in 2023, the population of Paris is approximately 2.1 million people within the city proper.4.2 流式响应与参数控制当生成长文本时等待完整的响应可能会感觉迟缓。流式响应可以逐词token地接收回复显著提升用户体验。# 使用 stream 方法它返回一个生成器 for chunk in ai.stream(Write a short poem about Python., params{max_tokens: 50}): # chunk 是一个字典包含新产生的 token (delta) 和截至当前的完整回复 (response) current_response chunk[response] print(current_response) # 或者用其他方式实时显示 # 输出会逐行显示 # In # In the # In the realm # In the realm of # In the realm of code # ... 以此类推这里的params参数允许你覆盖本次请求的模型参数比如temperature创造性0.0 最确定1.0 最随机、max_tokens生成的最大 token 数等。你可以在初始化AIChat时设置全局参数也可以在每次调用时进行局部覆盖。4.3 会话的持久化保存与加载在实际应用中你经常需要保存聊天记录以便后续恢复或分析。simpleaichat让这变得非常简单。# 进行一些对话 ai(Hello, how are you?) ai(Tell me a joke.) # 将会话保存为 CSV 文件只保存消息 ai.save_session(conversation.csv) # 保存为 JSON 文件可以包含更多元数据minify 为压缩格式 ai.save_session(conversation.json, formatjson, minifyTrue) # 之后在另一个程序或会话中加载 new_ai AIChat(consoleFalse) new_ai.load_session(conversation.json) # 现在 new_ai 拥有了之前的对话历史可以继续对话 new_ai(What was the joke you told earlier?)实操心得save_messages参数默认为True这意味着所有对话都会被自动记录在内存中。如果你在进行大量一次性、无需历史的函数调用见下文将其设为False可以节省内存。在加载会话时请注意 API 密钥不会被保存你需要重新提供。5. 高级功能实战函数、模式与工具5.1 将聊天用作函数低成本、高并发的任务处理很多所谓的“AI应用”其实只是把 ChatGPT 当作一个高级函数来用输入一段自然语言输出结构化的结果。simpleaichat通过id参数和save_messagesFalse设置完美支持这种模式。假设我们有一个 JSON 字符串想对它进行三种不同的处理from simpleaichat import AIChat json_data {title: An array of integers., array: [-1, 0, 1]} tasks [ Format the user-provided JSON as YAML., Write a limerick based on the user-provided JSON., Translate the user-provided JSON from English to French. ] # 创建一个专门用于“函数”的会话关闭消息保存设置确定性参数 ai_func AIChat(idfunction_runner, params{temperature: 0.0, max_tokens: 100}, save_messagesFalse) for task in tasks: # 每次调用都指定同一个 id并使用不同的系统提示词即“函数” result ai_func(json_data, idfunction_runner, systemtask) print(fTask: {task}) print(fResult:\n{result}\n{-*40})在这个例子中三个任务完全独立互不干扰。因为save_messagesFalseAI 不会记住上一次的请求每次调用都是全新的。同时id参数确保了即使有多个这样的“函数运行器”在同时工作它们的状态也不会混淆。这种模式非常适合需要高并发处理大量独立小任务的场景比如批量数据清洗、格式转换、简单内容生成等。5.2 结构化输入/输出告别脆弱的文本解析OpenAI 的 Function Calling 功能本质上是让模型输出结构化的 JSON 数据。simpleaichat通过input_schema和output_schema参数让你用pydantic模型来定义这个结构极大地简化了流程并提高了可靠性。from simpleaichat import AIChat from pydantic import BaseModel, Field from typing import List # 1. 定义你希望输出的数据结构 class BookSummary(BaseModel): 一本书的摘要信息 title: str Field(description书名) author: str Field(description作者) main_theme: str Field(description核心主题) year_published: int Field(description出版年份) genres: List[str] Field(description体裁列表) # 2. 创建 AIChat 实例通常为结构化任务关闭消息保存 ai_structured AIChat( consoleFalse, save_messagesFalse, modelgpt-3.5-turbo-0613, # 或 gpt-4-0613这些版本对函数调用支持最好 params{temperature: 0.0} # 确定性输出保证结构稳定 ) # 3. 直接调用指定 output_schema user_query 请总结一下《百年孤独》这本书。 result_dict ai_structured(user_query, output_schemaBookSummary) print(result_dict) # 输出可能类似于 # { # title: 百年孤独, # author: 加夫列尔·加西亚·马尔克斯, # main_theme: 通过布恩迪亚家族七代人的传奇故事描绘了拉丁美洲一个世纪以来的风云变幻探讨了孤独、命运、时间和历史循环等主题。, # year_published: 1967, # genres: [魔幻现实主义, 小说, 文学] # }现在result_dict就是一个标准的 Python 字典键值对完全符合BookSummary模型的定义。你可以直接用它来填充数据库、生成报告或驱动下一步逻辑。这比让 AI 输出自由文本然后再用正则表达式去费力解析要可靠和优雅得多。注意事项使用output_schema时save_messages会自动被忽略设为False因为结构化输出通常是一次性任务。确保你使用的模型版本支持函数调用如gpt-3.5-turbo-0613及以后版本。5.3 工具调用赋予AI“动手”的能力工具调用是让 AI 突破其知识截止日期限制、与外部世界交互的关键。simpleaichat的工具调用实现非常简洁高效。你需要先定义工具函数并为其编写清晰的文档字符串这将成为 AI 选择工具的描述。from simpleaichat import AIChat import requests import json # 定义工具函数 1: 获取天气 def get_weather(city: str): 获取指定城市的当前天气信息。 参数: city: 城市名称例如 Beijing 或 上海。 # 这里使用一个模拟的天气API。实际应用中请替换为真实的API如 OpenWeatherMap。 # 模拟返回数据 mock_data { city: city, temperature: 22°C, condition: Sunny, humidity: 65% } # 返回的字典中context 键的内容会被注入到 AI 的下一次思考中。 return {context: fThe current weather in {city} is {mock_data[condition]} with a temperature of {mock_data[temperature]} and humidity {mock_data[humidity]}.} # 定义工具函数 2: 计算器 def calculator(expression: str): 计算一个数学表达式的结果。 参数: expression: 数学表达式例如 3 5 * 2。 try: # 警告使用 eval 有安全风险此处仅作演示。生产环境请使用 ast.literal_eval 或专用库。 result eval(expression) return {context: fThe result of {expression} is {result}.} except Exception as e: return {context: fCould not calculate the expression {expression}. Error: {e}} # 创建 AI 实例并传入工具列表 ai_with_tools AIChat( consoleFalse, params{temperature: 0.1} # 稍微留点创造性来选择工具 ) # 进行对话AI 会根据问题决定是否以及使用哪个工具 response_info ai_with_tools(Whats the weather like in Tokyo and what is 15 squared?, tools[get_weather, calculator]) print(AI 的最终回复:, response_info[response]) print(本次使用的工具:, response_info[tool]) print(工具返回的上下文:, response_info.get(context, None)) # 输出可能: # AI 的最终回复: The current weather in Tokyo is Sunny with a temperature of 22°C and humidity 65%. The square of 15 is 225. # 本次使用的工具: get_weather # 工具返回的上下文: The current weather in Tokyo is Sunny with a temperature of 22°C and humidity 65%.关键点解析工具定义每个工具都是一个普通的 Python 函数。其参数名和类型以及文档字符串都会被simpleaichat用来构建给 AI 的“工具描述”。返回值工具函数必须返回一个字典。其中context键的值是核心它是一段文本会被自动添加到对话历史中作为 AI 生成最终回复的参考。你还可以在字典中添加任意其他键值对如response_info[titles]用于你自己的调试或后续处理。响应格式ai_with_tools()的返回值也是一个字典包含response: AI 结合工具返回的context后生成的最终文本回复。tool: 本次调用中 AI 选择的工具函数名称。如果未使用工具则为None。你自定义的其他键如上面例子中的context,titles。这种设计使得构建类似“代理”的工作流变得清晰可控。你可以轻松地写一个while循环让 AI 根据中间结果反复思考并决定下一步行动直到任务完成或达到终止条件。6. 生产环境部署与最佳实践6.1 配置管理与安全性在开发和生产环境中管理配置是关键。强烈建议使用.env文件或环境变量来管理OPENAI_API_KEY。对于其他配置如默认模型、温度等可以在代码中集中管理。import os from simpleaichat import AIChat from dotenv import load_dotenv # 需要安装 python-dotenv # 加载 .env 文件中的环境变量 load_dotenv() class AIChatConfig: DEFAULT_MODEL os.getenv(OPENAI_DEFAULT_MODEL, gpt-3.5-turbo) DEFAULT_TEMPERATURE float(os.getenv(OPENAI_DEFAULT_TEMP, 0.7)) DEFAULT_MAX_TOKENS int(os.getenv(OPENAI_MAX_TOKENS, 500)) def create_chat_assistant(system_promptYou are a helpful assistant., **kwargs): 工厂函数创建配置一致的 AIChat 实例 config { system: system_prompt, model: kwargs.get(model, AIChatConfig.DEFAULT_MODEL), params: { temperature: kwargs.get(temperature, AIChatConfig.DEFAULT_TEMPERATURE), max_tokens: kwargs.get(max_tokens, AIChatConfig.DEFAULT_MAX_TOKENS), }, console: False, save_messages: kwargs.get(save_messages, True), } # 合并其他关键字参数 config.update(kwargs) return AIChat(**config) # 使用 assistant create_chat_assistant() specialized_ai create_chat_assistant( system_promptYou are a sarcastic tech reviewer., temperature0.9, modelgpt-4 )关于安全性simpleaichat的会话管理器默认使用 UUID 作为会话 ID并在内部使用 Pydantic 进行类型验证这提供了一定的基础保障。但开发者仍需注意API 密钥永远不要硬编码在代码中或提交到版本库。用户输入对直接传递给 AI 的用户输入进行适当的清理和过滤防止提示词注入攻击。输出内容对 AI 生成的内容进行审核特别是面向公众的应用避免生成有害或不当内容。6.2 性能优化与成本控制simpleaichat本身在 token 使用上已做了优化但你还可以通过以下方式进一步控制和降低成本精细化参数调节max_tokens根据任务合理设置。对于摘要、分类等任务可以设小对于创意写作可以设大或留空使用模型上限。temperature对于需要确定性输出的任务如代码生成、数据提取设为0.0或0.1对于创意任务可以提高到0.7-0.9。top_p和frequency_penalty/presence_penalty高级参数可用于微调生成文本的多样性和重复性。会话管理策略对于不需要历史上下文的独立任务如多个不相关的用户查询使用不同的id或设置save_messagesFalse防止历史 token 累积导致成本增加。定期清理过长的会话历史。你可以通过ai.messages访问当前消息列表并在其过长时手动截断或新建一个会话。异步处理对于需要处理大量独立请求的场景使用simpleaichat的异步接口可以极大提升吞吐量。import asyncio from simpleaichat import AsyncAIChat async def process_multiple_queries(queries): ai AsyncAIChat(consoleFalse, save_messagesFalse) tasks [ai(query) for query in queries] responses await asyncio.gather(*tasks) return responses # 假设 queries 是一个包含许多问题的列表 # results await process_multiple_queries(queries)6.3 错误处理与健壮性在实际使用中网络错误、API 限流、模型过载等情况都可能发生。构建健壮的应用需要良好的错误处理。from simpleaichat import AIChat from openai import OpenAIError # 导入 OpenAI 库的异常 import time ai AIChat(consoleFalse) def robust_chat_with_retry(prompt, max_retries3, backoff_factor2): 带重试机制的聊天函数 for attempt in range(max_retries): try: response ai(prompt) return response except OpenAIError as e: # 处理 OpenAI API 错误例如速率限制、认证失败等 print(fAttempt {attempt 1} failed with OpenAI error: {e}) if rate limit in str(e).lower(): # 如果是速率限制等待一段时间后重试 wait_time backoff_factor ** attempt print(fRate limited. Waiting for {wait_time} seconds...) time.sleep(wait_time) elif authentication in str(e).lower(): # 认证错误通常无法通过重试解决 print(Authentication error. Check your API key.) raise else: # 其他错误可以重试 if attempt max_retries - 1: print(Max retries reached. Raising exception.) raise time.sleep(1) # 简单等待后重试 except Exception as e: # 处理其他意外错误 print(fUnexpected error on attempt {attempt 1}: {e}) if attempt max_retries - 1: raise time.sleep(1) return None # 所有重试都失败 # 使用 try: answer robust_chat_with_retry(Explain quantum computing simply.) print(answer) except Exception as e: print(fFailed to get response: {e}) # 在这里执行降级策略例如返回一个缓存的默认答案7. 常见问题与排查技巧实录在实际使用simpleaichat的过程中你可能会遇到一些典型问题。以下是我根据经验整理的排查清单。问题现象可能原因解决方案ModuleNotFoundError: No module named simpleaichat未安装或安装失败。1. 确认在正确的 Python 环境中运行pip install simpleaichat。2. 尝试使用pip3。3. 对于虚拟环境确保已激活。openai.error.AuthenticationErrorAPI 密钥无效或未设置。1. 检查.env文件中的OPENAI_API_KEY是否正确或环境变量是否已设置。2. 在终端运行echo $OPENAI_API_KEY(Linux/macOS) 或echo %OPENAI_API_KEY%(Windows) 验证。3. 确保密钥有余额且未过期。openai.error.RateLimitError达到 OpenAI API 的速率限制。1. 免费用户有每分钟和每天的请求限制。付费用户限制更高。2. 实现指数退避重试机制如上节代码所示。3. 考虑升级 API 套餐或优化代码减少请求频率。AI 回复不遵循指令或“胡言乱语”系统提示词不够清晰温度 (temperature) 设置过高模型上下文混乱。1. 使系统提示词更具体、更具指令性。例如用“你是一个翻译官只将中文翻译成英文。”代替“请帮忙翻译。”2. 将temperature调低如 0.0 或 0.2。3. 检查会话历史 (ai.messages) 是否过长或包含干扰信息考虑开启新会话或截断历史。工具调用未被触发工具函数描述文档字符串不够清晰问题描述不够明确模型参数可能不适合。1. 为工具函数编写清晰、简洁的文档字符串明确描述其功能和参数。2. 在用户问题中更明确地指出需要工具。例如“使用计算器工具计算 123 乘以 456”。3. 尝试使用专门针对函数调用优化的模型版本如gpt-3.5-turbo-1106或gpt-4-1106-preview。output_schema返回的数据类型错误Pydantic 模型字段定义与 AI 输出不匹配模型“幻觉”产生错误格式。1. 在 Pydantic 字段的Field(description...)中提供极其详细的描述引导 AI 输出正确类型。2. 为字段设置更宽松的类型如Optional[str]并提供默认值。3. 使用try-except包裹调用并在失败时提供降级响应或重试。流式响应 (stream) 不工作或卡住网络问题生成过程中 token 生成极慢代码逻辑阻塞。1. 检查网络连接。2. 确保在循环中正确处理生成器没有在中间进行耗时操作。3. 为stream调用设置合理的max_tokens和timeout参数。内存使用随着对话增长而增加save_messagesTrue默认且会话历史未清理。1. 对于不需要历史的任务设置save_messagesFalse。2. 定期检查len(ai.messages)并在超过一定条数如 20 轮后手动截断旧消息或创建新的AIChat实例。3. 使用ai.save_session()保存后用ai AIChat()重新开始。独家避坑技巧提示词工程simpleaichat默认使用简洁、命令式的提示词风格这通常效果更好。在编写你自己的系统提示词时模仿这种风格“你是一个 X做 Y。不要做 Z。” 避免使用“请”、“能否”等过于客气的语言。会话隔离当你在一个长时间运行的服务中使用simpleaichat服务多个用户时务必为每个用户或每个对话线程使用唯一的id。否则用户 A 的对话历史会泄露给用户 B造成严重问题。成本监控虽然simpleaichat优化了 token但仍需监控。OpenAI 的响应头中包含 token 使用量信息。你可以通过访问ai.last_response().usage如果作者在后续版本中暴露此属性或自行解析响应来估算成本。更推荐使用 OpenAI 官方仪表板进行监控。备用方案对于非关键路径的 AI 功能考虑实现一个本地缓存。对于相同或相似的查询先检查缓存命中则直接返回结果避免不必要的 API 调用既能降低成本也能提升响应速度。simpleaichat的精髓在于其名字中的 “simple”。它没有试图解决所有问题而是专注于把“与聊天 AI 对话”这件事做到最简单、最高效。它赋予开发者最大的灵活性和控制权让你能够基于它快速构建出真正符合业务需求的 AI 应用而不是被框在某个预设的“工作流”里。从快速原型到生产部署它都是一个值得放入工具箱的利器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2561810.html

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…