5D Library › 本草的分子与风土 · English

第六章 批次间波动与分析证明书

证明书是什么

分析证明书(Certificate of Analysis,COA)是针对某一个已标识批次、写明做了哪些检测、用什么方法、得到什么结果、对照什么限度的文件。买家看不到一袋干茎或一桶粉末里面,COA 是他了解里面有什么的主要途径。一份好的 COA 回答六个问题:

  1. 哪一批? 一个能追溯到某次采收或某次生产的批号。
  2. 谁检测的? 一个实验室,最好是相关项目通过 ISO/IEC 17025 认可的实验室,意味着有独立机构核查过它的能力和质量体系 (International Organization for Standardization 2017)。
  3. 用什么方法? 写明方法名称(药典正文、ISO 或 AOAC 方法,或经过验证的内部方法),因为如第二、四章所示,方法不同,数字就不同。
  4. 对照什么限度? 产品销售地适用的规格。
  5. 结果是多少,不确定度多大? 带单位的数字;接近限度时,还要有测量不确定度的估计。
  6. 样品怎么来的? 样品是怎样抽取的,因为对一份没有代表性的样品做再完美的分析,也说明不了整批货。

用于放行检验的分析方法应当在准确度、精密度、专属性、检测限与定量限、线性和范围等方面经过验证;药品领域的国际指导原则 ICH Q2(R2) 说明了每一项的含义和证明方法 (International Council for Harmonisation 2023),食品和草药实验室使用的是同样的思路。

抽样:通常被省略的那一步

质量控制中的大多数错误,发生在样品到达实验室之前。一批农产品并不均匀:来自不同植株的茎、田间不同位置的根茎、不同苗床的浆果。两类问题需要两种不同的抽样。

第一类问题是:整批中是否有任何地方出了问题? 霉变、异物或某一袋被污染,可能只影响一批中的一部分。如果受影响的单元占比为 pp,随机抽取 nn 个单元,至少抽到一个的概率是 1−(1−p)n1 – (1-p)^n。第二类问题是:平均值是多少? 对多糖含量这类性质,要把均值估计到误差 dd 以内,需要的单元数取决于单元之间差异有多大。

推导

要抽多少个单元,才能发现只影响一批中一部分的问题;要抽多少个单元,才能把平均值估计到给定精度。

import math

# 1. Finding a problem that affects only part of a lot (e.g. mould in some
#    bags). With n independent units drawn at random, the chance that at
#    least one is affected is 1 − (1 − p)^n.
def units_needed(p, confidence=0.95):
    return math.ceil(math.log(1 - confidence) / math.log(1 - p))

for p in (0.20, 0.05, 0.01):
    print(f"{100 * p:4.0f} % of units affected: sample {units_needed(p):3d} "
          f"units for a 95 % chance of catching at least one")

# 2. Estimating an average (e.g. polysaccharide %) to within ± d with 95 %
#    confidence when units vary with standard deviation s: n = (1.96 s / d)².
for s, d in ((3.0, 1.0), (3.0, 2.0), (6.0, 2.0)):
    n = math.ceil((1.96 * s / d) ** 2)
    print(f"sd {s:.0f} points, margin ± {d:.0f}: {n:3d} units to sample")
#   20 % of units affected: sample  14 units for a 95 % chance of catching at least one
#    5 % of units affected: sample  59 units for a 95 % chance of catching at least one
#    1 % of units affected: sample 299 units for a 95 % chance of catching at least one
# sd 3 points, margin ± 1:  35 units to sample
# sd 3 points, margin ± 2:   9 units to sample
# sd 6 points, margin ± 2:  35 units to sample

要以 95% 的把握发现百分之一单元的缺陷,大约需要抽三百个单元。这就是为什么单靠检测无法保证一批货没有罕见问题,也是为什么过程控制(干净的干燥、合适的储存、批次隔离)比最后的检测更重要。

色谱指纹图谱

对草药材料而言,单一的标志性成分很少能完整代表品质。因此《中国药典》对许多药材采用指纹图谱或特征图谱:把一次高效液相色谱运行得到的全部色谱峰模式,与对照图谱比较。相似度常用一个数字概括,即两组峰面积向量夹角的余弦,或它们的相关系数。

推导

三个批次与对照指纹图谱的相似度,以及单个色谱峰的最大变化。

import math

