新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架
图片来自于官方README.md
一、什么是OpenAI Agents SDK?
OpenAI Agents SDK是一个轻量级但功能强大的框架,专为构建多智能体工作流而设计。作为OpenAI之前实验项目Swarm的生产级升级版本,该SDK提供了极少但高效的抽象概念,使开发者能够快速搭建复杂的智能应用。
该SDK的核心理念是:足够简单易学,同时又足够强大实用。它内置了智能体循环、交接机制、安全护栏和全面的追踪功能,让开发者可以专注于应用逻辑而非底层实现。
二、核心概念
OpenAI Agents SDK主要包含四个核心概念:
- 智能体(Agents):配备了指令、工具、护栏和交接功能的大语言模型(LLM)
- 交接(Handoffs):允许智能体将控制权转移给其他智能体处理特定任务
- 护栏(Guardrails):用于输入和输出验证的可配置安全检查
- 追踪(Tracing):内置的智能体运行跟踪功能,便于查看、调试和优化工作流
值得注意的是,这个SDK与任何支持OpenAI聊天补全API格式的模型提供商兼容,不仅限于OpenAI自己的模型。
三、应用场景
OpenAI Agents SDK适用于多种场景,包括但不限于:
- 客户服务自动化:创建能够理解查询并提供准确回答的智能客服系统
- 多步骤任务处理:处理需要多个步骤或专业知识的复杂任务
- 信息检索与分析:结合搜索工具和分析能力,提供基于事实的回答
- 专业领域咨询:构建在特定领域(如法律、医疗、财务等)具有专业知识的顾问系统
- 内容创建与编辑:自动化创建和编辑文本、代码或其他内容
四、基础示例解析
1. Hello World示例
from agents import Agent, Runneragent = Agent(name="Assistant", instructions="You are a helpful assistant")result = Runner.run_sync(agent, "Write a haiku about recursion in programming.")
print(result.final_output)# 输出示例:
# Code within the code,
# Functions calling themselves,
# Infinite loop's dance.
这个简单示例展示了如何创建一个基本智能体并运行它。通过指定名称和指令,我们告诉智能体它的角色和行为方式。然后使用Runner.run_sync()
方法同步运行智能体并获取结果。
2. 交接(Handoffs)示例
from agents import Agent, Runner
import asynciospanish_agent = Agent(name="Spanish agent",instructions="You only speak Spanish.",
)english_agent = Agent(name="English agent",instructions="You only speak English",
)triage_agent = Agent(name="Triage agent",instructions="Handoff to the appropriate agent based on the language of the request.",handoffs=[spanish_agent, english_agent],
)async def main():result = await Runner.run(triage_agent, input="Hola, ¿cómo estás?")print(result.final_output)# 预期输出:¡Hola! Estoy bien, gracias por preguntar. ¿Y tú, cómo estás?if __name__ == "__main__":asyncio.run(main())
这个示例展示了智能体之间的交接功能。分流智能体(triage_agent)根据输入的语言决定将请求交给西班牙语或英语智能体处理。当收到西班牙语输入时,分流智能体会将请求交给西班牙语智能体处理。
3. 函数工具示例
import asynciofrom agents import Agent, Runner, function_tool@function_tool
def get_weather(city: str) -> str:return f"The weather in {city} is sunny."agent = Agent(name="Hello world",instructions="You are a helpful agent.",tools=[get_weather],
)async def main():result = await Runner.run(agent, input="What's the weather in Tokyo?")print(result.final_output)# 预期输出:The weather in Tokyo is sunny.if __name__ == "__main__":asyncio.run(main())
这个示例展示了如何为智能体添加工具函数。通过使用@function_tool
装饰器,我们可以轻松地将普通Python函数转换为智能体可调用的工具。当用户询问特定城市的天气时,智能体会自动调用相应的工具函数获取信息。
五、智能体循环机制
当调用Runner.run()
方法时,SDK会运行一个循环直到获得最终输出:
- 调用LLM,使用智能体上的模型、设置和消息历史
- LLM返回响应,可能包含工具调用
- 如果响应包含最终输出,返回并结束循环
- 如果响应包含交接,将智能体切换为新智能体并返回步骤1
- 处理工具调用(如果有)并添加工具响应消息,然后返回步骤1
可以使用max_turns
参数限制循环执行的次数。
最终输出的确定方式
最终输出是智能体在循环中产生的最后一个结果:
- 如果在智能体上设置了
output_type
,最终输出是LLM返回该类型数据时的结果(使用结构化输出) - 如果没有设置
output_type
(即纯文本响应),则第一个没有工具调用或交接的LLM响应被视为最终输出
六、高级功能
1. 护栏(Guardrails)
护栏允许你在用户输入上运行检查和验证,与智能体并行运行。例如,你可以筛选用户输入的相关性或安全性。
from pydantic import BaseModel
from agents import (Agent,GuardrailFunctionOutput,InputGuardrailTripwireTriggered,RunContextWrapper,Runner,TResponseInputItem,input_guardrail,
)class MathHomeworkOutput(BaseModel):is_math_homework: boolreasoning: strguardrail_agent = Agent(name="Guardrail check",instructions="Check if the user is asking you to do their math homework.",output_type=MathHomeworkOutput,
)@input_guardrail
async def math_guardrail(ctx: RunContextWrapper[None], agent: Agent, input: str | list[TResponseInputItem]
) -> GuardrailFunctionOutput:result = await Runner.run(guardrail_agent, input, context=ctx.context)return GuardrailFunctionOutput(output_info=result.final_output,tripwire_triggered=result.final_output.is_math_homework,)agent = Agent(name="Customer support agent",instructions="You are a customer support agent. You help customers with their questions.",input_guardrails=[math_guardrail],
)
这个示例创建了一个数学作业检测护栏,如果用户请求解决数学作业,护栏将触发并阻止请求被处理。
2. 上下文管理
SDK支持两类上下文:
- 本地代码上下文:在工具函数运行、回调等过程中可用的数据和依赖项
- LLM上下文:LLM在生成响应时可见的数据
使用RunContextWrapper
类和其中的context
属性可以方便地管理本地上下文:
import asyncio
from dataclasses import dataclassfrom agents import Agent, RunContextWrapper, Runner, function_tool@dataclass
class UserInfo:name: struid: int@function_tool
async def fetch_user_age(wrapper: RunContextWrapper[UserInfo]) -> str:return f"User {wrapper.context.name} is 47 years old"async def main():user_info = UserInfo(name="John", uid=123)agent = Agent[UserInfo](name="Assistant",tools=[fetch_user_age],)result = await Runner.run(starting_agent=agent,input="What is the age of the user?",context=user_info,)print(result.final_output)# 预期输出:The user John is 47 years old.if __name__ == "__main__":asyncio.run(main())
3. 多智能体协调
可以通过两种主要方式协调多个智能体:
- 通过LLM决策:利用LLM的智能进行规划、推理和决策
- 通过代码协调:通过代码确定智能体的流程
常见的代码协调模式包括:
- 使用结构化输出生成格式良好的数据
- 将一个智能体的输出转换为下一个智能体的输入
- 在评估循环中运行智能体
- 并行运行多个智能体
七、实战案例:构建智能客服系统
下面是一个完整的智能客服系统示例,包含分流、专业回答和内容安全检查:
from agents import Agent, InputGuardrail, GuardrailFunctionOutput, Runner
from pydantic import BaseModel
import asyncioclass SafetyCheckOutput(BaseModel):is_safe: boolreasoning: strguardrail_agent = Agent(name="Safety check",instructions="检查用户输入是否包含不适当内容。如果包含侮辱、威胁或其他不适当内容,请标记为不安全。",output_type=SafetyCheckOutput,
)billing_agent = Agent(name="账单专家",handoff_description="处理账单、付款和退款相关问题的专家",instructions="你是一位账单和支付专家。帮助用户解决账单查询、支付问题和退款请求。提供清晰明确的步骤指导。",
)technical_agent = Agent(name="技术支持",handoff_description="处理技术问题和故障排除的专家",instructions="你是一位技术支持专家。帮助用户解决产品使用过程中遇到的技术问题。提供详细的故障排除步骤。",
)async def safety_guardrail(ctx, agent, input_data):result = await Runner.run(guardrail_agent, input_data, context=ctx.context)final_output = result.final_output_as(SafetyCheckOutput)return GuardrailFunctionOutput(output_info=final_output,tripwire_triggered=not final_output.is_safe,)triage_agent = Agent(name="客服分流",instructions="""你是一位客服分流专家。根据用户的问题,将其转接到适当的专家:- 如果是关于账单、付款或退款的问题,转接到账单专家- 如果是关于产品使用或技术问题的,转接到技术支持- 如果是简单的一般问题,直接回答始终保持专业和友好的态度。""",handoffs=[billing_agent, technical_agent],input_guardrails=[InputGuardrail(guardrail_function=safety_guardrail),],
)async def main():print("=== 场景一:账单问题 ===")result = await Runner.run(triage_agent, "我上个月被多收费了,如何申请退款?")print(result.final_output)print("\n=== 场景二:技术问题 ===")result = await Runner.run(triage_agent, "我的账户登录不了,一直显示密码错误")print(result.final_output)print("\n=== 场景三:一般问题 ===")result = await Runner.run(triage_agent, "你们的客服热线是多少?")print(result.final_output)if __name__ == "__main__":asyncio.run(main())
这个示例构建了一个智能客服系统,包含分流智能体、账单专家和技术支持。系统还包含内容安全检查护栏,确保用户输入不包含不适当内容。分流智能体根据用户的问题性质将请求转发给适当的专家智能体处理。
八、总结与展望
OpenAI Agents SDK提供了构建复杂智能体系统所需的基础组件,同时保持了简单易用的设计理念。通过智能体、交接、护栏和追踪这四个核心概念,开发者可以轻松构建从简单到复杂的智能应用。
该SDK的主要优势在于:
- 简单清晰的API:少量抽象概念,易于学习和掌握
- 强大的扩展性:可以自定义各个组件和行为
- 内置追踪:自动记录智能体运行情况,便于调试和优化
- 模型兼容性:支持任何遵循OpenAI API格式的模型提供商
- 生产就绪:设计用于生产环境,不仅限于原型开发
随着人工智能技术的不断发展,智能体框架将在未来发挥越来越重要的作用。OpenAI Agents SDK作为一个轻量级但功能强大的框架,为开发者提供了构建下一代智能应用的工具。
无论是构建客户服务系统、智能助手还是复杂的决策系统,OpenAI Agents SDK都能提供所需的工具和抽象,帮助开发者更快地将想法转化为现实。
参考资源
- OpenAI Agents SDK 官方文档
- GitHub 仓库
- 示例目录
要开始使用,只需通过pip安装SDK并设置OpenAI API密钥即可开始构建您的第一个智能体系统。
pip install openai-agents
export OPENAI_API_KEY=sk-... # 替换为您的API密钥
相关文章:
新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架
图片来自于官方README.md 一、什么是OpenAI Agents SDK? OpenAI Agents SDK是一个轻量级但功能强大的框架,专为构建多智能体工作流而设计。作为OpenAI之前实验项目Swarm的生产级升级版本,该SDK提供了极少但高效的抽象概念,使开发…...
单例模式的五种实现方式
1、饿汉式 ①实现:在类加载的时候就初始化实例 ②优点:线程安全 ③缺点:实例在类加载的时候创建,可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…...
行为模式---状态模式
概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…...
统一 Elastic 向量数据库与 LLM 功能,实现智能查询
作者:来自 Elastic Sunile Manjee 利用 LLM 功能进行查询解析,并使用 Elasticsearch 搜索模板,将复杂的用户请求转换为结构化的、基于模式的搜索,从而实现高精度查询结果。 想象一下,你在搜索“距离 Belongil Beach 25…...
(Lauterbach调试器学习笔记)一、首次连接TriCore开发板调试
Lauterbach调试器学习笔记 文章目录 Lauterbach调试器学习笔记前言一、Lauterbach调试器介绍二、调试步骤三、常用代码四、不常用代码,但是很有意思总结 前言 第一篇简单记录一下Lauterbach调试器的使用过程,主要是想写第二篇python api。 一、Lauterba…...
HTML星球大冒险之路线图
第一章:欢迎来到 HTML 星球! 1.1 宇宙的基石:HTML 是什么? 🌍 比喻:HTML 是网页世界的「乐高积木」,用标签搭建一切可见内容🎯 目标:理解 HTML 的作用,掌握…...
网络安全与七层架构
网络安全与七层架构 随着互联网技术的迅猛发展,网络安全问题日益凸显。网络安全不仅影响到个人用户的信息安全,更是企业及国家安全的重要组成部分。而七层架构(OSI模型)为网络通信提供了理论支撑,能够有效地帮助我们理…...
2025-03-13 学习记录--C/C++-PTA 练习2-17 生成3的乘方表
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 练习2-17 生成3的乘方表 输入一个非负整数n,生成一张3的乘方表,输出3^0~$$3^n$$的值…...
改进YOLOv8系列,AAAI 2025,多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享
**论文:https://arxiv.org/pdf/2404.07846 **代码地址: https://github.com/nagejacob/TBSN/blob/main/network/tbsn.py 改进YOLOv8系列:多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享 🚀论文研究概括🚀加入到网络中的理论研究🚀需要修改的代码1 🍀🍀…...
我又又又又又又更新了~~纯手工编写C++画图,有注释~~~
再再再次感谢Ttcofee提的问题 本次更新内容: 鼠标图案(切换),版本号获取,输入框复制剪切板 提前申明:如果运行不了,请到主页查看RedpandaDevc下载,若还是不行就卸了重装。 版本号&…...
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析 一、框架演变:从Vue2到Vue3的跨越 1.1 革命性升级 Vue3的发布标志着前端框架进入新纪元,其核心改进体现在三个方面: 性能飞跃:包体积减少41%,初始…...
评委打分5个评委 去掉一个最高分和一个最低分 取平均分
一键替换max用min 按shiftF6 public static int getMin(int[]scores){int min scores[0];for (int i 0; i < scores.length; i) {if(scores[i]> min){min scores[i];}}return min;} 这里有和c/c不一样的知识点 c/c调用函数类似于java的方法,但是c/c的函数调用需要声明…...
javabean类(测试类之外的类)
altinsert快捷键生成构造方法和get、set方法 或者插件ptg(连接外网搜索插件并且下载)...
C++ 邻接矩阵(代码)
C邻接矩阵代码,见下: #include<iostream>using namespace std;#define inf -1 class Graph{ private:int vertices;int **edges;public:Graph(int vertices);~Graph();void addEdge(int u, int v, int w);void printGraph(); };Graph::Graph(int …...
Cookie与Session详解
Cookie简介 Cookie 是浏览器提供的持久化存储数据的一种机制。是指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据(通常经过加密)。以下是关于 Cookie 的详细介绍: Cookie工作原理 当你访问一个网站时,该网…...
OpenBMC:BmcWeb 处理http请求
OpenBMC:BmcWeb 读取http请求头-CSDN博客 介绍了,在读取完http头后,将调用Connection::handle处理http请求 1.Connection::handle void handle() {...req = std::make_shared<crow::Request>(parser->release(), reqEc);...req->session = userSession;accept …...
【算法题解答·六】栈队列堆
【算法题解答六】栈队列堆 接上文【算法方法总结六】栈队列堆的一些技巧和注意事项 栈队列堆相关题目如下: 232.用栈实现队列 简单 准备两个栈,一个负责入队的栈A,一个负责出队的栈B出队和返回队列开头元素,都要先进行以下操作…...
计算机视觉算法实战——手势识别(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域简介:手势识别的价值与挑战 手势识别是连接人类自然行为与数字世界的核心交互技术,在智能设备控制、…...
JobScheduler省电机制
1.前言 JobScheduler(任务调度器)是 Android 提供的一种任务调度机制,可以替代传统的 WakeLock 和 Alarm 来执行后台任务。那么,它们之间的区别是什么?JobScheduler 又有哪些特别之处呢? 1.1 WakeLock 和 …...
设计模式学习笔记——命令模式
2025年3月13日,周四下午 相同的保存逻辑在各个组件中重复出现。 且需要修改保存逻辑时,各个组件的保存逻辑都需要进行相应修改。 使用了命令模式把保存逻辑从三个组件中独立出来后,减少了代码冗余。 可以通过“保存命令”来使用保存逻辑&am…...
[TPCTF 2025] crypto 复现两题
周末很忙。比赛都没怎么看。晚上把密码复现两个。 randomized random 这题在小鸡块博客里见过,稍有区别。 # FROM python:3 import random with open("flag.txt","rb") as f:flagf.read() for i in range(2**64):print(random.getrandbits(3…...
电子元器件选型与实战应用—16 怎么选一个合适的MCU芯片?
文章目录 1. 选型要素1.1 价格1.2 技术支持1.3 厂家优势1.4 功耗1.5 特殊功能1.6 统计外设1.7 确定外设占用的内存和flash大小1.8 确定外设通信接口1.9 确定外设通信接口的电平1.10 确定外设的GPIO数量1.11 确定外设的供电和功耗1.12 确定外设GPIO的种类1.13 确定ADC的数量1.14…...
第6关:牛牛鱼缸-附加题
任务描述 本关任务:问题描述:牛牛有一个鱼缸,鱼缸里面已经有n条鱼,每条鱼的大小为fishSizei,牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸里存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼…...
go中间件学习
本博文源于笔者正在学习go中间件,罗列了较为常用的中间件,例如日志记录、认证授权、跨域资源共享、请求体解析、静态文件处理、错误处理、性能分析、速率限制、session 1、日志记录中间件 可以追加打印用,例如,将请求进行打印 …...
若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署
一.目标 在浏览器上成功登录进入 二.源码下载 后端源码:前往Gitee下载页面(https://gitee.com/dromara/RuoYi-Cloud-Plus)下载解压到工作目录。 前端源码: 前往Gitee下载页面(https://gitee.com/JavaLionLi/plus-ui)下载解压到工作目录。 文档地址&a…...
航空电动力系统适航标准要点手册
航空电动力系统适航标准要点手册 1.标准制定背景与必要性1.1 为什么需要制定和遵循标准?1.2 标准制定依据与发布机构 2.关键核心标准概述2.1 电动航空与电推进系统2.2 混合动力系统2.3 硬件与通用要求 3.标准详细解读与应用场景3.1 DO-160G:环境适应性测…...
深入理解JavaScript构造函数与原型链:从原理到最佳实践
一、开篇:为什么需要理解原型链? 在JavaScript开发中,90%以上的"诡异"bug都与原型链机制相关。理解构造函数与原型链的运行原理,不仅能帮助我们写出更优雅的代码,还能在框架源码阅读、性能优化等场景中游刃…...
java每日精进 3.12 【WebSocket进阶】
基于 SpringWebSocket 进行二次封装,实现了更加简单的使用方式。例如说,WebSocket 的认证、Session 的管理、WebSocket 集群的消息广播等等。 1. 用户认证与登录用户信息传递 1.1 Token 过滤器 (TokenAuthenticationFilter) ① 在 WebSocket 连接建立…...
国家网络安全事件应急预案
目 录 1 总则 1.1 编制目的 1.2 编制依据 1.3 适用范围 1.4 事件分级 1.5 工作原则 2 组织机构与职责 2.1 领导机构与职责 2.2 办事机构与职责 2.3 各部门职责 2.4 各省(区、市)职责 3 监测与预警 3.1 预警分级 3.2 预警监测 3.3 预警研判…...
Markdown:Mermaid 画图
目录 安装基本语法流程图时序图甘特图总结 Mermaid 是一款用于生成流程图、时序图、甘特图等图表的 JavaScript 库。它可以将简单的文本描述转化为美观的图表,方便开发者进行可视化展示。 安装 Mermaid 可以直接在浏览器中使用,也可以在 Node.js 环境中…...
【视频】ffmpeg、Nginx搭建RTMP、HLS服务器
1、源码安装Nginx 1)源码下载 因为要使用Nginx的模块nginx-rtmp-module,所以要下载 nginx 和 nginx-rtmp-module 的源码。 下载地址: http://nginx.org/en/download.html https://github.com/arut/nginx-rtmp-module/tags2)解压、配置 在同一个目录中解压 nginx 和 nginx…...
时间有限,如何精确设计测试用例?5种关键方法
精确设计测试用例能够迅速识别并修复主要缺陷,确保产品质量,降低后期维护成本,并通过专注于核心功能来提升用户体验,为项目的成功奠定坚实基础。若未能精确设计测试用例,可能会导致关键功能测试不充分,使得…...
【算法】图论
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…...
ADQ32 5G采集卡
ADQ32是一款高端12位双通道数据采集板,针对高通量科学应用进行了优化。ADQ32具有以下特性: 一个和两个模拟输入通道包括每通道5和2.5 GSPS7GB/s的持续数据传输速率至GPU7GB/秒的持续数据传输速率两个外部触发器通用输入/输出(GPIO)开放式FPG…...
机器人领域专业名词汇总
1. 电机与驱动 电机类型 DC Motor(直流电机):通过直流电源驱动的电机。Stepper Motor(步进电机):通过脉冲信号控制旋转角度的电机。Servo Motor(伺服电机):带有反馈控制的…...
拆解 “ES 已死“ 伪命题:Agentic RAG 时代搜索引擎的终极形态
作者:来自 Elastic 李捷 xxx:“ES已死,#%#……” 我:??? 最近,某厂商发了一堆公关文章,翻来覆去地炒作 “ES 已死”,“放弃 ES”。这哪是什么正经的技术文章&…...
eNSP中路由器的CON/AUX接口、GE Combo接口、Mini USB接口、USB接口、WAN侧uplink接口、FE接口、GE接口介绍
路由器常见接口的详细介绍及其应用示例: 1. CON/AUX 接口 全称:Console/Auxiliary(控制台/辅助接口)作用: CON(Console):通过命令行界面(CLI)直接配置路由器…...
平面的四种方程及一些应用
平面的四种方程及一些应用 点法式方程一般式方程三点式方程截距式方程一些应用已知平面方程,找出平面上不共线的三个点 点法式方程 平面经过点 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0)且法向量为 ( a , b , c ) (a,b,c) (a,b,c),则平面的点…...
记录一个SQL自动执行的html页面
在实际工作场景中,需要运用到大量SQL语句更新业务逻辑,对程序员本身,写好的sql语句执行没有多大问题(图1),但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面(图2࿰…...
SpringBoot——Maven篇
Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的工具。它具有许多特性,其中一些重要的特性包括: 1. 自动配置:Spring Boot 提供了自动配置的机制,可以根据应用程序的依赖和环境自动配置应用程序的各种组件ÿ…...
数据批处理(队列方式)
数据批处理(队列方式) public class DataProcessor {private static final int THREAD_COUNT 4;private static final int QUEUE_SIZE 10;private LinkedBlockingQueue<Data> queue new LinkedBlockingQueue<>(QUEUE_SIZE);public DataP…...
从零开始搭建搜索推荐系统(五十四)多路召回之万剑归宗
聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧! (PS…...
c++介绍函数指针 十
指针代表内存中地址标识符,变量,数组都是存储内存中的数据。所以可以获得它们的地址,用指针来表示这块内存。 如图输出内存中的地址。 对于一个函数来说,也是内存中存储这段数据,所以我们也可以获取函数的地址。 函数…...
redis数据库
一、redis数据库介绍 NoSQL Not Only SQL 非关系型数据库 1、关系型数据库与非关系型数据库的区别 非关系型数据库性能高、速度快、支持高并发连接 1、非关系型数据库基于内存存储数据 2、摒弃了关系型数据的约束限制 3、采用o1算法进行设计开发 2、作用 关系型数…...
关于 NoC 中数据安全传输的设计与实现的详细介绍
片上网络(Network-on-Chip,NoC)作为一种新兴的片上通信架构,解决了传统总线架构在大规模集成电路设计中面临的诸多问题。然而,随着芯片系统的复杂性和应用场景的多样化,NoC 中数据安全传输变得至关重要。以…...
OpenGL(4)着色器
文章目录 一、着色器1、什么是着色器?2、着色器类型2.1、顶点着色器(Vertex Shader)2.2、片段着色器(Fragment Shader) 3、着色器属性3.1、layout 属性3.2、in 属性3.3、out 属性3.4、总结 4、示例 前言: 在…...
PHP批量去除Bom头的方法
检查的代码: <?php$dir __DIR__; $files new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));foreach ($files as $file) {if ($file->isFile() && pathinfo($file, PATHINFO_EXTENSION) php) {$content file_get_contents(…...
51单片机的keil c51软件安装教程
Keil(C51)介绍、下载、安装与注册_keil c51-CSDN博客 参考 安装 不一定是这个大小,也可以下载别的版本KEID C51 注册 加入芯片型号 …...
JavaScript基本知识
文章目录 一、JavaScript基础1.变量(重点)1-1 定义变量及赋值1-2 变量的命名规则和命名规范判断数据类型: 2.数据类型转换2-1 其他数据类型转成数值2-2 其他数据类型转成字符串2-3 其他数据类型转成布尔 3.函数3-1函数定义阶段3-2函数调用阶段…...
导数,积分及常用公式
导数定义: 求导是数学计算中的一个计算方法,它的定义就是,当自变量的增量趋于零时,因变量的增量与自变量的增量之商的极限。在一个函数存在导数时,称这个函数可导或者可微分。可导的函数一定连续。不连续的函数一定…...