尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AzureML Designer 集成推荐系统模块:将 Recommenders 算法封装为可视化画布组件
人工智能机器学习深度学习【免费下载链接】recommendersBest Practices on Recommendation Systems项目地址https://gitcode.com/gh_mirrors/re/recommenders点击查看免费下载本篇指南以contrib/azureml_designer_modules目录下的 README 与配套实现为核心系统讲解如何将 Recommenders 仓库中的推荐算法与评估指标封装为 AzureML Designer 组件读者将掌握六个可拖拽模块SAR 训练、SAR 打分、分层数据切分以及 MAP / nDCG / PrecisionK / RecallK 四项评估指标的输入输出契约、参数配置方式、命令封装原理以及如何在可视化画布上搭建从数据切分、模型训练到离线评估的完整推荐流水线并学会如何在此基础上扩展自己的算法模块。AzureML DesignerAzure 机器学习设计器允许开发者通过交互式画布将数据集与模块可视化地连接起来从而构建机器学习模型。其关键能力在于任何 Python 库都可以被封装为画布上的一个模块/组件。本目录正是利用这一机制把 Recommenders 仓库中的算法与评估函数桥接进 Designer 的产物。该目录包含两部分资产类别内容入口脚本entries7 个可执行 Python 脚本位于 contrib/azureml_designer_modules/entries负责解析参数、加载/保存数据、调用 Recommenders 核心函数组件规范module_specs8 个 YAML 文件位于 contrib/azureml_designer_modules/module_specs声明组件的输入输出、默认值、运行命令与 Conda 环境一、模块总览六个可拖拽的推荐组件从 module_specs 中的 YAML 定义可以整理出完整的组件清单组件 display_nameYAML 定义对应入口脚本底层 Recommenders 函数SAR TrainingSAR 训练sar_train.yamltrain_sar_entry.pyrecommenders.models.sar.SAR见 sar_singlenode.pySAR ScoringSAR 打分sar_score.yamlscore_sar_entry.pySAR 的recommend_k_items/predict/get_item_based_topk等Stratified Splitter分层切分stratified_splitter.yamlstratified_splitter_entry.pyrecommenders.datasets.python_splitters.python_stratified_splitMAP平均精度均值map.yamlmap_entry.pyrecommenders.evaluation.python_evaluation.map_at_knDCG归一化折损累计增益ndcg.yamlndcg_entry.pyrecommenders.evaluation.python_evaluation.ndcg_at_kPrecisionK精确率precision_at_k.yamlprecision_at_k_entry.pyrecommenders.evaluation.python_evaluation.precision_at_kRecallK召回率recall_at_k.yamlrecall_at_k_entry.pyrecommenders.evaluation.python_evaluation.recall_at_k整体可组合成一条典型流水线Stratified Splitter 切分数据 → SAR Training 训练模型 → SAR Scoring 产出推荐/预测 → 四个评估组件之一计算离线指标。这与 examples/00_quick_start/sar_movielens.ipynb 等 Notebook 中演示的 SAR 实验流程一一对应只是从代码驱动换成了画布拖拽驱动。二、组件规范YAML剖析Designer 组件的声明语言每个组件由一个遵循http://azureml/sdk-2-0/CommandComponent.jsonSchema 的 YAML 文件声明以 sar_train.yaml 为例拆解其结构$schema: http://azureml/sdk-2-0/CommandComponent.json name: microsoft.com.cat.sar_training version: 1.1.1 display_name: SAR Training type: CommandComponent description: SAR Train from Recommenders repo: https://github.com/Microsoft/Recommenders. tags: Recommenders: inputs: input_path: type: AnyDirectory description: The directory contains dataframe. optional: false user_column: type: String description: Column name of user IDs. default: UserId optional: false item_column: type: String description: Column name of item IDs. default: MovieId optional: false rating_column: type: String description: Column name of rating. default: Rating optional: false timestamp_column: type: String description: Column name of timestamp. default: Timestamp optional: false normalize: type: Boolean description: Flag to normalize predictions to scale of original ratings default: false optional: false time_decay: type: Boolean description: Flag to apply time decay default: false optional: false outputs: output_model: type: AnyDirectory description: The output directory contains a trained model code: ../../ command: - python contrib/azureml_designer_modules/entries/train_sar_entry.py --input-path {inputs.input_path} --col-user {inputs.user_column} --col-item {inputs.item_column} --col-rating {inputs.rating_column} --col-timestamp {inputs.timestamp_column} --normalize {inputs.normalize} --time-decay {inputs.time_decay} --output-model {outputs.output_model} environment: conda: conda_dependencies_file: contrib/azureml_designer_modules/module_specs/sar_conda.yaml os: Linux关键字段含义$schema/type声明这是 SDK v2 的CommandComponent——即以命令行方式运行 Python 脚本的组件类型画布上的每次执行等价于一次命令行调用。name/version/display_name组件的唯一标识如microsoft.com.cat.sar_training、版本号当前均为1.1.1与画布上展示的名称。inputs/outputs声明端口类型与参数。AnyDirectory表示输入输出以目录形式承载 DataFrame 或模型文件String/Boolean/Integer/Float/Enum为参数类型并可通过default设置默认值、min/max约束取值范围、optional标记是否必填。code: ../../指定组件代码的挂载根目录即仓库根目录。这解释了为何所有入口脚本都可以在命令中直接以仓库相对路径contrib/azureml_designer_modules/entries/xxx.py引用。command真正被执行的命令行。{inputs.xxx}与{outputs.xxx}是占位符运行时由 Designer 根据画布上的实际连线自动填充。environment指定运行环境。sar_conda.yaml定义了 Conda 依赖详见下文环境依赖小节os: Linux表明组件目标运行平台为 Linux 计算集群。2.1 参数占位符与可选参数语法在 sar_score.yaml 中可以看到更复杂的命令构造方式方括号[ ... ]表示可选参数command: - python contrib/azureml_designer_modules/entries/score_sar_entry.py --trained-model {inputs.trained_model} --dataset-to-score {inputs.dataset_to_score} --score-type {inputs.score_type} [--items-to-predict {inputs.items_to_predict}] --normalize {inputs.normalize} [--ranking-metric {inputs.ranking_metric}] [--top-k {inputs.top_k}] [--sort-top-k {inputs.sort_top_k}] [--remove-seen-items {inputs.remove_seen_items}] --score-result {outputs.score_result}其中score_type为必填的Enum类型输入枚举值为Rating prediction与Item recommendation默认Item recommendation其余如ranking_metricRating/Similarity/Popularity默认Rating、top_kIntegermin: 1默认10、sort_top_k默认true、remove_seen_items默认false均声明为optional: true因此出现在方括号中仅在用户显式配置时才传入命令行。三、入口脚本设计模式每个组件的运行骨架所有entries下的脚本遵循高度一致的四段式结构理解这一模式后即可照葫芦画瓢扩展新组件argparse 声明参数使用argparse.ArgumentParser()逐一声明与 YAMLinputs对应的命令行参数。加载数据通过azureml.studio.core.io.data_frame_directory.load_data_frame_from_directory将 Designer 的目录端口加载为 Pandas DataFrame。调用 Recommenders 核心函数直接复用仓库内已实现的算法或评估函数。记录指标并保存结果调用评估函数后先用azureml.core.Run.get_context()获取运行上下文将指标写入 AzureML 运行仪表盘run.parent.log(...)再把结果 DataFrame 通过save_data_frame_to_directory写回输出端口。3.1 数据帧的加载与保存约定Designer 的 DataFrame 端口在底层以目录形式存在需要借助azureml.studio.core.io.data_frame_directory模块读写。以 map_entry.py 为例from azureml.studio.core.io.data_frame_directory import ( load_data_frame_from_directory, save_data_frame_to_directory, ) from azureml.studio.core.data_frame_schema import DataFrameSchema rating_true load_data_frame_from_directory(args.rating_true).data rating_pred load_data_frame_from_directory(args.rating_pred).data读取时.data属性即真正的 Pandas DataFrame保存时则需同时给出列 Schemascore_result pd.DataFrame({map_at_k: [eval_map]}) save_data_frame_to_directory( args.score_result, score_result, schemaDataFrameSchema.data_frame_to_dict(score_result), )值得注意的是入口脚本普遍使用args, _ parser.parse_known_args()而非parse_args()即忽略未知参数——这允许同一脚本兼容 Designer 自动注入的额外参数增强了健壮性。3.2 指标上报到 AzureML 仪表盘每个评估入口在算完指标后都会执行一次日志上报例如 ndcg_entry.py# Log to AzureML dashboard run Run.get_context() run.parent.log(nDCG at {}.format(k), eval_ndcg)Run.get_context()获取当前运行上下文run.parent.log()则将指标写入父运行从而在 AzureML 的指标看板中实时展示。四项评估组件分别上报MAP at {k}、nDCG at {k}、Precision at {k}、Recall at {k}键名即画布可视化图表中的指标名。四、SAR 训练组件把单节点 SAR 算法封装成画布模块4.1 入口脚本的参数与调用链train_sar_entry.py 是六个组件中唯一涉及模型训练的入口其核心调用如下model SAR( col_userargs.col_user, col_itemargs.col_item, col_ratingargs.col_rating, col_timestampargs.col_timestamp, normalizestrtobool(args.normalize), timedecay_formulastrtobool(args.time_decay), ) start_time time.time() model.fit(input_df) train_time time.time() - start_time print(Took {} seconds for training..format(train_time))其中SAR类位于 recommenders/models/sar/sar_singlenode.py是 Recommenders 仓库中 SARSimple Algorithm for Recommendations的单节点实现。其核心思想是先估计用户对物品的偏好affinity再估计物品之间的相似度最后综合两者为用户生成推荐列表。从构造签名sar_singlenode.py可以看到SAR还支持similarity_typejaccard、cosine、lift、cooccurrence、mutual information等七种相似度、time_decay_coefficient评分半衰期天数、threshold低于该共现次数的物品对会被剔除等参数这些在 Designer 组件中暂未暴露保持默认值。入口脚本中两次类型转换值得注意input_df[args.col_rating] input_df[args.col_rating].astype(float)训练前把评分列强制转为float避免字符串或整型数据导致亲和度计算异常strtobool(args.normalize)与strtobool(args.time_decay)Designer 的Boolean输入在命令行中以字符串形式传入需要用distutils.util.strtobool还原为布尔值。4.2 模型序列化joblib 保存协议训练完成后模型通过自定义的joblib_dumper保存train_sar_entry.pydef joblib_dumper(data, file_nameNone): Return a dumper to dump a model with pickle. if not file_name: file_name _data.pkl def model_dumper(save_to): full_path Path(save_to) / file_name ensure_folder(Path(save_to)) with open(full_path, wb) as fout: joblib.dump(data, fout, protocol4) model_spec {model_type: joblib, file_name: file_name} return model_spec return model_dumpersave_model_to_directory会调用该 dumper 将模型写入输出目录并返回描述文件名的model_spec。这样设计的好处是Designer 的输出目录可以承载任意格式的模型只要保存与加载两侧的model_spec约定一致即可。对应的加载侧在评分组件中见下节joblib_loader二者以{model_type: joblib, file_name: _data.pkl}为契约形成对称的读写协议。五、SAR 评分组件三种推荐模式与两种预测模式score_sar_entry.py 是功能最丰富的入口通过三个Enum类对运行模式做显式建模class ScoreType(Enum): ITEM_RECOMMENDATION Item recommendation RATING_PREDICTION Rating prediction class RankingMetric(Enum): RATING Rating SIMILARITY Similarity POPULARITY Popularity class ItemSet(Enum): TRAIN_ONLY Items in training set SCORE_ONLY Items in score set入口先按--score-type分派Item recommendation走recommend_itemsRating prediction走predict_ratings。5.1 物品推荐模式的三种排序依据recommend_items根据ranking_metric映射到 SAR 模型的不同方法score_sar_entry.pyranking_metric调用的 SAR 方法行为说明Ratingrecommend_k_items(test, top_k, sort_top_k, remove_seen, normalize)基于用户历史交互的预估评分排序为每个用户推荐 Top-K 物品并可剔除训练中已见过的物品remove_seenSimilarityget_item_based_topk(items, top_k, sort_top_k)基于物品-物品相似度为给定物品集合推荐最相似的 Top-K 物品Popularityget_popularity_based_topk(top_k, sort_top_k)基于流行度物品出现频次推荐全局热门 Top-K这三个方法在 sar_singlenode.py 中均有实现get_popularity_based_topk、get_item_based_topk、recommend_k_items组件层只是把 Designer 的画布参数原样透传给模型 API。5.2 评分预测模式的两个物品集合predict_ratings按items_to_predict分派score_sar_entry.pyitems_to_predict调用的 SAR 方法行为说明Items in training setpredict_training_items(test, normalize)仅对训练集中出现过的物品对输出预测评分Items in score setpredict(test, normalize)对待评分数据集中的物品对输出预测评分normalize参数用于把预测值缩放到原始评分的量纲如 1~5 分其实现对应 sar_singlenode.py 中的rescale逻辑这在将评分预测与真实评分直接做误差对比时非常必要。5.3 加载训练产物与保存协议对称的 joblib_loader评分入口通过load_model_from_directory配合自定义joblib_loader反序列化训练阶段保存的模型score_sar_entry.pydef joblib_loader(load_from_dir, model_spec): file_name model_spec[file_name] with open(Path(load_from_dir) / file_name, rb) as fin: return joblib.load(fin) sar_model load_model_from_directory( args.trained_model, model_loaderjoblib_loader ).datamodel_spec[file_name]正是训练阶段写入的_data.pkl。得益于 sar_conda.yaml 中固定joblib0.14.0的版本约束训练与评分两个组件即使在不同的计算节点上运行也能保证序列化兼容性。六、分层切分组件训练/测试数据的标准入口stratified_splitter_entry.py 将python_stratified_split封装为组件输出训练集与测试集两个端口。核心调用output_train, output_test python_stratified_split( input_df, ratioargs.ratio, col_userargs.col_user, col_itemargs.col_item, seedargs.seed, )底层函数定义于 recommenders/datasets/python_splitters.py其签名还支持min_rating过滤交互次数过少的用户或物品与filter_by按user还是item过滤等参数。分层切分保证每个用户都被同时分配到训练集和测试集是评估冷启动用户推荐效果的前提——测试集中的每个用户都在训练集中见过从而可以计算个性化的 Top-K 指标。YAML 中ratio参数的描述值得注意stratified_splitter.yaml它既可以是一个Float如0.75表示 75% 数据进训练集也可以是一个浮点数列表按比例切成多份若列表之和不为 1 会自动归一化。组件层将该能力收窄为单个Float输入取值范围[0.0, 1.0]默认0.75。七、四个评估组件MAP / nDCG / PrecisionK / RecallK四个评估入口结构完全同构均接收真实评分表 预测表两个 DataFrame 输入输出一个标量指标。以 map_entry.py 为例eval_map map_at_k( rating_true, rating_pred, col_usercol_user, col_itemcol_item, col_ratingcol_rating, col_predictioncol_prediction, relevancy_methodrelevancy_method, kk, thresholdthreshold, )7.1 共用的七参数契约四个入口map_entry.py、ndcg_entry.py、precision_at_k_entry.py、recall_at_k_entry.py暴露的参数字段完全一致对应 YAML 中的输入定义参数类型默认值说明user_columnStringUserId用户 ID 列名item_columnStringMovieId物品 ID 列名rating_columnStringRating真实评分列名prediction_columnStringprediction预测评分列名relevancy_methodStringtop_k相关性判定方法top_k取每个用户预测 Top-K 视为相关或by_threshold评分超过threshold视为相关top_kInteger10每个用户的候选 K 值thresholdFloat10.0仅by_threshold模式生效的相关性阈值四个 YAMLmap.yaml、ndcg.yaml、precision_at_k.yaml、recall_at_k.yaml中这四个组件的输入输出声明完全一致差别仅在name、display_name与command中引用的入口脚本。7.2 指标定义与底层实现四个指标均实现于 recommenders/evaluation/python_evaluation.py其函数签名与组件参数一一对应precision_at_k见 L457、recall_at_k见 L510、ndcg_at_k见 L616、map_at_k见 L809MAPKMean Average Precision at K对每个用户计算预测列表的平均精确率再对所有用户取均值。输出描述为min0, max1见 map.yaml取值越高表示排序质量越好。nDCGKNormalized Discounted Cumulative Gain按位置折损的累积增益除以理想排序的增益衡量排序位置对推荐质量的影响。PrecisionK预测 Top-K 中相关物品所占比例衡量推荐的精确性。RecallK所有相关物品中被预测 Top-K 命中的比例衡量推荐的覆盖性。四者侧重点不同实践中常组合使用例如在画布上同时挂出四个评估组件从精确率、召回率、排序位置敏感性三个维度交叉验证同一份 SAR 推荐结果。此外仓库的 recommenders/evaluation/spark_evaluation.py 中还提供了 SparkPySpark MLlibRankingMetrics版本的同类指标实现可用于大规模分布式评估场景但本 Designer 组件集目前封装的是纯 PythonPandas版本。八、运行环境依赖所有组件共用同一个 Conda 环境文件 sar_conda.yamlname: Recommenders_module_environment channels: - defaults dependencies: - python3.7 - pip20.2 - pip: - pandas0.23.4,1.0.0 - pyarrow0.13.0 - azureml-defaults - azureml-designer-core - joblib0.14.0 - scikit-learn0.20.3几个关键约束的含义python3.7pip20.2锁定 Python 与 pip 版本保证组件行为可复现pandas0.23.4,1.0.0限定 Pandas 大版本在 0.x与 Designer 数据帧读写模块及 SAR 实现的 API 兼容azureml-defaults/azureml-designer-core提供Run、module_logger、数据帧目录读写、模型目录读写等 Designer 运行基础设施joblib0.14.0scikit-learn0.20.3固定序列化协议与相关依赖版本确保训练产出的_data.pkl能被评分组件可靠加载。九、在 Designer 画布上编排推荐流水线结合前述组件契约可以在 AzureML Designer 画布上搭建如下典型实验流程数据接入将用户-物品交互数据含UserId、MovieId、Rating、Timestamp四列以 DataFrame 数据集接入画布分层切分连接Stratified Splitter设置ratio0.75输出训练集与测试集模型训练将训练集连入SAR Training配置user_column/item_column/rating_column/timestamp_column按需开启normalize与time_decay产出序列化的 SAR 模型离线打分将模型与测试集连入SAR Scoring选择Item recommendation模式与Rating排序依据设置top_k如 10视业务需要开启remove_seen_items指标评估将训练集作为真实值与打分结果分别连入MAP / nDCG / PrecisionK / RecallK组件的两个输入端口运行后即可在运行仪表盘上查看四个指标曲线。需要特别留意端口的连线约定评估组件要求rating_true输入连接真实交互数据rating_pred输入连接模型预测输出两者必须包含一致的user_column/item_column列名且prediction_column默认取predictionSAR Scoring 输出即为该列名。若不满足可通过组件的列名参数在画布上直接修正。十、扩展指南如何添加新的 Recommenders 组件该目录的架构决定了扩展新组件的成本很低只需三步编写入口脚本在 entries 下新建xxx_entry.py复用argparse load_data_frame_from_directory 调用 Recommenders 函数 run.parent.logsave_data_frame_to_directory骨架。若新组件涉及模型需同时实现与训练侧对称的 dumper / loader并约定model_spec的字段声明组件规范在 module_specs 下新建xxx.yaml参照$schema: http://azureml/sdk-2-0/CommandComponent.json声明输入输出code指向../../仓库根command使用{inputs.xxx}/{outputs.xxx}占位符拼装命令行复用环境若新组件仍基于 Pandas / scikit-learn / joblib 生态直接引用 sar_conda.yaml若引入新依赖则需在其基础上扩展依赖列表。例如把 Recommenders 仓库中其他算法如 NCF、xDeepFM、LightGBM 等封装为 Designer 组件即可复用同一套训练/打分/评估三段式流水线评估侧也可继续复用本目录的四个指标组件因为其输入契约真实表 预测表 列名参数与模型无关。结语contrib/azureml_designer_modules为 Recommenders 仓库提供了完整的 AzureML Designer 可视化集成方案六个组件覆盖了推荐系统离线实验切分 → 训练 → 打分 → 评估的完整闭环所有组件都直接复用仓库内经过测试的算法与评估实现如 python_evaluation.py、python_splitters.py、sar_singlenode.py而非重复造轮子。对于希望以低代码方式在 AzureML 上开展推荐实验的团队这套组件即开即用对于希望把更多 Recommenders 算法带入 Designer 的开发者本章拆解的YAML 规范 入口脚本模式则是一份可直接复用的扩展模板。赞分享人工智能机器学习深度学习【免费下载链接】recommendersBest Practices on Recommendation Systems项目地址https://gitcode.com/gh_mirrors/re/recommenders点击查看免费下载相关推荐Recommend 项目 contrib 目录全解AzureML Designer 集成模块与 SARplus 高性能 Spark 推荐引擎Recommend 项目 contrib 目录全解AzureML Designer 集成模块与 SARplus 高性能 Spark 推荐引擎 导读 本文围绕人工智能机器学习深度学习163MusicLyrics三分钟搞定全网音乐歌词的终极解决方案163MusicLyrics三分钟搞定全网音乐歌词的终极解决方案 在数字音乐时代歌词不仅是歌曲的灵魂更是连接音乐与情感的桥梁。然而面对网易云音乐、QQ音桌面应用音视频u8views与GitHub Actions集成自动化统计和报告生成u8views与GitHub Actions集成自动化统计和报告生成 u8views是一款强大的GitHub profile views追踪工具能够帮助用户上一篇camofox-browser /tabs端点详解创建、列表、统计、关闭全覆盖下一篇Freqtrade 进阶运维完全指南多实例部署、systemd 守护、自定义数据库与高级日志体系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Apollo Client ErrorLink 完全指南:基于 `@apollo/client/link/error` 的 GraphQL 错误处理实战

