news 2026/8/28 7:14:28

微分方程建模实战:从SIR传染病模型到数值求解与参数优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微分方程建模实战:从SIR传染病模型到数值求解与参数优化

1. 从“黑箱”到“白箱”:微分方程在数学建模中的核心地位

干了这么多年建模,从学生时代的国赛美赛,到后来带团队解决工业界的实际问题,我越来越觉得,微分方程是连接抽象数学与现实世界最结实的一座桥梁。很多人一听到“微分方程”四个字就头疼,觉得那是数学系高年级的专属,充满了复杂的符号和求解技巧。但我想说,在建模的语境下,微分方程更像是一种强大的“翻译工具”和“预言工具”。它的核心价值不在于你能否徒手解出一个漂亮的理论解,而在于你能否用一组微分方程,精准地描述一个动态系统“变化的规律”。

简单来说,当我们面对一个随着时间、空间或其他变量不断演化的系统时——比如传染病如何扩散、股价如何波动、化学反应如何推进、甚至一杯热水如何变凉——我们最自然的想法就是去刻画它的“变化率”。微分方程,正是描述这种“变化率”与系统自身状态之间关系的数学语言。它把那个看似混沌的“黑箱”系统,变成了一个内部机制相对清晰的“白箱”模型。通过建立并分析这个方程,我们就能预测未来、回溯过去,或者理解哪些因素在主导整个演变过程。无论你是理工科学生备战数模竞赛,还是工程师需要分析系统动力学,掌握用微分方程建模的思想,都相当于掌握了一门洞察事物本质的“内功”。

2. 微分方程建模的核心思想与分类选择

2.1 核心思想:从“导数”到“方程”的建模逻辑

微分方程建模的起点,永远是物理规律、经济原理或生物机制。它的核心思想可以概括为:寻找守恒律,表达变化率

举个例子,经典的“人口增长模型”。我们假设一个封闭区域的人口数量为N(t),它是时间t的函数。最朴素的观察是:单位时间内新增的人口,可能与现有人口成正比(因为生育行为主要来自现有个体)。那么,“单位时间内新增的人口”就是人口数量的变化率,即导数dN/dt。于是我们得到方程:dN/dt = r * N。这里,r就是比例系数(净增长率)。你看,一个简单的微分方程dN/dt = rN就抓住了“人口增长与现有人口成正比”这一核心假设。这就是用微分表达变化,用方程建立关系

再比如牛顿冷却定律:物体的冷却速率(温度T对时间t的导数dT/dt)与物体和环境的温差(T - T_env)成正比。于是有dT/dt = -k(T - T_env),负号表示温度下降。这个方程本身,就是那条物理定律的数学化身。

所以,建模的第一步,也是最关键的一步,不是去翻《常微分方程教程》,而是深入你的问题背景,问自己:这个系统中,哪些量在变化?它们的变化速度(导数)由什么决定?是取决于它们自身的当前值,还是取决于外部输入,或是与其他变量相互作用的结果?把这种依赖关系用数学等式写出来,微分方程的雏形就有了。

2.2 模型分类:如何为你的问题匹配合适的方程类型

面对具体问题,选择哪一类微分方程至关重要。选对了,问题可能迎刃而解;选错了,要么无法求解,要么模型失真。主要分为以下几类:

1. 常微分方程(ODE)与偏微分方程(PDE)这是最根本的分类,取决于未知函数依赖于几个自变量。

  • 常微分方程(ODE):未知函数是一元函数(如只依赖于时间t),方程中只出现对这个单一自变量的普通导数。例如,描述单摆运动的方程d²θ/dt² + (g/L) sinθ = 0,角度θ只与时间t有关。ODE适合描述集中参数系统,即系统的状态可以用有限个随时间变化的量(如人口数、火箭速度、电路电流)来描述,这些量在空间上是均匀的或被视为一个整体。
  • 偏微分方程(PDE):未知函数是多元函数(如同时依赖于时间t和空间位置x),方程中出现偏导数。例如,描述热量在金属棒中传播的热传导方程∂u/∂t = α ∂²u/∂x²,温度u是时间t和位置x的函数。PDE适合描述分布参数系统,即系统的状态在空间上是连续变化的,如流体速度场、温度场、声波压力场。

