让我猜猜:如果不是因为ChatGPT,你大概不会读这本书。
OpenAI于2022年推出了这一开创性模型。与以往模型不同,ChatGPT能够进行自由形式的对话,并协助完成许多日常任务,从撰写文本、编写代码片段,到创意构思和辅助决策。它庞大的知识库和流畅的语言生成能力,再加上对用户指令的理解执行,让人们窥见了生成式AI的未来——一个AI能够像人类一样沟通和理解的时代。ChatGPT的问世是一场具有里程碑意义的事件,堪比谷歌搜索、Facebook、第一代iPhone和特斯拉的发布,仿佛凭空出现,更像魔法而非技术。
然而,尽管表现出色,ChatGPT仍存在局限。它有时表现不稳定,带有偏见,且偶尔会给出事实错误的答案。它的推理能力尚未完善,常基于训练数据中的统计模式生成看似合理的输出。可以说,ChatGPT的热潮点燃了一场生成式AI革命,推动公司和研究者竞相开发并发布自己的大语言模型(LLM)。
注
除非另有说明,本书中谈及文本生成AI时,默认聚焦于大语言模型(LLM)。
这场兴趣的爆发凸显了LLM技术的变革潜力。虽然早期生成式AI系统如2020年推出的GPT-3曾展现出潜力,但ChatGPT让人们不可否认,人机协作的新纪元已经来临。各行各业纷纷抢先将生成式AI整合进产品和服务。与此同时,风险投资大量涌入采用生成式AI的初创企业。那些开发自有核心LLM的公司融资额度更大,动辄数亿乃至数十亿美元。当第一波热潮平息后,业界开始关注训练数据、持续存在的偏见、错误答案以及错误信息传播等具体问题。
开源框架LangChain应运而生,专门针对构建基于ChatGPT等LLM应用所面临的挑战。当Harrison Chase开始开发LangChain时,这更多是一个兴趣项目,而非正式的商业尝试。他的灵感来自与使用LLM开发应用的朋友们的交流。意识到这些应用的复杂性和日常挑战,他创建了一个能够简化LLM相关应用开发流程的框架。LangChain作为一个开源平台,迅速获得关注,吸引了Anthropic、OpenAI、Cohere及其他AI研究机构的贡献者加入。
注
最初的代码合并请求主要集中在构建LangChain的基础元素,包括提示结构、LLM对象及链条(如数学、Python和搜索功能)。
第3章将更详细地讨论LangChain。现在,我们先专注于理解语言模型的工作原理、现有的LLM类型、它们之间的差异、规模是否重要以及文本生成的方式。
生成式AI领域广阔且快速发展。各种生成式AI模型能够合成和转换文本、音频及视觉内容,如图2-1所示。来自OpenAI、谷歌、微软等科技公司的多种文本转音频/图像/视频/3D/代码(及其逆向)模型层出不穷,还有众多开源项目。文本是图2-1中大多数转换的通用连接纽带,因为训练数据主要包含文本↔代码、文本↔图像等形式的配对数据。本书将通过文本实现代理间的沟通,构建助手和团队,生成实验方案、创建报告并完成各种任务。此外,我们还将扩展至文本转科学格式的应用,如生成和可视化分子及DNA序列。
毫不意外,生成式AI生态系统的核心属于语言模型,其中数学实体负责预测句子中接下来的词元(目前可以把词元理解为单词,后面章节会详细讲解)。这些大语言模型(LLM)在所用参数数量上差异巨大。参数是模型中从训练数据中学习到的变量,基本上参数决定了模型通过发现模式和统计关系来模拟理解能力,猜测缺失的词语和上下文,并生成类人文本的能力。参数规模从仅有数百万的小模型,到拥有数万亿参数的巨型模型不等。这种规模多样性使得LLM能应用于从简单问答到复杂推理等广泛场景。
训练大型语言模型需要巨大的计算资源,GPU凭借其并行计算能力成为该过程的中坚力量。训练数千亿参数的大型商业模型通常使用NVIDIA A100或H100等高端数据中心GPU,这需要多个GPU集群和数月训练时间。内存需求尤其庞大,因为模型权重、梯度、优化器状态及训练批次都必须存储在GPU内存中。
参数少于200亿的小型LLM可以使用消费级GPU(如NVIDIA RTX 4090,配备24GB显存)进行训练或微调,常用技术包括参数高效微调(PEFT)、量化和梯度检查点。LoRA(低秩适配)等技术通过只更新微调时一小部分参数,显著降低了内存需求。8位或4位量化训练则通过用比标准32位浮点数更少的位数表示权重,进一步节省内存。LLM训练的普及使研究人员、爱好者和小型公司能够在数小时或数天内(而非数周数月)打造适合特定应用的专用模型,无需企业级基础设施。
注
OpenAI使用了近30万个CPU核和1万个V100 GPU的超级计算机训练GPT-3。GPT-3拥有1750亿参数,其训练费用估计约为1000万美元,耗电约1300兆瓦时,相当于约125户美国家庭一年的用电量。
在这些模型上执行推理(即实时生成文本)涉及大量数学运算,需用能够并行处理的专用GPU。然而,所需GPU资源昂贵,促使AI工程师利用RunPod、UbiOps等计算平台,或租用云端GPU资源以支持LLM工作负载。这凸显了LLM应用的高算力需求及GPU的核心地位。
Hugging Face已成为LLM生态的重要枢纽,提供开源模型库、微调工具、性能排行榜及训练和评估数据集。该平台简化了访问和使用LLM的流程,涵盖从模型权重到授权信息的一站式服务。
应用程序接口(API)是一套规则和协议,使不同软件应用能够互相通信。它定义了应用请求和交换信息的方法及数据格式。API作为中介,使程序间交互无需了解对方内部实现细节。在实验室环境中,API类似于标准化的实验操作流程,就像实验方案为研究人员提供具体步骤、所需试剂及预期结果,而无需了解每个分子机制一样,API为开发者提供了文档化的方法、参数和预期响应,无需理解服务内部如何处理请求。化学中,你可以按照既定合成方案制备化合物,而不必完全理解其中的反应机理;同理,通过API,你可以依据文档规范发送请求并接收响应,而不必知道服务内部的处理细节。两者都提供了抽象复杂性的标准接口,同时保证结果的一致性和可重复性。
在付费的LLM API(如OpenAI GPT、Google Gemini、Anthropic Claude)与开源替代方案(如Mistral的Mixtral、DeepSeek、Meta的Llama)之间,核心考量是成本与控制权的权衡。尽管专有模型性能更优,但它们不一定适用于所有场景,尤其是对数据隐私和定制化有严格需求的用户。开源模型则赋予用户对数据的完全控制,增强隐私保护,并可针对具体需求调整模型。然而,云端运行开源模型成本可能较高,且本地部署则需昂贵硬件支持。第三方模型如OpenAI GPT因使用便捷受到青睐,而开源模型则更适合重视数据掌控与个性化的用户。
从最终产品角度看,开源LLM在透明度、控制力和成本效益方面可能优于专有模型。开源允许开发者检查、修改和定制代码以更好地满足需求。这种控制力在敏感领域尤为重要,特别是医疗健康领域,对可靠性和信任度要求极高。一些科技、生物医药和医疗健康公司及初创企业证明了这一点,他们从一开始就采用开源模型,或从专有模型转向开源模型,以更好地契合其运营需求。
嵌入模型
嵌入模型将复杂的数据转换为相对高维的向量。这些向量根据词语出现的上下文捕捉文本的语义意义,将词语表示为多维空间中的点,点与点之间的距离和方向反映它们的含义和关系。可以把它理解为将复杂信息翻译成一种简单、一致的格式。图2-2(左)展示了与人际关系相关的词语在空间中的分布。例如,单词“boy”(男孩)和“man”(男人)沿着代表年龄的轴排列,boy表示年轻,man表示年长。同样,表示性别的轴则从左到右展示了从男性到女性的过渡。这种空间组织方式使模型能够简单直观地捕捉抽象概念。
词语之间的关系也体现在角色的表示上。例如,在向量空间中,单词“man”(男人)和“woman”(女人)沿着特定方向移动时,可以变换成“husband”(丈夫)和“wife”(妻子)。这种方向性的移动捕捉了从一般身份到关系角色的转变。同理,“boy”(男孩)和“girl”(女孩)对应的词语“brother”(兄弟)和“sister”(姐妹)也反映了家庭关系在空间中的表现。这种一致的模式表明嵌入空间能够捕捉词语间的关系。
同样的原理也适用于科学术语,如图2-2(右)所示。结构轴区分了聚合状态,而亲水性轴则体现了物质的亲水或疏水特性。正如人际关系通过年龄和性别映射,化学性质则通过可测量特征映射到嵌入空间中。关系的泛化是嵌入空间的优势之一。比如,将“boy”变成“man”的向量操作同样可以用来将“water”(水)变成“steam”(蒸汽),通过类似的方向移动实现。
注
另一种理解嵌入的方法是,将其视为文本版的RNA,用四种类别的高维向量(而非连续浮点数)来表示遗传信息,从而捕捉嵌入的模式和关系。
科学术语的这种对齐也展示了抽象属性如何在共享空间中表示。例如,水及其物理态(冰和蒸汽)沿着物理形态轴排列,从固态到气态。水的亲水性使其与更疏水的化合物(如碳氢化合物)区分开来。环戊烷和环己烷则基于其化学性质(如结构和亲水性)进行组织。这些一致的空间模式展示了嵌入空间如何通过相对位置捕捉复杂科学知识。嵌入在回答问题和推理中非常有效,例如“water – liquid + gas → steam”或“pentane – 5个碳原子 + 6个碳原子 + cyclo + amine → cyclohexylamine”。这种一致性使得嵌入成为强大的类比和推理工具。
值得一提的是,上述轴线代表多维空间中的不同维度。这些维度是通过在大量文本数据集上训练嵌入模型计算得出的。涉及科学或医学术语的嵌入通常在专业数据集(如科学论文或专业数据库)上训练,以确保模型捕捉领域特定的关系。Word2Vec、GloVe和fastText等技术通过分析词语出现的上下文来学习词嵌入。例如,Word2Vec使用跳字模型(skip-gram)或连续词袋模型(CBOW)预测词对,使语义相近的词在嵌入空间中相邻;GloVe则通过统计文本语料库中词语共现频率构建词向量,有效编码词语间关系。
基于Transformer的模型如BERT是一次飞跃,它们是上下文感知的嵌入,能捕捉更细致的文本理解。如今的嵌入空间维度已达到甚至超过4,096维。
嵌入在多种应用中极具价值,包括相似度测量、聚类和分类。除非另有说明,本书中“嵌入”一词默认指句子和文本嵌入,并会特别标注其他类型嵌入,如图像、音频等。在生命科学领域,你可能会使用分子嵌入,例如SMILES(一种简单示例),或更高级的生物序列嵌入。
提示
SPECTER2是一个在超过600万个科学论文引用三元组上训练的嵌入模型。输入科学论文的标题和摘要组合,或简短文本查询,模型即可生成有效的嵌入。另一个类似的论文级嵌入模型是SciNCL,这些嵌入在论文分类和推荐系统中表现良好。
嵌入模型既有专有的,也有开源的。嵌入模型的领域远超OpenAI或Cohere(其嵌入模型广受欢迎)所提供的范围。确实,专有嵌入模型多数质量更优且价格合理,但也有很多开源嵌入模型(如GTE、E5、GritLM、MPNet),其中部分在Massive Text Embedding Benchmark(MTEB)排行榜上排名较高。像开源LLM一样,这些替代方案提供了灵活性,允许用户自托管、修改和控制,专有模型难以匹敌。示例2-2和2-3中展示了不同嵌入模型的对比。
我们将比较开源模型all-mpnet-base-v2、bge-m3与OpenAI的text-embedding-3-large,同时使用两个开源医疗模型:MedEmbed-large-v0.1和bge_large_medical。
注
调用OpenAI、Anthropic、Google或其他LLM及嵌入模型时,需要使用API密钥。
我们将定义两组句子列表:通用句子(generic)和领域专用句子(domain-specific),用来展示不同嵌入模型的优缺点。通用句子列表包括以下内容:
- I like flying.
- I have aerophobia.
- I’m scared to fly.
- A fly can scare me.
- I fear scary pictures of airplanes in the clouds.
- I have airplane photos in my cloud.
选择这组句子的目的是突出不同嵌入模型如何解释各种短语的相似度。句子1和2(以及1和3)是反义关系,理论上应当相似度较低;而句子2和3基本同义,理应相似度较高。其余句子包含一些模型可能误判的词汇,如“fly”、“scary”和“cloud”,作为测试基准。所有模型初始化代码见示例2-1。
示例 2-1. 嵌入模型初始化
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_openai import OpenAIEmbeddings
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import torch
mpnet_embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-mpnet-base-v2"
)
openai_embedding = OpenAIEmbeddings(model="text-embedding-3-large")
bge_embedding = SentenceTransformer("BAAI/bge-m3")
medical_model = SentenceTransformer("abhinand/MedEmbed-large-v0.1")
bge_medical_model = SentenceTransformer("ls-da3m0ns/bge_large_medical")
def compute_similarity_matrix(embeddings_list):
"""计算给定嵌入列表的余弦相似度矩阵。"""
num_sentences = len(embeddings_list)
similarity_matrix = np.zeros((num_sentences, num_sentences))
for i in range(num_sentences):
for j in range(i, num_sentences): # 只计算上三角矩阵部分
if isinstance(embeddings_list, torch.Tensor):
embeddings_list = embeddings_list.detach().numpy()
embedding_i, embedding_j = [embeddings_list[i]], [embeddings_list[j]]
similarity = np.ndarray.flatten(cosine_similarity(embedding_i, embedding_j))[0]
similarity_matrix[i, j] = similarity
similarity_matrix[j, i] = similarity
return similarity_matrix
以上模型会将句子转换为各自的嵌入向量。医疗模型的嵌入仅用于对比。我们可以通过分析模型给出句子对之间的相似度分数(范围0到1,1表示完全相同),来比较不同嵌入模型。相似度矩阵见图2-3。
由于不同模型计算的相似度分数绝对值不同,我们主要关注它们的相对比较。例如,text-embedding-3-large模型中,同义句“I have aerophobia”(句子2)和“I’m scared to fly”(句子3)之间的相似度为0.62,是模型认为最相似的句子对。其他模型对该句对也表现出较高相似度,有的甚至将其视为最相似的句子对。
另一方面,反义词对的相似度并不像预期的那样低。嵌入模型表现出这些词都属于“飞行”领域,但未能准确捕捉到其相反的含义。例如多个模型将“I like flying”(句子1)和“I’m scared to fly”(句子3)判定为相似句子。
一个有趣的案例是比较句子“I’m scared to fly”(3)和“A fly can scare me”(4)的相似度。这两句话包含了相似的关键词,但语境不同——句子4中的“fly”是名词。正如图2-3所示,大多数嵌入模型认为这两句话在某种程度上相似,其中bge-m3模型甚至将它们视为所有句子中最相似的一对。类似的情况还发生在句子“I’m scared to fly”(3)和“I fear scary pictures of airplanes in the clouds”(5)之间。这两句话也有相似的关键词集合,医疗模型和bge-m3都将它们评为最相似的对之一。
最后一句“I have airplane photos in my cloud”(6)与其他句子,包括句子4和5,也被认为相对不相似。多个模型显示“A fly can scare me”(4)和“I have airplane photos in my cloud”(6)这对句子的相似度最低。
总体来看,通用模型的表现略优于微调后的医疗模型。在使用不同嵌入模型时,常常需要考虑本节讨论的一些因素。
另一组更具领域针对性的句子描述了医疗状态、结果和炎症的不同方面:
- The acute inflammation could cause large damage.
- Chronic inflammation can be harmful to tissues.
- His condition improved when the local inflammatory reaction subsided.
- Her joint swelling reduced significantly.
- The doctor noted no signs of edema in the affected area.
- The anti-inflammatory medication was found in his blood.
- A standard procedure that fires up his blood.
句子1和2都涉及炎症导致损伤的概念,主要区别是炎症的类型——急性与慢性。大多数模型对此表现出较强的相似度。
句子3和4描述了炎症减轻时的改善状态,“inflammatory reaction subsided”和“joint swelling reduced”是描述同一过程的两种表达。句子5提及“未见水肿”,与前述减轻肿胀的描述紧密相关。MedEmbed-large-v0.1模型将这三句视为所有句子中最相似的一组,表现出比通用模型更强的关联性。
句子6从症状描述转向药物描述,虽与炎症相关(抗炎药物治疗炎症),但联系较间接。与症状相关句子的相似度相对较低,不过因包含“improved”一词,通用模型和bge_large_medical对句子3的相关性仍较高。
句子7是一个异常值,大多数模型与其他句子的相似度较低,表现准确。text-embedding-3-large模型在区分该句与其他句子时效果最佳,使其非常适合用于分类任务。图2-4展示了该组句子的相似度矩阵。
比较bge-m3和bge_large_medical模型的结果会发现它们非常接近,原因之一是两者采用了相同的架构设计。可能bge_large_medical模型微调不够充分,或训练数据集规模不足。微调将在本章及第7章中详细讲解,届时我们将对推理模型进行微调。
另一个有趣的细节是模型的置信度。根据绝对值来看,医疗查询相比通用查询的置信度明显下降,text-embedding-3-large平均下降约0.14,all-mpnet-base-v2下降约0.1,bge-m3下降约0.18,bge_large_medical下降约0.12。相比之下,MedEmbed-large-v0.1的置信度几乎未下降(平均仅降0.015)。微调后的bge_large_medical模型比更大版本bge-m3更有信心,但明显MedEmbed-large-v0.1更适合医疗任务。
每个模型捕捉的句子间关系略有不同,主要取决于其训练数据和维度规模。值得一提的是,text-embedding-3-large的维度为3,072,是其他对比模型的3到4倍(all-mpnet-base-v2为768维,bge-m3为1,024维)。
选择哪种嵌入模型取决于具体任务和数据集。例如,词嵌入更适合处理单个词的任务,而句子和文本嵌入则更适合较长文本的任务。基于Mistral-7B初始化的Mistral嵌入模型在MTEB排行榜上表现良好,但模型大小达到14GB。相比之下,E5、GIST等模型设计时注重高效处理数据,模型体积接近或小于1GB。
注
在后续章节中,我们会频繁使用嵌入,因为它们对于检索相关文档、提取事实信息至关重要。
嵌入的概念不仅限于自然语言处理(NLP)领域。分子嵌入用于将分子转换为机器学习模型能轻松处理的形式,这些嵌入将复杂的分子结构转化为固定尺寸的向量,捕捉分子的关键特征。这一方法在药物发现等任务中尤为重要,因为需要快速且准确地进行化学相似性搜索。传统方法往往依赖暴力比对,面对庞大的现代化学数据库,计算开销极大。
图2-5展示了不同嵌入模型如何表示简化分子输入线性表示法(SMILES)和自引用嵌入字符串(SELFIES)。SMILES是一种化学结构的表示符号,方便人类和计算机读写。每个分子用文本字符串描述,原子用化学符号表示(如C表示碳,O表示氧),键用特定符号表示(=表示双键,#表示三键),环和支链用数字和括号表示。这种紧凑线性符号便于在数据库和数字通讯中存储与共享复杂分子结构。SELFIES则是一种基于字符串的分子表示法,旨在克服SMILES的局限。SMILES字符串有时会生成语法错误或化学上不合理的分子,而SELFIES设计确保每个字符串对应一个有效且化学合理的分子。这种鲁棒性使得SELFIES在分子生成和优化等任务中尤为有价值,能够有效探索庞大的化学空间。
如图2-5所示,我们将使用结构相似的分子。除将SMILES和SELFIES形式输入text-embedding-3-large外,还会使用RoBERTa-ZINC、微调版ChemBERTa和chembed-chemselfies模型。根据训练集数据类型选择使用SMILES或SELFIES。结构2和3相同,但SMILES中芳香性的表示不同;而SELFIES字符串完全相同。详见示例2-2。
示例2-2. 嵌入化学结构
import selfies as sf
sentences_smiles = [
'ClC1CCCCC1', #1
'ClC1=CC=CC=C1', #2
'Clc1ccccc1', #3
'BrC1=CC=CC=C1', #4
'CC1=CC=CC=C1', #5
'CCCCCCCl', #6
]
sentences_selfies = [sf.encoder(x).replace("][", "] [") for x in sentences_smiles]
print(sentences_selfies)
# 输出:
# ['[Cl] [C] [C] [C] [C] [C] [C] [Ring1] [=Branch1]', #1
# '[Cl] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1]', #2
# '[Cl] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1]', #3
# '[Br] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1]', #4
# '[C] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1]', #5
# '[C] [C] [C] [C] [C] [C] [Cl]'] #6
从纯化学角度看,最相似的两个分子是氯苯(2)和溴苯(4),其次是甲苯(5)。如图2-5中标记为openai-smiles和openai-selfies的结果所示,text-embedding-3-large对SELFIES的解释明显优于SMILES。这是因为SELFIES中包含了Ring1和=Branch1等结构标记,同时也导致模型无法区分氯环己烷(1)是否为芳香族分子。RoBERTa-ZINC模型难以识别SMILES中的2和3其实相同。由于符号差异,模型将2、4、5评为最相似分子,而1和3只因大小写不同而区分开。微调后的ChemBERTa模型对大多数分子产生误判。
最佳效果来自于chembed-chemselfies模型。该模型不仅准确反映了卤代芳烃(–Cl [2]和–Br [4])之间的相似性,还能明显区分甲苯(5)、氯环己烷(5)和氯己烷(6),表现出较大相似度下降。
随着多模态模型的兴起,嵌入技术的未来尤为光明。这类模型能够处理并关联多种数据形式(文本、图像、视频等),代表了人工智能研究的前沿。它们不仅能维持同一数据类型内部的语义关系,还能跨类型保持关联。例如,能够直接比较化合物及其合成方法,或医学影像与诊断结果,从而在医学影像、诊断等领域开辟新应用。
聊天与大型语言模型
一种对大语言模型(LLM)进行分类的方法是根据其API或开源状态,本章前面已有介绍。其他分类方法则需理解文本生成过程。在深入探讨文本如何生成之前,我们先来了解“词元”(tokens)这一主题。
词元(Tokens)
“词元”一词含义多样。在语言模型中,词元是模型处理的基本文本单位——包括单词、子词和标点符号。词元由“分词器”(tokenizer)通过“分词”(tokenization)过程生成。分词器不仅将输入文本拆分为词元序列,还将其转换为模型可处理的数值表示。子词分词技术通过将单词拆分为更小的单元,有效处理模型词汇表中不存在的生僻词。典型的分词器词汇量范围从数万到数十万个词元不等。通过拆分为子词单元,模型能更好地处理罕见或未见过的词汇,提升整体性能。
图2-6展示了文本分词的示例。注意,不仅普通单词和标点被拆分为词元,诸如“LangChain”和“Generative”等复杂词汇也被分割处理。科学术语如“Autotroph”(自养生物)、“Cytokinesis”(细胞质分裂)、“Eukaryote”(真核生物)通常由多个词组成,会被拆分成多个词元,如图中所示。
分词器(Tokenizer)通过处理大量文本,将其拆分成更小的部分,比如单词、子词甚至单个字符。其目标是找到最佳的拆分方式,使得用较少的词元能够很好地表示语言。常见的方法有字节对编码(Byte Pair Encoding,BPE)、WordPiece和SentencePiece等,它们利用统计技术选择最常见且最有价值的拆分。在训练过程中,分词器学习哪些词的部分应当保留在一起,哪些应拆分,依据的是它们在文本中出现的频率。评价分词器的指标之一是文本压缩效率——在表达相同意义时使用更少的词元更优。另一个指标是分词器对新文本的泛化能力,需要平衡过度拆分和词元过大两者。比如在医疗报告中,专门训练的医疗分词器能更高效识别涵盖诊断、治疗和药物的医疗编码,表现明显优于通用分词器。
注
另一个重要原因是使用特殊的起始和结束词元,如句首标记(BOS,Beginning of Sentence)和文本结束标记(EOT,End of Text),它们是语言模型的重要导航标识。这些词元明确标记文本单元的边界,使模型更好地理解句子或文档间的上下文与依赖关系。
在大语言模型训练时,分词器将输入文本转换成词元序列,供模型学习;推理时,分词器同样负责将用户输入准备成模型可处理的格式。不同语言模型可能采用不同的分词策略,具体取决于模型及其架构,分词器的选择对模型性能和效率有显著影响。
在科学研究中,词元的基本构成单位的计算方式可能有所不同。示例2-3展示了一个分词器实现的框架。我们通过AutoTokenizer导入所需的分词器,定义了两个函数:
run_tokenizer
对每个SMILES字符串应用分词函数。run_decoding
将分词后的输出解码回可读字符串。
分词器通过预训练模型实例化,对SMILES字符串进行分词,然后将得到的词元解码回字符串,最终结果存储在变量result中。更多分子分词示例见LangChain4LifeSciencesHealthcare仓库。
示例2-3. 分词示例
from transformers import AutoTokenizer
smiles = ['C([13C]N(CC(=O)[O-])CC(=O)[O-])N(CC#N)CC(=O)[O-].[Na+].[Na+].[Na+]']
def run_tokenizer(func):
return [func(smi) for smi in smiles]
def run_decoding(tokenizer, encoded):
return [[tokenizer.decode(y) for y in x['input_ids']] for x in encoded]
tokenizer = AutoTokenizer.from_pretrained(model_name)
encoded = run_tokenizer(tokenizer)
result = run_decoding(tokenizer, encoded)
专用分词器(如处理化学SMILES字符串的分词器)通常优于通用分词器,因为它们考虑了化学表示的独特结构和语法(见图2-7)。SMILES字符串包含特定模式,如环、支链和立体化学,而通用分词器可能难以有效捕捉这些特征。专用分词器(如GIMLET/molT5、ChemBERTa、BasicSmilesTokenizer等)能够识别化学子结构和官能团,实现更有意义的词元切分。这让词元更好地代表化学信息,从而提升分子性质预测、化学反应建模等下游任务的性能。注意分词器如何处理子结构如13C和Na+。
专用分词器在处理SMILES字符串时之所以高效,关键在于它们能够降低词元复杂度并提升序列表示的质量。例如,专用分词器不会将苯环拆解成单个字符或无意义的子词,而是将整个苯环识别为一个有意义的整体词元。这种方式不仅保留了化学语义,还增强了模型在化学信息学应用中的可解释性和性能表现。
国际纯粹与应用化学联合会(IUPAC)命名法不仅是一种标准,更是一种合理化学分词的思维方式。该过程将复杂的化合物拆分为一系列标准化片段,这些片段构成IUPAC名称中的各部分,代表特定的化学结构或特征——如碳原子数、键类型或官能团等。这些“词元”遵循严格规则,确保任何阅读者都能准确无误地理解化合物的具体结构。图2-8展示了IUPAC命名法的分词示例。
文本与序列生成
语言模型主要由两个部分组成:
-
编码器(Encoder)
负责处理和理解输入内容。 -
解码器(Decoder)
负责解释编码后的信息并生成输出。
编码器与解码器的连接构成了Transformer架构的核心(见图2-9),这也是促成大语言模型(LLM)诞生的关键。可以想象,当你被要求描述一种身体感受,比如触摸烫锅或毛茸茸的猫时,首先信息(输入)会通过神经系统传递并由大脑处理(编码)。随后,大脑的输出被解码,最终形成你口中的描述。这一简化过程形象地说明了LLM中编码器-解码器架构的工作原理。
技术上讲,编码器接收一段输入的序列(token 序列),并将该序列转换到一个更高维的空间,用以表示输入的关键信息。它通过多层结构实现,其中包含多头自注意力机制,这有助于模型理解输入中不同部分之间的关系和重要性。当消息(经过编码后的表示)传输到目标端后,需要进行解码或解释。解码器接收编码器的输出,并生成一个输出序列。它同样使用类似的多头注意力层,但额外加入了编码器-解码器注意力机制,使解码器能够在生成过程中,动态聚焦编码输入的不同部分,从而输出准确且上下文相关的结果。
基于其机制,语言模型可以分为仅编码器(encoder-only)、仅解码器(decoder-only)和编码器-解码器(encoder-decoder)三类。仅编码器模型擅长理解和处理输入(比如用于分类任务的序列分析),但不会生成新的内容。简单来说,编码器可视作一种带上下文感知的嵌入模型。在化学领域,这类模型可对分子结构(例如 SMILES 字符串)进行编码,预测化学性质,如溶解度、反应性或毒性;在医疗领域,这类模型可以编码或分析电子健康记录(EHR)和病历,帮助疾病检测或患者预后预测。
仅解码器模型则相反,擅长关注序列中的“下一个”元素,因此非常适合基于训练数据生成各种内容,如文本、代码或基因序列。最常见的应用包括文本相关任务:将非结构化的事件报告翻译为标准化医学术语,支持药物警戒和安全监测,基于电子健康记录生成个性化治疗建议,协助临床医生做出决策。在科研领域,解码器可根据结构化数据撰写科学摘要、报告或总结,提升数据的解读与传播效率。
另一种常见架构是自编码器(autoencoder)。自编码器是一种无监督学习模型,旨在尽可能精确地重构输入数据。与编码器-解码器架构将输入转换为不同的输出格式不同,自编码器目标是通过信息瓶颈尽量恢复原始输入。我们将在第8章深入讨论自编码器,并演示如何用变分自编码器(variational autoencoder)生成分子。
Transformer 模型围绕自注意力机制设计,允许模型根据输入元素(如单词或 token)之间的相对重要性加权。这使得 Transformer 能高效捕捉输入数据中元素之间的长距离依赖关系。结合编码器和解码器,Transformer 可有效处理复杂的序列到序列任务。可能的应用包括:编码反应物并解码生成物来预测合成路径;编码 X 光、CT 或 MRI 图像,生成自然语言描述,描述相关发现、解剖结构和潜在异常,辅助放射科医生和医生解读医学影像。
不同架构的实现流程非常相似,如示例2-4所示:一般步骤包括初始化模型与分词器,利用分词器编码输入文本,再将文本输入模型编码;如果有解码步骤,则对模型输出进行解码。编码器输出与解码器输出有所不同——编码器的输出人类难以直接理解,但可用于机器学习和生成式 AI 任务。
示例2-4 中,展示了编码器、解码器和编码器-解码器模型的简单示范:
# 导入必要库
from transformers import (
AutoTokenizer,
AutoModel,
GPT2Tokenizer,
GPT2LMHeadModel,
AutoModelForSeq2SeqLM,
AutoModelForCausalLM
)
input_text = "Butane is the only compound"
## 编码器示例
model = AutoModel.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
input_ids = tokenizer(input_text, return_tensors='pt').input_ids
encoded_output = model(input_ids)
print(encoded_output.last_hidden_state)
## 解码器示例
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
input_ids = tokenizer(input_text, return_tensors="pt").input_ids
model_output = model.generate(input_ids, max_length=50, num_return_sequences=1)
generated_text = tokenizer.decode(model_output[0], skip_special_tokens=True)
print(generated_text)
## 编码器-解码器示例
model = AutoModelForSeq2SeqLM.from_pretrained("google-t5/t5-base")
tokenizer = AutoTokenizer.from_pretrained("google-t5/t5-base")
input_ids = tokenizer(input_text, return_tensors="pt").input_ids
model_output = model.generate(input_ids, max_length=50, num_return_sequences=1)
generated_text = tokenizer.decode(model_output[0], skip_special_tokens=True)
print(generated_text)
当中,T5 模型因其采用了 span-mask 降噪训练目标,可在推理时预测被屏蔽的“哨兵”token,重构被遮蔽的词语。如示例2-5中,将句子 "Most cancers are caused by genetic changes that happen mostly by chance and are not inherited." 中的关键词用 <extra_id_0>, <extra_id_1>, <extra_id_2> 替换,模型重构出的句子质量较高。
现代 AI 发展中,解码器架构受到极大关注,主要因为其在通用语言任务中表现卓越且具良好扩展性。像 GPT 这样的仅解码器模型通过专注于“下一个 token”的预测,完成了丰富的语言理解和生成任务。这种架构简化了训练要求,无需成对标注样本,能利用海量互联网无结构文本进行训练。此外,解码器模型在推理时可缓存先前 token 计算结果,提升生成任务和多轮对话效率;相比之下,编码器-解码器结构则复杂且在信息传递上存在瓶颈。
虽然双向注意力(bidirectionality)可能在某些任务上仍有优势,但普遍观点认为,随着模型规模增大,单向注意力的限制可被克服,令编码器-解码器架构变得非必需。产业界如 OpenAI、Anthropic 等推动了这种架构的广泛应用和优化。
两种架构在生命科学领域各有优势。比如蛋白质结构预测(将在第7章详细讨论)适合编码器-解码器模型,将氨基酸序列(输入)翻译成三维结构坐标(输出),编码器的双向注意力能更好理解蛋白序列上下文,解码器则逐步构建三维结构;而蛋白质序列生成则可用仅解码器架构,逐个氨基酸生成新序列。
理解了分词器、编码和解码模型后,我们可以观察如何生成新的 token,因为编码器模型本身不具备生成能力。以短语 "The formula of dihydrogen…" 为例,生成过程包括:
- 对输入进行分词。
- 若模型含编码器,先编码输入 token。
- 生成所有可能 token 的 logits(原始输出值,代表某个 token 的可能性或偏好)。
- 将 logits 转换为概率,应用解码策略生成结果。
注意事项
请留意单词 dihydrogen 是如何被拆分成三个 token 的(见图2-10)。我们之前也见过类似的现象,比如 OpenAI 的分词器。高级分词器会将单词拆分成多个部分,这对于科学术语和专业命名尤其有用。如果分词器是在科学领域数据上训练的,它会更擅长处理复杂且技术性的词汇,从而保证科学文本的分词质量,因为它见过大量重复使用的相同 token。
你可能听说过“无限猴子定理”,它指出如果有无限多只猴子随机敲击键盘或从词汇表随机选词,经过无限时间后,理论上它们最终能够产生任何文本,无论是莎士比亚的作品、某段程序代码的文档,还是“万物理论”。这个思想阐释了无限和概率的概念,意味着任何可能的结果,只要尝试次数足够多、时间足够长,都能出现。
注意事项
你很可能在使用现代短信或聊天应用时已经间接使用过语言模型。当你输入一个词时,应用会给出多个下一个词的候选。虽然这时的上下文窗口较短、知识库有限、逻辑较简单,但其核心原理与大型语言模型是相同的。
大型语言模型则更智能得多。它们不会简单地随机按键或挑词,而是分析上下文,根据语境生成文本。正如我们在图2-10中使用 gpt-3.5-turbo-instruct 模型看到的,LLM 的知识库——数据量和质量、模型参数数量及架构设计——对性能至关重要。
回到之前的示例,尽管有两个 token(mon 和 phosphate)的概率明显高于其他,但从科学角度看,所有建议的选项都是合理的,因为接下来很可能是一个酸的名称,或者是水(二氢氧,dihydrogen monoxide)。我们再看几个其他模型对同一句话 "The formula of dihydrogen…" 的 token 分布情况,使用的模型包括:
- DeepSeek-R1-Distill-Llama-8B
- bigscience/bloom-560m
- internlm/internlm-chat-7b
- AI4Chem/ChemLLM-7B-Chat
其中,bloom-560m 是通用模型,参数量相较其它几个最少。图2-11显示了该模型预测的可能续词(按概率排序),这些续词可以被理解为以下句子的合理延续:
- The formula of dihydrogenation is given…
- The formula of dihydrogen peroxide is…
- The formula of dihydrogen phosphate is…
- The formula of dihydrogen is given by…
- The formula of dihydrogen as a potential…
值得注意的是,Bloom 模型的 token 概率分布近似均匀。这通常是因为模型训练时与查询相关的数据量不大。小型 LLM 里更常见这种现象,但即便是大型模型在某些特定领域也可能出现类似的概率分布。当很多 token 几乎同等可能时,就会出现这种不确定性,比如图2-11中对 "The formula of dihydrogen…" 这个片段的续写预测。
DeepSeek-R1-Distill-Llama-8B 模型的 token 分布更为明确,表明 token mon 应当毫无疑问地被选中。此外,你可能注意到 mono 和 mon 都位列前五。这很可能与该 LLM 的训练数据有关:mon 和 mono 是很多科学和化学术语中常见的子词片段,例如 mon-oxide(也存在 di-oxide)或 mono-mer(poly-mer 也存在)。而 Mon(首字母大写)则说明分词器对大小写敏感,将其视为与小写版本不同的 token。
注意事项
如前所述,语言模型大多预测 mon,因为 dihydrogen monoxide 是水的科学名称。大多数通用模型在训练中很可能多次遇到该词,因此能以较高置信度预测接下来的部分。然而,对于经过化学领域调优的模型,这个概率会下降一半,因为它在化学文本上微调过,出现了许多其它组合,显著影响了结果的分布。
图2-11中底部的两个分布是关联的:internlm-chat-7b 是基础语言模型,而 ChemLLM-7B-Chat 是其经过微调的版本。微调即基于预训练模型,在较小且专门的数据集上进一步训练,使模型在特定任务上表现更好,比如如果用医学文本训练,模型在理解医学术语时会更准确。我们将在第7章微调一个推理模型。
当训练数据不够深入时,模型对上下文的理解较模糊,可能导致所有 token 概率接近均等,或只有一两个 token 明显领先。比较基础的 internlm-chat-7b(训练于普通数据)和微调后的 ChemLLM-7B-Chat(用化学数据强化训练)就能看出差异:化学相关 token 如 phosph、oxide、di、tri 的概率提升,而常规词如 is 的概率下降。考虑到 gpt-3.5-turbo-instruct 模型约有1750亿参数,可以合理推测它也接受过大量科学论文训练,这解释了大型通用模型与小型领域调优模型在预测顶端 token 上的相似性。
解码策略
迄今为止,我解释了不同模型会基于训练数据、架构和配置给出不同的概率分布。但即使是同一个模型,输出结果也会因所采用的解码策略而异。解码策略大体可分为确定性和随机性两类。
我们分析另一个短语:
Lipinki assumption: Compounds are absorbed into…
来看看可能的续写方法。
最简单的策略是贪心采样(greedy sampling)。简单来说,贪心策略在每一步总是选择模型认为概率最高的 token,不考虑其它可能性,也不做探索(见图2-12)。模型每次都选概率最高的 token。该策略的主要优点是生成错误或无意义结果的概率低。
以我们示例为例,续写的第一个词是 the(相比之下,blood 和 cells 的概率较低)。新短语 Lipinki assumption: Compounds are absorbed into the… 形成后,会产生新的 token 分布,此时词 body 的概率最高,模型继续按此方式生成,直到遇到结束符(end-of-text token)。
贪心采样(Greedy Sampling)也非常容易复现——相同的输入下,结果总是一致的。这种确定性是检测 AI 生成内容的关键因素之一。检测方法通常分析特定 token 在序列中同时出现的概率。贪心生成基于每步最高即时概率的 token,导致生成文本出现较为固定、可识别的模式。相反,输入或模型状态的细微变化可能产生完全不同的序列,从而带来多样性。
贪心策略计算效率高,但缺点是输出容易重复或过于确定,有时会陷入局部最优,错失更优解。为此,我们可以在每一步探索多个选项,形成可能文本续写的“路径图”。通过在每步保留概率最高的前 k 个假设,束搜索(Beam Search)能找到比贪心策略更优的整体序列,避免贪心过度剪枝导致的遗漏。这里保留的前 k 个 token 集合称为“beam”(束)。
图2-13 展示了贪心采样与束搜索的区别:束搜索在每个分叉点(除了第一个)分裂成两个束,因为此处 token 概率差距较大(本章稍后会讨论其他优化与质量策略)。比如位置2的 token “bloodstream”和位置3的 “via” 虽然都是第二高概率,但对应路径的累积概率比分支中其他路径更高,而贪心采样选择的路径则概率最低。
束宽(beam width)越大,考虑的假设越多,找到最优序列的概率越高,但计算成本也随之增加。束宽较小时,计算负担减轻,但搜索空间缩小,可能错过更好结果,因此是效率与质量的权衡。
根据当前束搜索生成的句子,示例文本变成:
Lipinki assumption: Compounds are absorbed into the bloodstream via the…
到目前为止,所描述的解码策略都是完全确定性的。正如前面提到的,这类方法具有优势,但也缺乏多样性。面对如此庞大的概率空间,我们理应有办法引入一定的随机性,对吧?
实际上,确实存在这样的方式。模型可以不总是选择概率最高的 token,而是根据预测的概率分布在词汇表中进行采样。可以把它想象成转动一个轮盘,轮盘上每个 token 所占的区域大小由其概率决定(见图2-14)。概率越高,该 token 被选中的机会也越大。这是一种计算成本相对较低的解决方案,而且由于引入了较高的相对随机性,生成的句子(或 token 序列)每次很可能都会不同。
随机采样可以有多种实现方式。除了之前介绍的基本方法外,我们还可以通过调整概率分布来控制采样行为。通常,模型会用 softmax 函数将 logits 转换为概率分布。但我们可以通过温度参数(temperature)TTT 来调整这一计算,如图2-15所示。
温度参数实际上是对 logits 进行缩放的一个超参数,它会影响 softmax 计算出来的概率分布。具体来说:
- 当温度 T=1.0T = 1.0T=1.0 时,概率分布保持不变,即采用模型原始的分布;
- 当温度 T>1.0T > 1.0T>1.0 时,概率分布的熵(随机性)增加,使得原本较低概率的 token 被采样的可能性增大,分布更“平坦”,采样更随机;
- 当温度 T<1.0T < 1.0T<1.0 时,概率分布的熵降低,分布更“尖锐”,集中在高概率 token 周围,采样更确定、更保守。
通过调节温度参数,可以在生成文本的多样性和准确性之间做出权衡。
温度调节结合随机采样,常用于创意类应用场景,如头脑风暴、探索发现或开放式对话系统,这些场景需要在连贯性与新颖性之间取得平衡。它允许语言模型在保持一定输出控制的同时,探索更广泛的可能性。降低温度时,采样行为会逐渐接近贪心解码的效果。
小贴士
温度低于 0.01 时,采样过程等同于贪心搜索;而温度极高(大约超过 5)时,所有 token 的概率趋于相近,采样变得几乎随机。
高温度鼓励模型探索更多可能性,可能生成更具创新性或意料之外的输出。为了更精细地控制生成结果,还可以使用一些技术,比如 top-k 和 top-p(核采样)。
我们之前在束搜索分析时简要提到过 top-k 采样。top-k 固定保留概率最高的 k 个 token(比如 3 或 5),只在这几个 token 之间进行采样。但问题在于最佳 k 值的选取,因不同上下文下 token 分布差异较大。
核采样(nucleus sampling,又称 top-p 采样)则动态计算出一个最小的 token 集合,使其累积概率达到 p(见图2-16)。核采样的优势在于它根据上下文灵活调整候选 token 数量,能同时兼顾多样性和生成质量,使输出既丰富又精准。
各种类型的语言模型
前面的示例中,我们使用了一个聊天模型(internlm/internlm-chat-7b)、一个推理型大语言模型(DeepSeek-R1-Distill-Llama-8B)以及一个基础大语言模型(bigscience/bloom-560m)来生成下一个 token。它们的主要区别在于训练数据和训练目标:
- 传统大语言模型(LLM) 通常使用自监督学习,在大规模文本语料库上训练,目标是根据前面的词预测下一个词。这类模型侧重于语言本身的统计规律和结构。
- 聊天或对话模型 是经过微调的 LLM,专门在对话和问答数据上训练,除了理解语言外,它们还能建模整个对话上下文,包括发言者角色和对话历史,从而更好地支持连续的多轮交互。
- 推理模型 则训练于反思性文本,旨在生成和模拟思考过程(我们将在后续章节深入讲解)。此类模型能开始制定计划、分解问题、提出澄清性问题,并给出经过深思熟虑的步骤。
图2-17 展示了传统 LLM、聊天模型和推理模型在同一输入下产生的不同响应,生动体现了它们的区别与特点。
各种类型语言模型的应用非常相似。例如,传统大语言模型(LLM)、聊天模型和推理模型都可以用来起草摘要。传统LLM面向广泛的语言理解和生成任务,适用于简单对话之外的多种应用;聊天模型则擅长实时对话,能够提供相关且富有互动性的回复;推理模型则模拟思考过程,分步骤规划、提出问题并解决复杂任务。此后若无特别说明,本文中“LLM”一般指聊天语言模型。
我们也简要介绍了语言模型的参数,这些参数是模型在训练过程中学习到的数值,主要存在于Transformer架构内。参数大致可分为:
- 嵌入参数(Embedding parameters) :将输入的token(词或子词)转换成连续的高维向量,捕捉词间语义关系;
- 注意力机制参数:位于自注意力层中的查询(Query)、键(Key)、值(Value)矩阵,决定token间如何相互关注,捕获上下文关系;
- 前馈网络参数:处理经过注意力机制后的信息;
- 其他如层归一化、位置编码和输出投影层的参数。
参数数量通常直接影响模型能力,参数越多模型在推理、知识保持和指令执行上表现越强,但架构优化有时能在参数较少的情况下提升性能。
当前语言模型种类繁多。OpenAI、Anthropic、Google 等大厂的旗舰模型拥有数千亿参数,能够完成从自然语言理解到代码生成、复杂推理的多样任务。Meta 的 Llama 3、Mistral AI 的 Mixtral 8x22B 等开源模型为研究者和开发者提供了强大工具,且在多项基准测试(如 Open LLM Leaderboard 和 Chatbot Arena)中表现优异,是AI科研和企业应用的核心支撑。
除了大型模型,还有一种替代方案——小型语言模型(SLM)。例如微软的 Phi-3.5-mini,参数通常低于5–7亿,专注于效率和特定用例。MobileLLaMA-1.4B、Gemma-2-2B 等开源模型优化了实时数据处理,适用于计算资源有限的环境。SLM 展示了紧凑模型在不牺牲性能前提下的潜力,适合移动端、边缘计算和专业行业解决方案。
在生命科学、医疗和医学领域,微调(fine-tuning)机器学习模型是人工智能应用的关键进展。通过用领域特定数据调整预训练模型,研究者大幅提升了模型在分子交互、疾病进展等专业任务中的预测准确度,同时增强了模型对未见数据的泛化能力。这种方法节省了大量数据采集和计算资源,加速研发流程,实现更精准的定制化解决方案。微调模型能识别常规模型难以捕捉的细微模式和关联。
这些定制模型已在诸多领域带来变革,包括:
- 药物发现:改进蛋白质结构预测和新分子设计;
- 医学诊断:提升影像分析和疾病进展预测能力;
- 基因组学:增强变异解读的准确性;
- 公共卫生:推动流行病学建模发展。
专门的医学LLM如 Me-LLaMA,助力临床工作流程和决策支持。谷歌的 Med-PaLM 2 利用海量医学文献和临床指南,提供高质量医疗问答。BioMistral 和 MedLLM 等开源项目针对医学领域优化,强化信息提炼和医疗专业人员洞察。
药物发现领域的代表模型有:
- ConPLex(MIT出品),预测药物-蛋白质相互作用,无需详尽原子结构;
- BioNeMo 框架,支持多种模型,如 DNABERT(基因组预测)、MegaMolBART(生成化学应用);
- scBERT 和 EquiDock,分别提升单细胞RNA测序和蛋白质相互作用预测能力。
化学领域内,专用LLM如 MolT5、LlaSMol 等被开发用于分子设计、性质预测和化学文本挖掘。MolT5融合了跨领域序列数据,LlaSMol则依赖高质量指令微调数据集。ChatChemTS 让化学家能通过聊天界面设计新分子,极大增强了科研效率和准确性。
生物学领域也有专门的LLM,如 GenomicLLM(基因组数据分析)、NVIDIA的 BioNeMo(支持蛋白质、DNA和RNA研究)、OpenFold 和 ProtT5(蛋白质建模与序列生成),这些模型利用LLM的强大能力推进基因组学、蛋白质组学及细胞生物学研究,帮助分析复杂生物数据并生成有价值的见解。
视觉语言模型
视觉语言模型(Visual Language Models,简称 VLMs)将语言模型与图像处理能力结合,能够同时理解、生成和推理视觉内容与文本信息。这类多模态系统不仅可以分析图像、理解视觉上下文,还能基于文本指令生成相关描述,甚至创建或修改视觉内容。
这种多模态能力通常通过对文本和图像分别采用一对独立的编码器来实现。两个编码器的输出随后进入多模态融合步骤,融合过程中可能包含多种注意力机制。融合后的向量通过点积计算得到关联度,再传递给解码器进行生成或推理。
该架构的总体示意图见图2-18。
视觉语言模型(VLM)虽然经过了大规模视觉数据集的训练,但对于生成分子或超分子结构的能力有限。比如前言中展示的维生素C分子可视化就是一个例子。在某些情况下,出于数据增强的目的,VLM 可以生成合成的生物图像以扩充有限的数据集,但其生成图像的准确性需谨慎评估。
不过,视觉语言大模型在自动识别细胞结构、表征形态特征以及标注生物图像方面表现出色,能够显著减轻人工标注的工作量。如果经过恰当训练,这类模型在医疗影像解读中潜力巨大,尤其是在集成到聊天机器人等交互系统时,可大幅提升医疗影像的辅助诊断能力。
注意事项
全书贯穿了生命科学、医疗健康领域的诸多最新成果,背后推动力量多为大型科技公司:DeepMind(谷歌)开发的 AlphaFold,NVIDIA 的 BioNeMo 框架,Meta 的 ESMFold,字节跳动(TikTok 母公司)的 ProteinBench 和 Protenix,Salesforce 的 ProGen,苹果通过 Apple Watch 推出的健康方案,以及微软、谷歌、AWS 等公司推出的多项解决方案。
听起来或许不可思议,未来几年我们甚至可能看到大型科技公司以创纪录的2000亿美元收购大型制药企业。就像几年前没人预料到社交平台公司会在多个领域取得突破一样,这种发展并非天方夜谭。
正如所见,许多语言模型专注于解决通用与细分领域的挑战,而这仅仅是开始。应用这些专用模型,不仅推动科学理解的进步,也通过更个性化的治疗方案、更快速的药物研发流程和更完善的公共卫生规划,带来切实的患者益处,体现了 AI 定制如何弥合理论机器学习能力与实际科学医疗应用之间的鸿沟。
想紧跟最新模型成果,可以关注开源项目 LangChain4LifeSciencesHealthcare。
大型语言模型的局限性
希望通过前面的内容,你已经对语言模型的工作原理及其优势有了清晰认识。普通的语言模型,即便经过领域微调,也不具备真正的“思考”能力——它们通过逐个生成 token,结合输入上下文,输出答案。大量研究表明,虽然 LLM 能通过各种测试和基准评测,但在处理非常简单的任务时,有时仍会表现欠佳。这可能与任务与训练数据文本的相似度有关,也可能因为模型遇到低概率 token 导致输出偏差,或者生成过于直接、跳跃。推理模型部分解决了这一不一致性,能够生成规划、思考链条,并自我质疑生成结果的合理性。总的来说,LLM 期望始终正确,但它们是基于大量人类生成数据训练而成。
实时信息获取不足
语言模型的主要限制之一是它们自身无法访问或整合训练结束后的实时信息。为此,有多种增强方案,比如第3章介绍的 LangChain 组件(包括提示、索引、记忆)、工具调用和智能代理设计,第4章则专注于检索增强生成(RAG)技术。但单独来看,LLM 是静态模型,只依赖训练时内嵌的知识权重,对最新新闻、科研进展或世界变化一无所知。
交互能力缺失
尽管 LLM 能生成类似人类语言的文本,但它们不能执行超出自然语言输出范围的操作,比如网页搜索、计算、外部数据抓取或与其他系统/API 交互。
训练数据偏见
LLM 的回答可能反映训练数据中的偏见,常见偏见包括性别、种族和意识形态等,可能导致不公平或有害的结果。在科研应用中,由于网络科学内容存在错误,LLM 可能输出不准确的科学结论。举例来说,关于气候变化、疫苗副作用或转基因食品健康影响,你更愿意从泛网络信息还是科学出版物中获取答案?第10章将探讨如何处理偏见问题。
“幻觉”现象
这些因素结合导致 LLM 有时会生成无意义或事实错误的内容,被称为“幻觉”。虽然某些幻觉可用于激发创意,但从事实角度看,其误导性极强,尤其在科学研究和医疗领域,这对准确性和可靠性提出巨大挑战。幻觉产生的原因之一是模型缺乏透明度和可解释性,使得理解其推理过程和知识来源变得困难。第4章将讨论幻觉是否总是负面以及应对策略,以构建可信的工作流程。
原始数据处理能力有限
另一个限制是,LLM 无法直接处理研究中常见的原始数据格式,如基因组序列、蛋白质结构或图像数据。虽然 LLM 能生成与生命科学相关的文本,但对底层数据格式的解析和操作需要额外的预处理或系统集成。
小贴士
试思考为什么 LLM 即便面对文本形式的原始数据格式,也难以直接处理和分析?
复杂推理能力不足
许多科学应用需要复杂的多步骤推理和结论。理解生物过程机制、解析实验结果、设计新疗法往往需整合多个知识领域并形成逻辑关联,LLM 单凭训练数据难以做到有效捕捉和泛化。此外,生命科学领域专业术语及概念高度技术化、专业化,尤其是新兴或细分领域,更是对 LLM 的挑战。
总结
本章介绍了大型语言模型(LLMs)的基础知识及其在生命科学领域的应用。讲解了这些模型如何依托强大的计算资源和 GPU 进行训练,以及如何通过收费服务(如 OpenAI)或开源版本,根据需求灵活使用。
本章重点介绍了嵌入模型——将文本、分子或其他数据转换成能够表达其语义的数值向量的工具。通过多个示例比较了不同嵌入模型在处理日常语句和科学术语时的表现。章节还解释了 token 的概念,阐述了语言模型的基本工作原理、预测下一个 token 的机制及文本生成的多种策略。
最后,本章讨论了多种类型的语言模型(包括推理模型和视觉语言模型)及其在科学研究中的局限性。简要说明了为何 LLM 有时会产生“幻觉”,以及它们在直接处理原始科学数据时面临的挑战。
这些限制为后续章节的内容铺垫,后续我们将学习如何使用 LangChain——一个强大的语言模型应用开发框架,掌握其中的索引及索引方法(用于高效组织和搜索数据)、向量数据库、链(Chains)、提示(Prompts)、工具(Tools)和智能代理(Agents)等组件,并初步了解 LangGraph 的基础知识。