news 2026/8/30 17:33:49

淘宝用户行为分析全流程实战:从数据预处理到模型调参

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
淘宝用户行为分析全流程实战:从数据预处理到模型调参

简介:在机器学习工程实践中,用户行为分析是连接数据特征与业务价值的核心环节,其本质是通过对用户交互序列的建模,理解行为模式并预测潜在转化意向。这一过程通常始于原始日志数据的清洗与结构化,关键在于合理构造用户、商品及交叉维度的特征,并借助统计模型或梯度提升树等算法完成分类任务。特征工程决定了模型性能的上限,而数据划分与时间衰减等细节则直接影响泛化能力。该技术广泛应用于电商推荐、个性化营销和漏斗优化等场景,能够显著提升运营效率。围绕淘宝用户行为数据集,从Session切分、特征构造到LightGBM调参,系统展示了完整的建模链路,为同类项目提供了可复用的工程思路。

1. 项目定位与思路拆解

淘宝用户行为分析这个课题,我愿称之为机器学习大作业里的“性价比之王”。数据公开、场景真实、流程完整,从数据清洗到特征工程再到模型训练,刚好覆盖机器学习项目的全链路。很多同学拿到题目第一反应是去搜源码,搜到之后跑一遍,输出一个准确率就交差了。但我要说一句大实话:如果你真想让这份大作业拿高分,或者将来想把这个项目写进简历,你就不能只是“跑通”,而是要跑明白。

1.1 为什么这道题值得做

先说数据背景。淘宝用户行为数据集(UserBehavior)是阿里云天池公开的一个经典数据集,包含约1亿条用户行为日志,字段只有四个:用户ID、商品ID、商品类目ID、行为类型、时间戳。看起来简单,但它的信息密度很高。

  • 数据规模真实,接近工业级,不是那种几百行拿来演示的玩具数据
  • 行为类型覆盖了“浏览-加购-收藏-购买”完整链路,天然适合做漏斗分析和转化预测
  • 时间跨度完整,可以做时间序列类的特征分析

真正打动我的地方在于,这个课题的难度曲线很友好。用逻辑回归或者随机森林就能跑出一个还算能看的结果,但如果想追求更好的AUC、更漂亮的可视化、更扎实的分析逻辑,它有足够的深度让你挖。这就是为什么同样的题目,有人拿70分,有人拿95分。

1.2 任务定义:从原始数据到可预测问题

拿到原始数据后,第一步不是急着写代码,而是把问题定义清楚。很多同学在这里就开始跑偏了。

“淘宝用户行为分析”这个题目本身是开放性的,你需要把它转化成一个具体的机器学习任务。我把这个问题拆成两个层面:

第一层是分析性问题。用户最活跃的时间段是什么?从浏览到购买的转化漏斗长什么样?哪些商品类目的购买转化率最高?这些是描述性的分析,主要用来填充实验报告中的“数据探索”章节。

第二层是预测性问题,这才是机器学习模型发挥作用的地方。常见做法是:构建一个二分类模型,预测用户是否会购买某个商品、用户是否会在未来7天内产生购买行为、或者在某个Session内是否会完成购买。

以推荐系统的真实业务为例,我们更关心的是“用户这次进店,会不会下单”。所以我的建议是,把大作业的建模目标定为:预测用户在一个Session内是否会产生购买行为。这个任务既符合业务直觉,又方便从原始数据中构造样本和标签。

1.3 数据集结构与规模预期

虽然很多课程提供的用户行为数据集已经是清洗后的版本,但你还是要对数据规模有一个心理预期。原始数据一般在1亿行左右,文件大小几个GB级别,如果你的电脑配置一般,直接全量跑特征工程可能会非常吃力。

我的做法是:先用全量数据做探索性分析,然后用分层抽样的方式取10%到20%的数据来建模。抽样的时候要注意按用户ID做随机抽样,而不是直接按行抽,这样才能保证同一个用户的完整行为链路不被截断。

提示:如果拿到的是CSV格式的数据,加载的时候记得指定dtype,把用户ID和商品ID指定为字符串类型,避免因为数值过大导致精度丢失。这个坑我下面会专门讲。

2. 数据预处理:决定模型上限的第一道坎