选择心法:如果你的问题涉及“场”的分布(温度场、浓度场、应力场),或者现象明确在空间中有扩散、传播、波动行为,优先考虑PDE。如果问题对象是一个整体或质点,状态不随空间位置连续变化,用ODE就够了。在数模竞赛中,ODE模型更为常见,PDE则对数学能力要求更高。

2. 线性与非线性

  • 线性方程:未知函数及其各阶导数都以一次幂形式出现,且不包含它们的乘积项。例如y'' + p(x)y' + q(x)y = g(x)。线性方程理论成熟,通常有叠加原理,求解(无论是解析解还是数值解)相对容易、稳定。
  • 非线性方程:方程中包含未知函数或其导数的非线性项(如,sin(y),y * y')。例如,描述种群竞争的逻辑斯蒂方程dN/dt = rN(1 - N/K)就是非线性的(含有项)。非线性方程能描述更丰富、更复杂的现象,如混沌、分岔、多稳态,但求解和分析难度急剧增加,通常依赖数值方法。

选择心法:在保证模型合理性的前提下,尽量先尝试线性化。如果非线性项是本质的、不可忽略的(如种群竞争、神经元的激活函数),那就必须面对非线性模型,并准备好使用数值仿真和相图分析等工具。

3. 阶数与初/边值条件

  • 阶数:方程中出现的最高阶导数的阶数。高阶方程可以通过引入新变量(如令v = dy/dt)转化为一阶方程组。在数值计算中,几乎所有ODE求解器都是为一阶方程组设计的。所以,遇到高阶方程,化为一阶方程组是标准操作
  • 定解条件:微分方程通解包含任意常数,要确定特解需要附加条件。
    • 初值问题(IVP):对于ODE,给出在初始时刻t0的函数值(及各阶导数值)。例如,已知初始人口N(0)=N0。这对应着从某个起点开始演化的动态过程。
    • 边值问题(BVP):对于ODE或PDE,给出在自变量区域边界上的条件。例如,描述两端固定的弦振动,需要给出两个端点的位移条件。BVP的求解通常比IVP更复杂。

3. 五步构建法:从实际问题到微分方程模型

建立一个可用的微分方程模型,我习惯将其拆解为五个步骤。我们以一个经典的“传染病模型(SIR模型)”为例来贯穿说明。

3.1 第一步:明确变量与参数(定义你的“演员表”)

这是建模的地基,必须清晰无歧义。把系统中所有重要的、随时间(或空间)变化的量定义为状态变量,把所有不随时间变化、但会影响变量之间关系的量定义为参数

  • 对于SIR模型
    • 状态变量
      • S(t): 易感者数量,时刻t未患病但可能被感染的人数。
      • I(t): 感染者数量,时刻t已患病且具有传染性的人数。
      • R(t): 康复者数量,时刻t已痊愈并获得免疫力(或死亡)的人数。
    • 核心参数
      • β: 感染率,一个感染者单位时间内有效接触并传染易感者的概率与接触率的乘积。它衡量疾病的传播能力。
      • γ: 康复率,单位时间内感染者康复(或移除)的比例的倒数,即平均感染期1/γ。它衡量医疗水平或疾病自愈速度。
    • 隐含假设/常数
      • 总人口N = S(t) + I(t) + R(t)假设为常数(不考虑出生死亡和迁移)。
      • 康复者获得永久免疫力,不再被感染。

实操心得:务必为每个变量和参数注明单位!β的单位是1/(时间*人数)吗?仔细推敲:新感染人数ΔI应正比于S * I(接触机会),所以β的实际量纲是1/(时间),它隐含了“人均接触率”。这个细节在后续参数估计和数值计算中至关重要,能帮你发现公式推导的错误。

3.2 第二步:建立变化关系(编写“剧本”)

这是建模的灵魂。针对每个状态变量,思考其“来源”和“去路”,即哪些过程使其增加,哪些过程使其减少。用文字或流程图描述这些过程,然后将其翻译成数学表达式。

  • 对于SIR模型
    • 易感者S的变化:只减少,不增加。减少的原因是“被感染”。新感染人数与易感者数量S和感染者数量I都成正比(接触原理),所以减少速率为-β * S * I。因此:dS/dt = -β S I
    • 感染者I的变化:有增有减。增加来源于易感者被感染,即β S I;减少来源于康复(或移除),假设康复速率与I成正比,即γ I。因此:dI/dt = β S I - γ I
    • 康复者R的变化:只增加,不减少。增加来源于感染者的康复,即γ I。因此:dR/dt = γ I

至此,我们得到了SIR模型的核心方程组:

dS/dt = -β S I dI/dt = β S I - γ I dR/dt = γ I

这是一个非线性(因为含有S I项)、自治(方程右边不显含时间t)的一阶常微分方程组。

3.3 第三步:确定定解条件(设定“故事起点”)

模型描述了一般规律,具体到一次特定的疫情,我们需要知道起点。

  • 对于SIR模型,这是一个初值问题。假设疫情开始时,有一个初始感染者:S(0) = S0(接近总人口N)I(0) = I0(一个很小的数,如1)R(0) = 0

3.4 第四步:模型求解与分析(运行“模拟器”)

对于像SIR这样的非线性方程组,求解析解极其困难。数值求解是绝对主流和实用的方法。以Python为例,使用scipy.integrate.solve_ivp是标准操作。

import numpy as np from scipy.integrate import solve_ivp import matplotlib.pyplot as plt # 1. 定义微分方程组 def sir_model(t, y, beta, gamma): S, I, R = y dSdt = -beta * S * I dIdt = beta * S * I - gamma * I dRdt = gamma * I return [dSdt, dIdt, dRdt] # 2. 设置参数和初值 N = 1000 # 总人口 I0, R0 = 1, 0 S0 = N - I0 - R0 beta = 0.3 # 感染率 gamma = 0.1 # 康复率,对应平均感染期10天 params = (beta, gamma) y0 = [S0, I0, R0] # 3. 定义时间区间 t_span = [0, 160] # 模拟160天 t_eval = np.linspace(0, 160, 200) # 输出时间点 # 4. 数值求解 solution = solve_ivp(sir_model, t_span, y0, args=params, t_eval=t_eval, method='RK45') # 5. 提取结果并绘图 S, I, R = solution.y plt.figure(figsize=(10,6)) plt.plot(solution.t, S, label='Susceptible') plt.plot(solution.t, I, label='Infected', linewidth=2) plt.plot(solution.t, R, label='Recovered') plt.xlabel('Time (days)') plt.ylabel('Population') plt.title('SIR Model Simulation (β=0.3, γ=0.1)') plt.legend() plt.grid(True) plt.show()

求解之后的分析更为关键:

  • 结果可视化:如上图,观察各人群比例随时间的变化。感染者曲线是否出现峰值?峰值何时到来?最终有多少人会被感染?
  • 关键指标计算
    • 基本再生数 R0:这是一个极其重要的阈值参数。在SIR模型中,R0 = β / γ。它表示一个感染者在完全易感人群中平均能传染的人数。
      • R0 > 1,疫情会蔓延(感染者曲线先升后降)。
      • R0 < 1,疫情会逐渐消失。
    • 疫情峰值与规模:通过数值解可以找到感染者I(t)的最大值及其发生时间,以及最终康复者R(∞)的数量(即总感染规模)。
  • 参数敏感性分析:改变βγ,观察曲线如何变化。例如,模拟“加强社交距离”(降低β)或“提高医疗效率”(提高γ,即缩短感染期)对疫情发展的影响。这能为政策建议提供定量依据。

3.5 第五步:模型检验与改进(“复盘”与“迭代”)

将模型输出与现实数据(如果可得)进行对比。SIR模型是基础,它有很多强假设(如均匀混合、无潜伏期、永久免疫)。如果拟合不好,就需要改进模型,这正是建模的深化过程。

  • 考虑潜伏期:引入暴露者E(t),变为SEIR模型。方程变为:dS/dt = -β S IdE/dt = β S I - σ E(σ是潜伏期倒数)dI/dt = σ E - γ IdR/dt = γ I
  • 考虑免疫力丧失:康复者可能再次变为易感者,在SIR方程的dS/dt中增加一项+ωR(ω是免疫力丧失率),dR/dt中相应减少,变为SIRS模型。
  • 考虑年龄结构、空间异质性:这会将ODE模型推向PDE模型或元胞自动机等复杂模型。

注意事项:模型改进一定要有驱动。是数据拟合不佳?还是现实机制本身就更复杂?不要为了复杂而复杂。每次只增加一个最关键的机制,观察其影响,这比一开始就构建一个庞杂的模型更有价值。

4. 数值求解实战:工具选择与关键陷阱

绝大多数有实际价值的微分方程模型都依赖数值求解。这里重点分享工具使用和避坑经验。

4.1 求解器选择:用什么工具“算”

对于初值问题(IVP),scipy.integrate.solve_ivp是Python中的瑞士军刀。它封装了多种算法:

  • RK45(默认):显式Runge-Kutta法,适用于大多数非刚性问题。它是自适应步长的,在解平滑的区域用大步长提高效率,在变化剧烈的区域自动加密步长保证精度。
  • RK23:低阶RK法,有时比RK45更高效。
  • DOP853:高阶RK法,对高精度要求的问题更好。
  • Radau,BDF:适用于刚性(Stiff)问题

什么是刚性问题?简单比喻:系统里同时存在“快变”和“慢变”的过程。如果用普通方法(如RK45)求解,为了捕捉快变过程的稳定性,步长必须取得非常小,导致计算整个慢变过程耗时极长,甚至失败。典型例子:某些化学反应动力学,其中一些反应物浓度急速下降,另一些缓慢变化。

判断与处理刚性:如果你的模型参数差异巨大(如β=1000,γ=1),或者数值求解时步长被自动压到极小、计算奇慢、甚至出现溢出错误,很可能遇到了刚性问题。这时应换用隐式方法如‘BDF’‘Radau’

# 处理可能刚性的问题 solution_stiff = solve_ivp(model, t_span, y0, args=params, method='BDF', rtol=1e-6, atol=1e-9)

4.2 参数与步长:如何“算得准”又“算得快”

  • 容差参数rtolatol:这是控制精度的关键。rtol(相对容差)和atol(绝对容差)共同决定了局部误差的允许范围。求解器会自适应调整步长,使得局部误差小于atol + rtol * abs(y)。通常设置rtol=1e-31e-6atol=1e-6或更小。对于数值量级差异很大的变量(如人口数S是1e6,感染者I初始是1),设置atol为一个向量,分别为不同变量指定绝对容差,可以避免小变量被误差淹没。
    atol_vector = [1e-6, 1e-8, 1e-6] # 对应[S, I, R]的绝对容差 solution = solve_ivp(sir_model, t_span, y0, args=params, rtol=1e-4, atol=atol_vector)
  • 时间点t_evalt_eval参数指定你希望输出解的时间点序列。求解器内部会采用自适应步长计算,但最终输出会插值到你指定的这些时间点上。这保证了输出结果的规整,便于绘图和后续处理。注意,t_eval并不影响求解器内部的步长选择。

4.3 常见数值问题与调试技巧

  1. 解发散到无穷大:首先检查模型公式是否正确,特别是正负号。在SIR模型中,如果误将dS/dt写成+βSI,易感者会越感染越多,显然爆炸。其次,检查参数数量级。如果β设置得过大(如100),传播速度极快,数值上可能溢出。最后,对于某些模型,解本身就可能趋向无穷(如无限制的指数增长),这需要从模型机理上理解。

  2. 解震荡或不稳定:可能是步长太大导致的数值不稳定。尝试减小容差(rtol,atol),迫使求解器使用更小的步长。如果问题本身是刚性的,换用隐式方法(BDF)通常能有效抑制震荡。

  3. 计算速度极慢:除了可能是刚性问题,还要检查模型函数(如sir_model)的实现效率。避免在函数内部进行不必要的循环或复杂运算。如果模型非常复杂,可以考虑使用Numba库对函数进行即时编译加速。

  4. 结果与预期或理论不符:进行量纲检查特殊情形验证。例如,在SIR模型中,检查总人口S+I+R是否恒定(应为一个常数)。可以添加一个断言在模型函数中:

    def sir_model(t, y, beta, gamma): S, I, R = y dSdt = -beta * S * I dIdt = beta * S * I - gamma * I dRdt = gamma * I # 验证守恒量(可选,正式代码可去掉) # assert abs(dSdt + dIdt + dRdt) < 1e-12, f"Total population not conserved!" return [dSdt, dIdt, dRdt]

    另外,可以设置极端参数测试。令β=0,应没有任何感染发生,I(t)恒为初值。令γ极大,感染者应立即被移除,这些测试能快速定位代码逻辑错误。

5. 从竞赛到实战:微分方程建模的进阶场景

掌握了基础ODE建模和数值求解后,可以挑战更复杂的场景,这些在数模竞赛和实际研究中都很常见。

5.1 含时变参数或外部控制的模型

现实中的参数往往不是常数。例如,感染率β可能随着公众意识提高或政府干预(如封控)而随时间下降。我们可以将β定义为时间的函数β(t)

def beta_func(t): # 例如:前50天正常,50天后由于干预,感染率减半 if t < 50: return 0.3 else: return 0.15 def sir_model_with_varying_beta(t, y): S, I, R = y beta_t = beta_func(t) # 获取当前时间的beta值 dSdt = -beta_t * S * I dIdt = beta_t * S * I - gamma * I dRdt = gamma * I return [dSdt, dIdt, dRdt]

这使模型能模拟动态政策的影响。更复杂的,β本身可能依赖于状态变量,例如医疗资源紧张时γ(康复率)下降,这需要建立更复杂的耦合关系。

5.2 微分方程与优化/拟合的结合

模型参数(如β,γ)通常是未知的,需要通过实际数据来估计。这就将微分方程求解问题与优化问题结合了起来。

思路:定义一个损失函数,衡量模型输出与真实数据之间的差距(如最小二乘法),然后使用优化算法(如scipy.optimize.least_squares,curve_fit)调整参数,使损失最小。

from scipy.optimize import minimize def loss(params, true_data_t, true_data_I): beta_est, gamma_est = params # 使用估计参数运行模型 sol = solve_ivp(sir_model, [t_min, t_max], y0, args=(beta_est, gamma_est), t_eval=true_data_t, rtol=1e-6) model_I = sol.y[1] # 获取感染者I的模型预测值 # 计算与真实感染者数据 true_data_I 的均方误差 mse = np.mean((model_I - true_data_I)**2) return mse # 初始参数猜测 initial_guess = [0.2, 0.05] # 执行优化 result = minimize(loss, initial_guess, args=(observed_days, observed_infected), bounds=[(0.001, 1), (0.001, 0.5)]) fitted_beta, fitted_gamma = result.x

这个过程称为参数反演模型校准,是让理论模型贴合实际的关键一步。注意,优化问题可能非凸,存在多个局部最优解,需要尝试不同的初始猜测,并对结果进行合理性检验。

5.3 随机微分方程:引入不确定性

经典的微分方程是确定性的,给定初值和参数,未来轨迹唯一确定。但现实世界充满随机性,如传染病的接触是随机的。这时需要随机微分方程(SDE)

SIR模型可以转化为随机版本,例如,将感染事件和康复事件视为随机过程(泊松过程)。数值求解SDE常用欧拉-丸山法等。虽然SDE更真实,但计算复杂,结果表现为一组随机轨迹,需要多次模拟进行统计分析。

# 概念性伪代码,展示思路 def sde_sir_simulation(beta, gamma, S0, I0, R0, T, dt): steps = int(T/dt) S, I, R = np.zeros(steps+1), np.zeros(steps+1), np.zeros(steps+1) S[0], I[0], R[0] = S0, I0, R0 for i in range(steps): # 计算确定性变化率 dS_det = -beta * S[i] * I[i] dI_det = beta * S[i] * I[i] - gamma * I[i] dR_det = gamma * I[i] # 引入随机波动(此处为简化示例,实际需根据模型结构添加噪声项) noise_S = np.random.normal(0, scale=0.01) # 噪声强度需根据模型设定 noise_I = np.random.normal(0, scale=0.01) # 更新状态(欧拉离散化) S[i+1] = S[i] + (dS_det * dt) + noise_S * np.sqrt(dt) I[i+1] = I[i] + (dI_det * dt) + noise_I * np.sqrt(dt) R[i+1] = R[i] + dR_det * dt # 假设R的随机性可忽略或合并 return S, I, R

在竞赛中,除非题目明确要求或数据强烈显示随机性,否则通常从确定性模型入手。随机模型是更高级的武器。

6. 避坑指南与心得总结

回顾这些年的建模经历,新手在微分方程建模上最容易踩的坑,我总结了以下几点:

  1. 忽视量纲一致性:这是最隐蔽也最致命的错误。方程两边的物理量纲必须一致。检查每一项的量纲,能帮你发现系数遗漏、正负号错误等根本性问题。养成给每个参数和变量标注单位的习惯。

  2. 混淆“变化率”与“变化量”:微分方程描述的是瞬时变化率(导数),如dI/dt每时每刻感染者数量的变化速度。而β S I单位时间内的新感染人数。在从离散事件(如“每天新增100人”)推导连续模型时,要理解“率”的概念。

  3. 参数物理意义模糊:像β这样的复合参数,必须明确其物理意义(有效接触率×传染概率)。在参数估计或政策分析时,你调整的到底是接触率还是传染概率?这决定了政策含义。永远不要只把参数当作一个拟合曲线的数字。

  4. 过度追求解析解:除了少数简单模型(如指数增长、逻辑斯蒂增长),绝大多数微分方程,尤其是非线性方程组,是得不到解析解的。尽早转向数值求解是务实的选择。数值解并不低等,它是解决实际问题的主要手段。

  5. 忽略模型假设的局限性:SIR模型假设人口均匀混合、免疫力永久等。如果你的模型结果与现实偏差很大,首先要回头审视这些假设是否成立,而不是盲目调整参数。扩展模型(如SEIR, SIRS)正是为了放松这些假设。

  6. 数值求解不设置容差:直接使用默认设置有时会导致精度不足,特别是当变量数值跨度大时。根据问题精度要求,主动设置rtolatol。对于结果有疑问时,逐步减小容差,看解是否收敛。

  7. 不会做敏感性分析:模型建好不是终点。通过系统性地改变关键参数(如β±10%),观察输出结果(如峰值感染人数、疫情结束时间)的变化程度,可以识别出对系统影响最大的“杠杆参数”,这往往比模型预测的具体数值更有洞察力。

微分方程建模是一个“思考-翻译-计算-检验-再思考”的循环。它要求你对现实世界有深刻的洞察,又能用严谨的数学语言进行表述,最后还要借助计算工具来验证和探索。这个过程充满挑战,但也正是其魅力所在。当你看到自己写下的几行方程,通过计算机的运算,复现出某种社会、自然现象的宏观动态时,那种透过表象触及规律的成就感,是无可替代的。从今天起,试着用微分方程的视角去观察身边那些变化的事物,你会发现,数学真的是一种描述世界的语言。

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

012-方法学比较

方法学比较 分析目的 方法学比较&#xff08;method comparison&#xff09;评价候选方法&#xff08;candidate&#xff09;与参考方法&#xff08;reference&#xff09;在相同样本上 测得结果的一致性&#xff0c;对应 CLSI EP09。ivdtools 的 mcr() 提供一个渐进式 S3 工作…

作者头像 李华
网站建设 2026/8/28 7:06:15

基于Parser解析的车辆重识别:从语义分割到精准检索的实战指南

简介&#xff1a;计算机视觉中的目标重识别技术旨在解决跨摄像头、跨场景下的同一目标检索问题&#xff0c;其核心原理是通过深度学习模型学习具有判别力的特征表示&#xff0c;实现精准匹配。这项技术在安防监控、智能交通等领域具有重要价值&#xff0c;能够应用于车辆追踪、…

作者头像 李华
网站建设 2026/8/28 7:05:26

200+ 插件!这个仓库收集了几乎所有的 DeepSeek Harness 插件!

大家好&#xff0c;我是 Java陈序员。 如果你最近有关注 AI Agent 开源生态&#xff0c;一定听说过 DeepSeek Harness&#xff08;简称 DSH&#xff09; —— DeepSeek 开源的智能体框架。 DeepSeek Harness 不是新模型&#xff0c;不是新聊天界面&#xff0c;而是一套让大模型…

作者头像 李华
网站建设 2026/8/28 7:04:46

从黑盒到白盒:构建模块化RAG系统的核心组件与工程实践

简介&#xff1a;检索增强生成&#xff08;RAG&#xff09;系统通过结合信息检索与大型语言模型&#xff08;LLM&#xff09;的能力&#xff0c;有效解决了大模型知识更新滞后与幻觉问题。其核心原理是将外部知识库向量化后&#xff0c;根据用户查询进行语义检索&#xff0c;并…

作者头像 李华