Apollo Client ErrorLink 完全指南:基于 `@apollo/client/link/error` 的 GraphQL 错误处理实战

Apollo Client ErrorLink 完全指南:基于 apollo/client/link/error 的 GraphQL 错误处理实战 【免费下载链接】apollo-client The industry-leading GraphQL client for TypeScript, JavaScript, React, Vue, Angular, and more. Apollo Client delivers powerful c…

📅 2026/9/20 22:21:44
ComfyUI 工作流模板全解析:20 类 50 个预配置工作流,3 步跑通第一次出图

ComfyUI 工作流模板全解析:20 类 50 个预配置工作流,3 步跑通第一次出图

ComfyUI 工作流模板全解析:20 类 50 个预配置工作流,3 步跑通第一次出图 【免费下载链接】ComfyUI-Workflows-ZHO 我的 ComfyUI 工作流合集 | My ComfyUI workflows collection 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-Workflows-Z…

📅 2026/9/20 22:21:44
Claude Code 的 CLAUDE.md 共识协议不生效?TaoToken 这样改模型通道再查加载层级

Claude Code 的 CLAUDE.md 共识协议不生效?TaoToken 这样改模型通道再查加载层级

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/20 22:21:44
MORE NEWS

更多资讯

📰

enzyme ShallowWrapper.debug() 方法完全指南:用 HTML 化字符串快速定位组件渲染问题