业内流传着一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。这句话在大作业里体现得淋漓尽致,因为老师批改时看得最细的就是你的预处理逻辑是否合理、特征构造是否有业务解释力。

2.1 数据加载与基础清洗

我用pandas读取数据后,首先做以下几件事:查看缺失值情况,检查重复行,统计数据分布。这份数据集的缺失值通常很少,但重复行为却很常见——用户在同一时间对同一个商品重复点击,这类数据需要处理。

重复行为怎么处理,我推荐按“行为类型+用户ID+商品ID+时间戳”四个字段进行去重。如果时间戳完全相同、行为类型相同,那基本可以判定为重复记录,保留一条即可。这里有一个容易忽视的细节:去重之前先把时间戳转换成可读的日期时间格式,否则你很难发现同一秒内的重复点击。

import pandas as pd df = pd.read_csv('user_behavior.csv', names=['user_id', 'item_id', 'category_id', 'behavior', 'timestamp'], dtype={'user_id': str, 'item_id': str, 'category_id': str}) # 时间戳转换 df['datetime'] = pd.to_datetime(df['timestamp'], unit='s') # 去重 df = df.drop_duplicates(subset=['user_id', 'item_id', 'behavior', 'timestamp']) # 行为类型映射 behavior_map = {'pv': 1, 'cart': 2, 'fav': 3, 'buy': 4} df['behavior_num'] = df['behavior'].map(behavior_map)

2.2 时间戳处理与时段特征构造

原始数据给的是Unix时间戳,这个字段非常关键,因为它是我们构造时间维度特征的“原材料”。我习惯把时间戳拆成以下几个维度:日期、小时、星期几、是否工作日、是否深夜。

为什么要拆小时?因为淘宝用户的活跃度有明显的时段规律。你可能发现上午10点和晚上9点是购买高峰,而凌晨3点的用户浏览多、购买少。这些规律不仅是报告里的可视化素材,更是特征构造的依据——用户在每个时间段的活跃偏好,本身就是区分用户购买意愿的信号。

时间戳处理还有一个细节:时区问题。数据集里的时间戳默认是UTC还是北京时间,你需要通过demo样本验证一下。我当时做了个小实验,取几条记录转换时间后和实际业务场景对照,发现需要加上8小时的时差。如果你忽略了这个细节,后面分析用户活跃时段时会出现系统性偏差。

2.3 行为去重与Session切分

Session切分是这个问题里最重要、也最容易被忽视的预处理步骤。什么是一个Session?你可以把它理解为用户的一次“访问过程”——从用户打开App到退出App的这整段连续操作序列。

业界常用的Session划分标准是:同一个用户相邻行为时间差超过30分钟,则视为新开一个Session。这个阈值基于经验,淘宝的官方开发者文档里也提到过类似的会话划分逻辑。我在实操中对比过30分钟和60分钟两种切分方式,结果30分钟切出来的Session数量更多,但平均长度更短,建模时正负样本比例更均衡。

# 按用户分组,计算相邻行为时间差,超过30分钟则划分新Session df = df.sort_values(['user_id', 'timestamp']).reset_index(drop=True) df['time_gap'] = df.groupby('user_id')['timestamp'].diff() # 新Session的起始位置标记为True new_session = (df['time_gap'] > 1800) | (df['time_gap'].isnull()) df['session_id'] = new_session.groupby(df['user_id']).cumsum().astype(int) # Session内部行为序号 df['session_item_seq'] = df.groupby('session_id').cumcount() # Session内行为总数 df['session_behavior_num'] = df.groupby('session_id')['behavior'].transform('count')

切完Session之后,下一步就是构建训练样本。我建议以Session为粒度,聚合出这个Session内用户的所有行为序列,然后打标签:如果这个Session内出现了购买行为,则标签为1,否则为0。

这样我们就把一个1亿行的日志数据,转化成了几十万个Session级别的样本,每个样本带有用户行为特征和标签。这个思路非常重要,因为原始的日志数据是不能直接扔进模型训练的——你需要把行为序列“压缩”成特征向量。

3. 特征工程:拉开分数差距的隐藏赛点

特征工程做得好不好,往往决定了你的大作业是70分还是90分。模型的差异可以通过调参来弥补,但特征质量的差异是模型本身弥补不了的。我在这个项目里主要从三个维度构造特征:用户维度、商品维度、用户-商品交叉维度。