# HPLC fingerprints as peak areas at the same retention times (invented).
reference = [12.0, 30.5, 8.2, 44.0, 5.1, 19.6, 3.3]
batches = {
    "batch A": [11.4, 31.9, 7.8, 42.6, 5.5, 20.3, 3.0],
    "batch B": [14.8, 24.1, 9.9, 39.0, 7.2, 25.5, 4.6],
    "batch C": [12.5, 29.8, 0.4, 47.3, 5.0, 18.9, 3.4],   # one peak missing
}

def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    return dot / math.sqrt(sum(x * x for x in a) * sum(y * y for y in b))

def correlation(a, b):
    ma, mb = sum(a) / len(a), sum(b) / len(b)
    return cosine([x - ma for x in a], [y - mb for y in b])

for name, peaks in batches.items():
    worst = max(range(len(peaks)), key=lambda i: abs(peaks[i] / reference[i] - 1))
    print(f"{name}: cosine {cosine(reference, peaks):.3f}, "
          f"correlation {correlation(reference, peaks):.3f}, "
          f"largest change at peak {worst + 1} "
          f"({100 * (peaks[worst] / reference[worst] - 1):+.0f} %)")
# batch A: cosine 0.999, correlation 0.998, largest change at peak 7 (-9 %)
# batch B: cosine 0.984, correlation 0.967, largest change at peak 5 (+41 %)
# batch C: cosine 0.990, correlation 0.984, largest change at peak 3 (-95 %)

批次 C 的七个峰中有一个几乎消失了,它与对照图谱的相似度却仍有 0.990,因为大峰主导了得分。只看相似度阈值,它就会合格。一份只报告「相似度 ≥ 0.90」的 COA,恰恰掩盖了买家最想知道的那种变化。规格还应当写明哪些标志峰必须出现,以及各自应落在什么范围。

污染物

植物材料可能携带一些对安全的影响比任何活性成分都大的污染物:从土壤吸收或由空气沉降的重金属(铅、镉、砷、汞);农药残留;黄曲霉毒素等真菌毒素,即霉菌在温暖潮湿条件下储存的根茎和种子上产生的毒素;以及微生物。限度因产品和市场而异:《中国药典》规定药材的限度,国际食品法典的食品污染物通用标准是许多国家食品法规的依据 (Codex Alimentarius Commission 1995),马来西亚《1985 年食品条例》规定在当地销售的食品的限度 (Government of Malaysia 1985)。COA 应当写明对照的是哪一套限度。没有方法、限度和数字的「重金属:合格」,没有用处。

水分活度

水分含量说的是产品含有多少水,水分活度说的是这些水有多「可用」。它的定义是

aw=pp0a_w = \frac{p}{p_0}

即产品上方水的蒸气压,与同温度下纯水上方蒸气压之比。纯水的 aw=1a_w = 1;与相对湿度 30% 的空气达到平衡的产品,aw=0.30a_w = 0.30。与糖、蛋白质和表面结合的水较不可用,所以水分含量相同的两种产品,水分活度可能差别很大。

微生物需要可用的水。每一类微生物都有一个最低水分活度,低于它就不能生长:大多数革兰氏阴性菌约 0.97,大多数革兰氏阳性菌 0.90,金黄色葡萄球菌 0.86,大多数酵母 0.88,大多数霉菌 0.80,嗜旱霉菌和耐高渗酵母约 0.61 (Barbosa-Cánovas et al. 2020; Manitoba Agriculture, n.d.)。使用这些限值的一种简单方法是「γ(gamma)法」:把每个因素看作把生长速率乘上一个 0 到 1 之间的系数;对水分活度而言,这个系数从最低值处的 0 线性上升到 aw=1a_w = 1 时的 1 (Zwietering et al. 1992)。

推导

按 γ 法计算各类微生物在五个水分活度下的相对生长速率。0 表示不能生长。

# Minimum water activity for growth (typical values, see the text).
AW_MIN = {
    "most Gram-negative bacteria": 0.97,
    "most Gram-positive bacteria": 0.90,
    "Staphylococcus aureus":       0.86,
    "most yeasts":                 0.88,
    "most moulds":                 0.80,
    "xerophilic moulds":           0.61,
}