enzyme ShallowWrapper.debug() 方法完全指南:用 HTML 化字符串快速定位组件渲染问题 【免费下载链接】enzyme JavaScript Testing utilities for React 项目地址: https://gitcode.com/gh_mirrors/en/enzyme 导读 当你在用 enzyme 编写 React 单元测试时&a…

📰

Skynet框架设计原理与高并发系统实践

1. 这不是“八股文”——Skynet 框架面试题的本质是什么?很多人看到“Skynet 框架面试题”第一反应是:又一个要背的冷门技术点?尤其当它和“Java八股文”“Vue3面试题2026”“绝密100个Spark面试题”混在一起刷屏时,很容易误判——…

📰

WeKnora 完整部署指南:Docker Compose 四步跑通私有 RAG 知识库

WeKnora 完整部署指南:Docker Compose 四步跑通私有 RAG 知识库 【免费下载链接】WeKnora Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki. 项目地址: https://gitc…

📰

ExoPlayer Cast 投屏 Demo 实战指南:用 CastPlayer 与 ExoPlayer 实现投屏与本地播放无缝切换

音视频移动开发 【免费下载链接】ExoPlayer An extensible media player for Android 项目地址: https://gitcode.com/gh_mirrors/exop/ExoPlayer 点击查看 免费下载 本指南围绕 ExoPlayer 仓库中的 demos/cast/README.md 展开,系统讲解 Cast demo 应用…

📰

OpenResearch工作流搭建指南:打造可追踪、可复现的开放研究链路

"OpenResearch"这个词我在圈子里听到的频率越来越高。前阵子跟几个做学术和独立开发的朋友聊,大家不约而同地在折腾同一件事:怎么让自己的研究过程更透明、结果更好复现、协作更省力。说白了,就是把整个研究链路从选题、文献、实验…

📰

Learn Go with Tests 章节模板解读:把 TDD 循环固化为每个章节的标准骨架

Learn Go with Tests 章节模板解读:把 TDD 循环固化为每个章节的标准骨架 【免费下载链接】learn-go-with-tests Learn Go with test-driven development 项目地址: https://gitcode.com/gh_mirrors/le/learn-go-with-tests 导读 template.md 是开源书籍《L…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