3.1 用户维度的行为统计特征

用户维度特征是模型效果的基础,核心思想是:用过去的行为预测未来的购买概率。一个用户的活跃程度、购物偏好、转化历史,都是强有力的信号。

我构造的用户维度特征包括:用户的浏览次数、加购次数、收藏次数、购买次数、各种行为的转化率(购买/浏览)、用户活跃天数、平均每天行为数、用户首次行为和末次行为的时间跨度。

以“用户购买转化率”为例,它的计算逻辑是:用户的购买次数除以浏览总次数。这个特征的业务含义是,某些用户就是“逛得多买得少”,而另一些用户则是“来了就买”。两类用户的购买倾向差异巨大。

user_features = df.groupby('user_id').agg( total_pv=('behavior', lambda x: (x == 'pv').sum()), total_cart=('behavior', lambda x: (x == 'cart').sum()), total_fav=('behavior', lambda x: (x == 'fav').sum()), total_buy=('behavior', lambda x: (x == 'buy').sum()), active_days=('date', 'nunique'), behavior_span=('timestamp', lambda x: x.max() - x.min()) )

这里要提醒一点:构造用户特征时,一定要区分“全量特征”和“训练时特征”。如果你直接拿整个数据集构造特征再切分训练集和测试集,会造成严重的数据泄漏。正确的做法是:先按时间切分数据,再用训练集部分构造用户历史特征,用同样的特征在测试集上做转换。

3.2 商品与类目维度的特征

很多同学做特征工程只盯着用户维度,忽略了商品维度的特征。其实商品的热度和类目的转化率,对模型效果的影响非常明显。

商品维度特征包括:商品的浏览次数、加购次数、收藏次数、购买次数、商品的转化率(购买/浏览)。这些特征刻画了一个商品的受欢迎程度和销售转化潜力。

类目维度特征类似,换成类目粒度去聚合。为什么类目粒度也重要?因为有些类目的商品天然转化率高。比如数码产品的购买决策周期长,用户会反复比较;而零食饮料类的购买决策周期短,转化率相对更高。模型学到这类规律后,预测能力会更强。

有一个细节值得注意:在构造商品特征时,建议对浏览次数做对数变换。因为热门商品的浏览次数可能是普通商品的几千倍,直接作为特征会让模型在高基数特征上产生偏差。对数变换能把量级压缩,让特征分布更平滑。

3.3 排序特征与时间衰减特征

除了基本的统计特征,还可以构造一些更“高级”的特征。我在这里分享两个在大作业里非常亮眼的特征:行为序列排序特征和时间衰减特征。

行为序列排序特征是:在用户的所有行为中,“浏览商品→加购→收藏→购买”是有序的漏斗关系。比如一个用户浏览了某商品之后,经过了几个曝光商品才加购?这个“所在位置”信息很重要。类似地,在用户的行为序列里,目标商品出现在第几位,这个排名可以作为权重因子。

时间衰减特征的核心思想是:用户的兴趣是随时间变化的,一周前的行为和昨天行为的预测力完全不同。构造方式是对历史行为做指数时间衰减加权——时间越近的行为权重越高,时间越远的行为权重越低。

# 时间衰减特征示例:用户最近7天的购买次数 import numpy as np current_ts = df['timestamp'].max() df['recency'] = current_ts - df['timestamp'] user_recent_buy = df[df['behavior'] == 'buy'].groupby('user_id').apply( lambda x: (np.exp(-x['recency'] / 86400)).sum() ).rename('recent_buy_decay')

时间衰减特征在报告里一写,面试官和老师都能看出你对业务有思考,不是只会调包调参。

4. 模型构建与调参实战

模型部分,我的建议是不要只做一个模型就收工。你要让老师看到你“尝试过、对比过、最终选定了合理的方案”。这是大作业拿高分的重要策略。

4.1 基线模型选择:逻辑回归做对比参照

很多同学嫌弃逻辑回归“太简单”,但逻辑回归在机器学习项目里有一个不可替代的作用:它是最优秀的基线模型。逻辑回归训练快、可解释性强、不容易过拟合,而且可以输出每个特征的权重系数,让你直观地看到哪些特征对“用户是否购买”的贡献最大。