def gamma_aw(aw, aw_min):
    """Relative growth rate (0 to 1) in the 'gamma' approach:
    linear from aw_min (no growth) to aw = 1 (no limitation)."""
    return max(0.0, (aw - aw_min) / (1 - aw_min))

levels = (0.95, 0.85, 0.70, 0.55, 0.30)
print("organism group               " + "  ".join(f"aw {a:.2f}" for a in levels))
for name, m in AW_MIN.items():
    print(f"{name:28s} " + "  ".join(f"{gamma_aw(a, m):7.2f}" for a in levels))
print("growth stops below about 0.6; 0.3 is chosen for texture and slower chemistry")
# organism group               aw 0.95  aw 0.85  aw 0.70  aw 0.55  aw 0.30
# most Gram-negative bacteria     0.00     0.00     0.00     0.00     0.00
# most Gram-positive bacteria     0.50     0.00     0.00     0.00     0.00
# Staphylococcus aureus           0.64     0.00     0.00     0.00     0.00
# most yeasts                     0.58     0.00     0.00     0.00     0.00
# most moulds                     0.75     0.25     0.00     0.00     0.00
# xerophilic moulds               0.87     0.62     0.23     0.00     0.00
# growth stops below about 0.6; 0.3 is chosen for texture and slower chemistry

注

纠正一个常见说法。 常听人说水分活度要低于 0.3 才能抑制微生物生长,这不太准确。所有已知微生物的生长在约 0.6 以下都会停止 (Barbosa-Cánovas et al. 2020)。干燥食品之所以常常控制在 0.2~0.3,远低于这条线,是出于其他原因:在这个范围内许多干燥食品是酥脆而不是发韧的,拉布扎(Labuza)等人画出的「食品稳定性图」也显示,这里褐变反应很慢,脂肪氧化接近最低 (Labuza et al. 1970)。低水分活度还只能阻止生长,并不能杀菌:沙门氏菌等细菌可以在干燥食品中存活数月,遇水后再次生长。所以对干燥产品而言,低水分活度是安全的必要组成部分,而不是安全的保证;干燥前和干燥中的卫生依然必不可少。

对冻干产品来说,水分活度尤其重要,因为它的多孔结构会很快从潮湿空气中吸收水分。一件出机时 awa_w 为 0.2 的产品,如果包装漏气,在热带仓库里可以升到 0.6 以上。

假说 · 尚未验证

尚未确立。 对存放在同样热带仓储条件下的干姜和石斛产品,储存期间水分活度上升的速率,比初始水分含量更能预测之后标志性成分(6-姜辣素;多糖分子量)的损失。如果在储存研究中,初始水分含量预测损失的效果与水分活度上升速率相同或更好,假说就被推翻。

参考文献

Barbosa-Cánovas, Gustavo V., Anthony J. Fontana, Shelly J. Schmidt, and Theodore P. Labuza, eds. 2020. Water Activity in Foods: Fundamentals and Applications. 2nd ed. Wiley-Blackwell; IFT Press.
Codex Alimentarius Commission. 1995. General Standard for Contaminants and Toxins in Food and Feed (CXS 193-1995), as Amended. FAO; WHO.
Government of Malaysia. 1985. Food Regulations 1985 (p.u.(a) 437/1985), Made Under the Food Act 1983, as Amended.
International Council for Harmonisation. 2023. ICH Q2(R2): Validation of Analytical Procedures.
International Organization for Standardization. 2017. ISO/IEC 17025:2017 General Requirements for the Competence of Testing and Calibration Laboratories.
Labuza, T. P., S. R. Tannenbaum, and M. Karel. 1970. “Water Content and Stability of Low-Moisture and Intermediate-Moisture Foods.” Food Technology 24: 543–50.
Manitoba Agriculture. n.d. Water Content and Water Activity: Two Factors That Affect Food Safety. https://gov.mb.ca/agriculture/food-safety/education-resources/water-content-water-activity.html.
Zwietering, M. H., T. Wijtzes, J. C. De Wit, and K. Van ’t Riet. 1992. “A Decision Support System for Prediction of the Microbial Spoilage in Foods.” Journal of Food Protection 55 (12): 973–79.

Fan, Y. (2026). Molecules and Terroir: Polysaccharides of Dendrobium officinale, Gingerols of Zingiber officinale, A-Type Proanthocyanidins and the Mass Transfer of Freeze-Drying [本草的分子与风土] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23693057 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).