在大作业报告中,你完全可以这样写:先用逻辑回归作为基线,得到一个AUC值;然后换上XGBoost或者LightGBM,展示效果的提升。这个过程本身就是机器学习项目标准的迭代流程。

这里有一个非常实用的技巧:逻辑回归对特征缩放敏感,所以使用前最好对连续特征做标准化。我建议用StandardScaler对特征进行标准化,再用逻辑回归训练。而树模型不用做标准化,这一点在报告中提一下,能体现你对模型原理的理解。

4.2 主力模型:XGBoost和LightGBM的调参策略

主力模型我推荐用XGBoost或LightGBM。两者都是梯度提升树模型,在表格数据上的表现一流,训练速度也快。

调参策略上,核心参数和顺序如下:

  1. 先固定learning_rate为0.1,用网格搜索或随机搜索确定n_estimators(树的数量)
  2. 调节max_depth(树的最大深度),一般在3到8之间搜索,防止过拟合
  3. 调节min_child_weight(叶子节点最小样本权重和),这个参数控制叶子节点分裂的保守程度
  4. 调节subsample和colsample_bytree,做行采样和列采样,增加模型泛化能力
  5. 最后把learning_rate调小(如0.01),相应增大n_estimators

我自己的经验是,max_depth不要贪大。在大作业数据规模下,max_depth=5到7左右效果就足够好了,再深就会过拟合,训练时间也大幅增加。另外,LightGBM在数据量大时训练效率优势明显,而且原生支持类别特征,在用户ID、商品ID这类高基数类别特征上有很好的处理效果。

import lightgbm as lgb from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( features, labels, test_size=0.2, random_state=42, stratify=labels ) model = lgb.LGBMClassifier( n_estimators=500, learning_rate=0.05, max_depth=6, num_leaves=31, subsample=0.8, colsample_bytree=0.8, random_state=42 ) model.fit(X_train, y_train)

4.3 类别不平衡处理与评估指标选择

这个项目里正负样本极度不平衡。想想看:用户浏览了100次,可能只会买1次。如果你直接把原始样本扔进模型,模型会学成一个“永远预测不买”的笨蛋,因为准确率也能达到99%。

处理类别不平衡的思路有几个:下采样、上采样、调整模型权重。我建议在大作业中尝试两种方法:一是用LightGBM的scale_pos_weight参数,把正类的权重提高,权重比例设为负样本数除以正样本数;二是做负样本下采样,让正负样本比例控制在1:5到1:10之间。

评估指标的选择上,不要再用Accuracy(准确率)了。在类别不平衡的场景下,准确率是极具欺骗性的指标。正确做法是使用AUC(ROC曲线下面积)作为主要评估指标,同时辅助看F1-Score和Precision/Recall曲线。

我还建议你在报告中做一件事:调大模型预测概率的阈值或者调整分类阈值,来提高模型预测为正类的覆盖率。比如默认阈值是0.5,但在正样本极少的场景下,你可能会把阈值调到0.2或0.3。在报告中展示不同阈值下的Precision-Recall曲线,能让你的实验更加完整。

5. 可视化分析与实验呈现

大作业报告和普通实验报告最大的区别在于,老师会看你的分析思路是否完整。可视化是呈现你思考过程最好的方式。

5.1 用户行为全景分析

用户行为全景分析是整个项目的起点。这里我需要你先画几张图,它们会成为实验报告的核心素材:

  • 用户行为的描述性统计表格(各类行为的次数、占比)
  • 24小时用户活跃度折线图(横轴是小时,纵轴是行为数)
  • 工作日与周末用户行为对比图
  • 用户行为分布箱线图(每个用户行为数量的分布)

我强烈建议你重点关注“24小时用户活跃度”这张图。因为从这个图里你能直观看到用户行为的波峰波谷,然后在报告中写一段数据分析结论。这种“图表+结论”的模式是老师最喜欢看到的。

5.2 漏斗转化与流量路径

漏斗转化分析是用户行为分析最具代表性的可视化之一。思路是统计从浏览到加购、从加购到收藏、从收藏到购买的各级转化率。你可以用matplotlib或pyecharts画一个漏斗图。

其中,我最看重“浏览到购买”的整体转化率。淘宝的转化率通常在1%到2%左右,你在探索数据时得出一个类似的数字,说明你的数据质量是靠谱的。如果发现转化率异常高,比如超过10%,那就要检查是不是数据处理出了问题。

此外,还可以做一张商品购买转化率Top20的可视化图,直观展示哪些商品类目更容易产生购买行为。这个分析结果可以连接到特征工程环节,体现你“从分析到特征”的完整思路。

5.3 模型结果可视化

模型训练完成后的可视化,是展示你“做实验”能力的关键。下面几个可视化图表我建议一定要有:

  • ROC曲线及AUC值
  • Precision-Recall曲线
  • 特征重要性排序图(Gain或Split维度)
  • 混淆矩阵热力图

特征重要性图特别重要。它有两个作用:一是辅助你在报告中解释“模型学到了什么”;二是帮助你做特征筛选——那些重要性极低的特征可以考虑删掉,让模型更简洁。

注意:混淆矩阵可视化时,如果类别极度不平衡,建议使用百分比而非原始计数,否则数字会非常夸张,可视化效果很差。

6. 实验报告撰写要点

很多人源码写得不错,报告却写得很拉胯。说句扎心的话:大作业的评分通常是一半看代码质量,一半看报告质量。你的分析深度、逻辑完整性、实验对比充分性,都在报告里体现。

6.1 报告结构与评分映射

我建议的报告结构如下:

  1. 项目背景与目标(占10%):简述数据集来源,明确建模目标,说明报告要解决的问题
  2. 数据处理与探索性分析(占25%):数据清洗、时间戳处理、Session切分,配上可视化和分析结论
  3. 特征工程(占30%):特征构造逻辑、特征说明表、特征重要性分析
  4. 模型构建与评估(占25%):模型选择理由、调参过程、模型对比实验、评估指标分析
  5. 总结与展望(占10%):遇到的问题、解决方案、项目不足、后续改进方向

这个结构的核心思路是:让读者跟着你的思路走一遍,每个环节都有“做了什么”和“为什么这么做”

6.2 常见扣分点

根据我批改大作业的经验,以下问题是最常见的扣分点:

  • 实验报告通篇贴代码,没有一句分析解释。代码是工具,不是报告的主体。
  • 只写模型结果,不写特征工程细节,仿佛模型是从天而降的。
  • 调参过程缺失,直接给一个最终结果,没有任何对比实验。
  • 可视化图片不标轴含义、不加解释文字。
  • 没有分析错误案例。比如模型预测错误时,预测错的是哪些样本,为什么测错。

说实话,最后一条最容易被忽略,但也最能体现你的思考深度。我建议你从测试集里找出几个预测错误的样本,看看它们的特征分布,尝试在报告中分析为什么会预测错。哪怕是简单的“这个用户历史行为特征较少,模型难以判断其购买倾向”,也比完全不提要强得多。

7. 踩坑记录与避坑清单

这部分是我最想分享的内容。这个项目我前后做了不止一遍,踩过不少坑,有些坑的排查过程让我印象深刻,希望能帮你少走弯路。

7.1 数据层面的坑

第一个坑是ID精度丢失。用户ID和商品ID都是超过int32范围的大整数,如果你直接用pandas默认的int64读取,某些环境可能没问题,但如果你不小心转成int32,或者用Excel打开数据文件,就会出现ID精度丢失的问题。我在代码里用dtype参数显式指定为字符串类型,一劳永逸。

第二个坑是负样本构造。构造Session级别的样本时,如果一个Session只有“浏览”行为,没有购买,这个样本是负样本。但有部分Session的行为数量特别少(比如只有1条浏览记录),这类样本信息量极少,训练出的模型对它们几乎是“瞎猜”。后来我在构造样本时加了一个过滤条件:Session行为数量大于等于3才保留。这个过滤操作让模型的AUC提升了将近2个百分点。

第三个坑是测试集泄漏。用全量数据构造特征再切分数据集,就是典型的数据泄漏。我在第3.1节提过这个问题,但这里要再强调一遍:构造特征必须在时间切分之后,用训练集统计特征,再用这些统计逻辑去处理测试集。我第一次跑的时候没注意这个问题,AUC高达0.99,当时还很兴奋,后来复盘才发现是数据泄漏了。老师要是看到这个AUC,第一反应也是怀疑。

7.2 代码与工程层面的坑

内存不足是最常见的运行问题。1亿行的DataFrame在内存里可能占用好几个GB,如果加上特征工程的中间结果,内存很容易爆掉。我的解决方案是:

  • 用到哪些列就只加载哪些列,用usecols参数指定
  • 中间结果及时释放,不用的DataFrame用del删除并gc.collect()
  • 能聚合的先聚合,不要一直停留在行级别的明细数据上

另外一个效率优化点:groupby之后如果要合并多个聚合统计量,建议一次性聚合完,而不是分多次groupby再merge。因为多轮groupby的耗时和内存开销都是重复的,合并时还可能引入列名冲突。

7.3 时间规划建议

如果你是一个人在做这个大作业,我建议按照下面的时间比例来规划:

  • 数据探索与预处理:30%的时间
  • 特征工程:30%的时间
  • 模型训练与调参:20%的时间
  • 结果分析与报告撰写:20%的时间

千万别把80%的时间花在模型调参上。因为在大作业这个场景里,特征工程和结果分析带来的收益远大于模型参数细微调整的收益。我见过太多同学在LightGBM调参上耗了整整两天,最后报告里的特征分析只有三行字。

根据我的个人经验,最推荐的工作流是:先快速跑通一份baseline(用逻辑回归+基础特征),确保整个pipeline畅通,再逐步迭代优化特征和模型。这样即使中途出了问题,你手里也始终有一份能交的成果,不会到最后一天手忙脚乱。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 17:32:09

Delphi UniDAC 10.3.0 完整源码版安装、配置与高级应用实战指南

简介:本资源是专为 Delphi 13.0 FireMonkey(D13 FS)开发者打造的 UniDAC 10.3.0 完整源码版,面向中高级 Delphi 跨平台数据库应用开发人员,解决多数据库统一接入、零依赖部署与移动端适配等核心痛点。压缩包共 938 个文…

作者头像 李华
网站建设 2026/8/30 17:32:00

运行时行为差异对比:用RealDiff守护PR语义一致的工程实践

做 Code Review 的时候,最怕遇到的问题往往不是代码格式,也不是变量命名,而是“代码看起来没变,行为却悄悄变了”。尤其在一个动辄改动十几个文件、横跨多个模块的 Pull Request 里,评审者很难只凭肉眼判断一次重构是否…

作者头像 李华
网站建设 2026/8/30 17:31:58

AI Agent从Demo到独立服务:任务调度、状态持久化与可观测性改造

Manus 这类 AI 智能体产品成为热点后,最常见的讨论是它的执行能力和商业前景。当“独立运营”这类消息出现时,技术团队的第一反应往往是另一个问题:一个能在演示视频里跑通的 Agent,距离一个能独立接受真实用户流量、持续迭代、出…

作者头像 李华
网站建设 2026/8/30 17:31:54

Bending Spoons 收购 Airtable:用户应对策略与迁移评估指南

Bending Spoons 收购 Airtable,交易金额约 22 亿美元。这件事如果只当普通科技新闻扫一眼,很容易滑过去。但对正在用 Airtable 管理项目、客户、库存,甚至把自动化流程跑在它上面的团队来说,这其实是一条需要停下来做一次“系统体…

作者头像 李华
网站建设 2026/8/30 17:31:49

C++实现KTV点歌系统:从数据结构到完整项目实战

简介:数据结构是计算机程序设计的基石,链表、队列、查找与排序等核心概念,直接决定了系统在真实场景中的性能与可维护性。以KTV点歌系统为例,它既包含歌曲库的存储与检索,也涉及已点队列的动态管理——这恰好覆盖了顺序…

作者头像 李华
网站建设 2026/8/30 17:31:02

AI编程Agent工程实践:从Devin到最小实现

AI 编程 Agent 赛道近来最受关注的公司是 Cognition——它打造的 Devin 被描述为“AI 软件工程师”。一条公开融资消息称,该公司正在洽谈新一轮融资,估值中枢可能达到 400 亿美元($40B)量级。融资数字本身会随谈判变化&#xff0c…

作者头像 李华