一、前言
检索增强生成 (RAG) 系统已经成为构建基于大语言模型 (LLM) 应用的强大方法。RAG 系统的工作原理是:首先使用检索模型从外部知识源检索相关信息,然后使用这些信息来提示 LLM 生成最终的响应。
然而,基本的 RAG 系统(也称为朴素 RAG)在处理需要对多条信息进行推理的复杂查询时可能会遇到挑战。多步骤检索的出现正是为了解决这一问题。
在多步骤检索中,系统会跨多个步骤或“跳跃”收集信息,以回答复杂的问题或收集详细信息。这种技术在高级问答系统中很常见,其中多个来源或文档包含回答问题所需的信息。
构建多步骤检索是自然语言处理 (NLP) 和信息检索中的一个关键挑战,因为它要求系统理解不同信息片段之间的关系,以及它们如何对最终答案做出贡献。
今天,我们将介绍多步骤检索,并探讨如何利用它来构建需要复杂推理能力的检索增强生成 (RAG) 系统。我们将以医疗保健领域为例,展示如何使用 Indexify、OpenAI 和 DSPy 构建一个问答聊天机器人。此外,我们还将演示多跳思维链 RAG 如何有效地回答复杂问题。
二、什么是多步骤检索?
多步骤检索,顾名思义,就是需要多步推理才能完成信息检索的任务。它区别于简单的关键词匹配,需要模型理解不同信息片段之间的关系,并进行逻辑推理,最终才能找到答案。为了更好地理解多步骤检索,让我们先看一个例子:
假设你想查询 “2023年CBA总决赛最有价值球员是谁? ”
你将这个问题输入到一个包含篮球信息的向量数据库中,可能检索到以下两个最接近的上下文段落:
-
“2023年CBA总决赛,辽宁队以4:0的总比分战胜浙江队,成功卫冕总冠军。”
-
“在总决赛第五场比赛中,张镇麟发挥出色,砍下全场最高的30分,并率领辽宁队赢得最终胜利。”
这两个段落都没有直接回答谁是总决赛最有价值球员 (MVP)。 但是,通过这两段信息,我们可以进行如下推理:
-
第一跳: 2023年CBA总决赛,辽宁队获得了总冠军。
-
第二跳: 张镇麟是辽宁队球员,并在关键的第五场比赛中发挥出色,获得了最高分,帮助球队夺冠。
因此,结合这两条信息,我们可以推断出张镇麟很有可能是2023年CBA总决赛最有价值球员。
这个例子清晰地展示了多步骤检索的过程:模型需要先理解每个检索结果的含义,再分析它们之间的逻辑关系,最后才能推导出最终答案。这种逻辑思维对我们人类来说很正常,这对于机器学习模型来说是一个复杂的挑战,需要强大的语义理解和逻辑推理能力。
多步骤检索在多个领域都有广泛的应用,包括:
-
医疗保健机器人: 查找和查询患者的入院数据、诊断历史、治疗方案等。
-
文本摘要器: 高效地总结大量文本,提取关键信息。
-
问答机器人: 提供对各种类型查询的答案,包括需要多步骤推理的问题。
-
法律行业: 为法律案件创建检索模型,查找相关的法律条文、判例等。
-
人力资源行业: 通过匹配特定的筛选条件为工作职位找到最合适的人选。
三、实验方案
3.1、实验目标
本实验的目标是构建一个能够进行多跳推理的,用于回答医疗领域的问题在本实验中,我们将构建一个能够进行多跳推理的问答聊天机器人,用于回答医疗领域的问题。
3.2、技术架构
我们将采用以下技术架构来实现目标:
-
Indexify: 用于构建高效、可扩展的数据提取和解析管道,解决非结构化数据处理的难题。
-
OpenAI: 提供强大的语言模型 (LLM) API,用于生成最终的答案。
-
DSPy (Declarative Sequencing Python): 一个声明式排序 Python 框架,通过可组合模块代替传统提示工程,简化 LLM 应用的构建,尤其适用于需要复杂推理的场景。
3.3、数据集
本实验将使用 Hugging Face 上提供的维基百科医疗术语数据集:gamino/wiki_medical_terms[5]。
四、代码实现
首选操作系统: Linux。如果您使用的是 Windows 或 macOS,请尝试使用 Linux 构建工具运行此程序。
安装所需软件包:
!pip install indexify-dspy
!pip install indexify
!pip install indexify-extractor-sdk
!pip install gradio==4.31.0
测试软件包安装:
import dspy
from indexify import IndexifyClient
from indexify_dspy.retriever import IndexifyRM
如果遇到类似 “ModuleError: “dspy not found”” 的错误,可以尝试安装特定版本解决问题:
!pip install dspy-ai==2.0.8
4.1、使用 Indexify 提取数据
查看数据集:
import pandas as pd
df = pd.read_parquet("hf://datasets/gamino/wiki_medical_terms/wiki_medical_terms.parquet")
df=df.dropna()
print(df)
输出结果应类似于:
我们将使用 page_text
列:
medical_descriptions = df['page_text'].tolist()
启动 Indexify 服务器和提取器:
1、打开一个终端,输入以下命令启动服务器:
$ curl https://getindexify.ai | sh
$ ./indexify server -d
2、打开另一个终端,输入以下命令下载并启动提取器:
$ indexify-extractor download tensorlake/minilm-l6
$ indexify-extractor download tensorlake/chunk-extractor
$ indexify-extractor join-server
提取数据:
from indexify import IndexifyClient, ExtractionGraphindexify_client = IndexifyClient()
extraction_graph_spec = """
name: 'medical'
extraction_policies:- extractor: 'tensorlake/minilm-l6'name: 'minilml6'
"""
extraction_graph = ExtractionGraph.from_yaml(extraction_graph_spec)
indexify_client.create_extraction_graph(extraction_graph) indexify_client.add_documents("medical",medical_descriptions,
)
提取 7,000 条记录大约需要 30 秒。
集成 DSPy 和 Indexify:
def generate_context(query, k):retrieve = IndexifyRM(indexify_client)topk_passages = retrieve(query, "medical.minilml6.embedding", k=k).passagesreturn topk_passages
测试检索功能:
query = "heart attack"
generate_context(query=query, k=2)
输出结果应为与查询相关的两段文本。
['Carditis (pl. carditides) is the inflammation of the heart. It is usually studied and treated by specifying it as:\nPericarditis is the inflammation of the pericardium\nMyocarditis is the inflammation of the heart muscle\nEndocarditis is the inflammation of the endocardium\nPancarditis, also called perimyoendocarditis, is the inflammation of the entire heart: the pericardium, the myocardium and the endocardium\nReflux carditis refers to a possible outcome of esophageal reflux (also known as GERD), and involves inflammation of the esophagus/stomach mucosa\n\n\n== References ==','Coronary artery disease (CAD), also called coronary heart disease (CHD), ischemic heart disease (IHD), myocardial ischemia, or simply heart disease, involves the reduction of blood flow to the heart muscle due to build-up of atherosclerotic plaque in the arteries of the heart. It is the most common of the cardiovascular diseases. Types include stable angina, unstable angina, myocardial infarction, and sudden cardiac death. A common symptom is chest pain or discomfort which may travel into the shoulder, arm, back, neck, or jaw. Occasionally it may feel like heartburn. Usually symptoms occur with exercise or emotional stress, last less than a few minutes, and improve with rest. Shortness of breath may also occur and sometimes no symptoms are present. In many cases, the first sign is a heart attack. Other complications include heart failure or an abnormal heartbeat.Risk factors include high blood pressure, smoking, diabetes, lack of exercise, obesity, high blood cholesterol, poor diet, depression, and excessive alcohol consumption. A number of tests may help with diagnoses including: electrocardiogram, cardiac stress testing, coronary computed tomographic angiography, and coronary angiogram, among others.Ways to reduce CAD risk include eating a healthy diet, regularly exercising, maintaining a healthy weight, and not smoking. Medications for diabetes, high cholesterol, or high blood pressure are sometimes used. There is limited evidence for screening people who are at low risk and do not have symptoms. Treatment involves the same measures as prevention. Additional medications such as antiplatelets (including aspirin), beta blockers, or nitroglycerin may be recommended. Procedures such as percutaneous coronary intervention (PCI) or coronary artery bypass surgery (CABG) may be used in severe disease. In those with stable CAD it is unclear if PCI or CABG in addition to the other treatments improves life expectancy or decreases heart attack risk.In 2015, CAD affected 110 million people and resulted in 8.9 million deaths. It makes up 15.6% of all deaths, making it the most common cause of death globally. The risk of death from CAD for a given age decreased between 1980 and 2010, especially in developed countries. The number of cases of CAD for a given age also decreased between 1990 and 2010. In the United States in 2010, about 20% of those over 65 had CAD, while it was present in 7% of those 45 to 64, and 1.3% of those 18 to 45; rates were higher among men than women of a given age.\n\nSigns and symptoms\nThe narrowing of coronary arteries reduces the supply of oxygen-rich blood flowing to the heart, which becomes more pronounced during strenuous activities during which the heart beats faster. For some, this causes severe symptoms, while others experience no symptoms at all. The most common symptom is chest pain or discomfort that occurs regularly with activity, after eating, or at other predictable times;]
Indexify 的优势:
Indexify 解决了 RAG 系统中数据噪声的问题,它可以有效地解析非结构化文档 (例如 PDF 或 HTML),并消除嵌入生成过程中的干扰因素。
五、基于多步骤推理的检索增强生成系统及 DSPy 的应用
5.1 定义签名
5.1.1 RAGSignature
首先,我们需要定义两个关键的签名 (Signature) 来指导 DSPy 的工作流程:
class RAGSignature(dspy.Signature):"""根据给定的上下文回答问题。"""context = dspy.InputField(desc="可能包含相关事实")question = dspy.InputField()answer = dspy.OutputField(desc="不超过 1 段的答案")
这个签名定义了 RAG 系统的基本输入输出:
-
Context: 包含与问题相关的事实信息的上下文。
-
Question: 用户提出的问题。
-
Answer: 模型生成的答案。
desc
参数用于提供描述信息,帮助 DSPy 更好地理解语义,优化处理流程。
5.1.2 GenerateSearchQuery
由于多步骤推理系统会尝试将复杂问题分解成多个易于处理的子问题,因此我们需要另一个程序来根据问题生成查询:
class GenerateSearchQuery(dspy.Signature):"""编写一个简单的搜索查询,以帮助回答复杂的问题。"""context = dspy.InputField(desc="可能包含相关事实")question = dspy.InputField()query = dspy.OutputField()
这个签名用于生成搜索查询:
-
context: 已有的上下文信息。
-
question: 用户提出的问题。
-
query: 生成的搜索查询。
5.2 构建 MultiHopChainOfThoughtRAG
类
from dsp.utils import deduplicateclass MultiHopChainOfThoughtRAG(dspy.Module):def __init__(self, passages_per_hop=3, max_hops=2):super().__init__()self.generate_query = [dspy.ChainOfThought(GenerateSearchQuery) for _ in range(max_hops)]self.retrieve = dspy.Retrieve(k=passages_per_hop)self.generate_answer = dspy.ChainOfThought(RAGSignature)self.max_hops = max_hopsself.k = passages_per_hopdef forward(self, question):context = []for hop in range(self.max_hops):query = self.generate_query[hop](context=context, question=question).querypassages = generate_context(query, k=self.k)context = deduplicate(context + passages)pred = self.generate_answer(context=context, question=question)return dspy.Prediction(context=context, answer=pred.answer)
这个类实现了多跳思维链 RAG 的核心逻辑:
-
初始化: 创建多个
GenerateSearchQuery
实例 (根据max_hops
),用于生成多轮查询;初始化检索模块和答案生成模块。 -
forward 方法:
-
循环执行
max_hops
次,每次生成一个新的查询,并使用generate_context
函数检索相关段落。 -
使用
deduplicate
函数对所有检索到的段落进行去重,避免信息冗余。 -
最后,使用
generate_answer
模块根据最终的上下文信息生成答案。
-
5.3 测试系统
接下来,让我们测试一下我们构建的基于多步骤推理的检索增强生成系统。
query = "过量服用扑热息痛会导致肾衰竭吗?如果我一次服用 3 克,算过量吗?"
response = multi_hop_rag(query).answer
print(response)答案:
过量服用扑热息痛不会导致肾衰竭,对于健康的成年人来说,一次服用 3 克不算过量。
这段代码模拟了一个用户查询,并打印出系统生成的答案。
5.4 查看推理过程
可以使用以下代码查看系统后台的推理过程:
turbo.inspect_history(1)
根据给定的上下文回答问题。
请遵循以下格式。
上下文: 可能包含相关事实
问题: ${question}
推理: 让我们一步一步地思考以${生成答案}。我们...
答案: 不超过 2 行的答案
上下文:
«扑热息痛中毒(也称为对乙酰氨基酚中毒)是由过量使用扑热息痛(对乙酰氨基酚)引起的。大多数人在服药过量后的最初 24 小时内几乎没有症状或只有一些非特异性症状,例如感觉疲倦、腹痛或恶心。在此之后,通常是几天没有任何症状,然后由于肝功能衰竭而出现皮肤发黄、血液凝固问题和意识模糊。其他并发症可能包括肾衰竭、胰腺炎、低血糖和乳酸酸中毒。如果不进行治疗,中毒会在 4 到 18 天后导致死亡。扑热息痛中毒可能是意外发生的,也可能是企图自杀。中毒的危险因素包括酗酒、营养不良和服用某些其他有肝毒性的药物。肝损伤不是由扑热息痛本身引起的,而是由其代谢物之一,N-乙酰基对苯醌亚胺 (NAPQI) 引起的。NAPQI 会降低肝脏的谷胱甘肽水平,并直接损害肝脏细胞。诊断依据是在服药后特定时间测量的血液扑热息痛水平。通常将这些值绘制在 Rumack-Matthew 列线图上,以确定关注程度。如果患者在服药过量后立即就医,治疗可能包括活性炭。不建议试图强迫患者呕吐。如果存在中毒的可能性,建议使用解毒剂乙酰半胱氨酸。该药物通常至少服用 24 小时。康复后可能需要精神科护理。如果肝损伤变得严重,可能需要进行肝移植。是否需要移植通常取决于血液 pH 值低、血乳酸高、血液凝固不良或明显的肝性脑病。如果及早治疗,肝功能衰竭很少见。大约 0.1% 的病例会死亡。扑热息痛中毒最早是在 20 世纪 60 年代被描述的。中毒发生率在世界各地差异很大。在美国,每年发生超过 100,000 例病例。在英国,它是导致服药过量人数最多的药物。幼儿最常受到影响。在美国和英国,扑热息痛是急性肝功能衰竭的最常见原因。
体征和症状
扑热息痛中毒的体征和症状发生在三个阶段。第一阶段在服药过量后的数小时内开始,表现为恶心、呕吐、面色苍白和出汗。然而,患者在中毒的最初 24 小时内通常没有特异性症状或只有一些轻微症状。在极少数情况下,如果服药过量,患者可能会在中毒早期出现代谢性酸中毒和昏迷的症状。第二阶段发生在服药过量后 24 小时到 72 小时之间,表现为肝损伤加重的迹象。一般来说,肝细胞在代谢扑热息痛时会发生损伤。患者可能会出现右上腹疼痛。肝损伤的加重还会改变肝功能的生化指标;国际标准化比值 (INR) 以及肝转氨酶 ALT 和 AST 会升高至异常水平。在此阶段也可能发生急性肾功能衰竭,通常是由肝肾综合征或多器官功能障碍综合征引起的。在某些情况下,急性肾功能衰竭可能是中毒的主要临床表现。在这些情况下,有人认为有毒代谢物在肾脏中的产生量高于肝脏。第三阶段发生在 3 到 5 天后,其特征是大块肝坏死的并发症,导致暴发性肝功能衰竭,并伴有凝血缺陷、低血糖、肾功能衰竭、肝性脑病、脑肿胀、败血症、多器官功能衰竭和死亡等并发症。如果患者在第三阶段存活下来,肝坏死就会继续发展,肝肾功能通常会在几周内恢复正常。扑热息痛中毒的严重程度取决于剂量和是否接受了适当的治疗。
原因
扑热息痛的毒性剂量差异很大。一般来说,健康成年人建议的最大日剂量为 4 克。剂量越高,中毒的风险就越大。在成年人中,单次剂量超过 10 克或体重每公斤 200 毫克(以较低者为准)很可能会导致中毒。如果 24 小时内多次服用较小剂量超过这些水平,也可能发生中毒。每天服用 1 克扑热息痛,持续两周后,患者的肝脏丙氨酸转氨酶水平预计会升高至正常值的约三倍。这种剂量不太可能导致肝功能衰竭。研究表明,服用超过正常剂量 3 到 4 天的患者很少出现明显的肝毒性。在成年人中,如果在过去的 48 小时内每天服用 6 克,则可能会导致中毒,而在儿童中,急性剂量超过体重每公斤 200 毫克可能会导致中毒。在儿童中,急性扑热息痛过量很少引起疾病或死亡,而且儿童的水平需要治疗的情况非常少见,长期服用超过正常剂量的药物是儿童中毒的主要原因。故意过量服用(自残,有自杀意图)经常与扑热息痛中毒有关。在 2006 年的一篇综述中,扑热息痛是故意过量服用中最常服用的化合物。在极少数情况下,正常使用扑热息痛也可能导致中毒。这可能是由于个体(“特异体质”)在处理扑热息痛的某条代谢途径中某些酶的表达和活性方面存在差异(参见扑热息痛的代谢)。
风险因素
许多因素都可能增加扑热息痛中毒的风险。长期过量饮酒会诱导 CYP2E1,从而增加扑热息痛的潜在毒性。在一项对肝损伤患者的研究中,64% 的患者报告每天饮酒量超过 80 克,而 35% 的患者每天饮酒量不超过 60 克。一些临床毒理学家一直在争论是否应该将长期酗酒视为一种风险因素。对于长期饮酒者来说,在扑热息痛过量时急性饮酒可能具有保护作用。对于非长期饮酒者来说,急性饮酒没有保护作用。
禁食是一个风险因素,可能是因为肝脏谷胱甘肽储备耗尽。同时使用 CYP2E1 诱导剂异烟肼会增加肝毒性的风险,尽管目前尚不清楚在这种情况下 2E1 诱导是否与肝毒性有关。据报道,同时使用其他诱导 CYP 酶的药物,如抗癫痫药(包括卡马西平、苯妥英钠和巴比妥类药物),也是风险因素。
病理生理学
研究表明,在正常治疗剂量下服用扑热息痛是安全的。服用治疗剂量后,它主要通过与硫酸盐和葡萄糖醛酸结合的 II 期代谢转化为无毒代谢物,一小部分通过细胞色素 P450 酶系统氧化。细胞色素 P450 2E1 和 3A4 将大约 5% 的扑热息痛转化为一种高反应性中间代谢物 N-乙酰基-对苯醌亚胺 (NAPQI)。在正常情况下,NAPQI 通过与谷胱甘肽结合解毒,形成半胱氨酸和硫醇尿酸结合物。如果扑热息痛过量,硫酸盐和葡萄糖醛酸途径就会饱和,更多的扑热息痛会被分流到细胞色素 P450 系统,产生 NAPQI。结果,由于对谷胱甘肽的需求高于其再生速度,肝细胞内的谷胱甘肽供应就会耗尽。因此,NAPQI 以其有毒形式保留在肝脏中,并与细胞膜分子发生反应,导致广泛的肝细胞损伤和死亡,从而导致急性肝坏死。在动物研究中,肝脏中的谷胱甘肽储存量必须降至正常水平的 70% 以下,才会出现肝毒性。
诊断
患者服用扑热息痛的病史对于诊断有一定的准确性。诊断中毒最有效的方法是检测血液中的扑热息痛水平。1975 年开发的一种药物列线图,称为 Rumack-Matthew 列线图,根据服药后特定时间测量的血清扑热息痛浓度来估计中毒风险。为了确定潜在的肝毒性风险,将扑热息痛水平沿着列线图进行追踪。使用绘制在列线图上的定时血清扑热息痛水平似乎是指示潜在肝损伤的最佳指标。在服药后最初四个小时内测量的扑热息痛水平可能会低估体内的扑热息痛含量,因为扑热息痛可能仍在从胃肠道吸收的过程中。因此,不建议在 4 小时前测量血清水平。肝毒性的临床或生化证据可能在一到四天内出现,但在严重的情况下,12 小时内就可能出现。右上腹压痛可能存在,可以帮助诊断。实验室检查可能会显示肝坏死的证据,表现为 AST、ALT、胆红素升高,凝血时间延长,特别是凝血酶原时间延长。扑热息痛过量后,当 AST 和 ALT 超过 1000 IU/L 时,即可诊断为扑热息痛引起的肝毒性。在某些情况下,AST 和 ALT 水平可能会超过 10,000 IU/L。
体液检测
在临床中毒情况下或为了帮助对可疑死亡进行法医调查,可以对血液、血浆或尿液中的扑热息痛进行定量分析,作为一种诊断工具。服用典型剂量的扑热息痛后,血清中的浓度通常在 30 mg/L 以下达到峰值,相当于 200 μmol/L。在服药过量的患者中,通常观察到 30-300 mg/L (200-2000 μmol/L) 的水平。在因急性过量服用而死亡的人中,死后血液中的扑热息痛水平在 50 到 400 mg/L 之间。目前,实验室使用自动化比色技术、气相色谱法和液相色谱法分析生理样本中的药物。
预防
限制供应
一些国家/地区已尝试限制扑热息痛片的供应量。在英国,药店出售的非处方扑热息痛被限制在 32 片 500 毫克的包装内,非药店出售的非处方扑热息痛被限制在 16 片 500 毫克的包装内。药剂师可以根据自己的判断,为患有慢性病的人提供最多 100 片扑热息痛。在爱尔兰,限制分别是 24 片和 12 片。随后的研究表明,大量减少扑热息痛的供应对减少扑热息痛过量导致的中毒死亡具有显著效果。一种建议的预防方法是将扑热息痛列为处方药,或将其完全从市场上撤下。然而,过量服用是一个相对较小的问题;例如,每年有 0.08% 的英国人口(超过 5 万人)因扑热息痛过量而就诊。相比之下,扑热息痛是一种安全有效的药物,数百万人服用后都没有出现并发症。此外,其他止痛药(如阿司匹林)过量服用的毒性更大,而非甾体类抗炎药在正常使用后更容易出现不良反应。
**与其他药物联合使用**减少对乙酰氨基酚过量服用造成伤害的一种策略是将对乙酰氨基酚与催吐剂或解毒剂预先混合在药片中出售。Paradote 是英国销售的一种药片,它将 500 毫克对乙酰氨基酚与 100 毫克蛋氨酸混合在一起,蛋氨酸是一种氨基酸,以前用于治疗对乙酰氨基酚过量服用。
到目前为止,还没有关于对乙酰氨基酚与其最常用的解毒剂乙酰半胱氨酸联合使用效果的研究。
骨化三醇是维生素 D3 的活性代谢物,似乎是谷胱甘肽产生的催化剂。研究发现,骨化三醇在大鼠星形胶质细胞原代培养物中,平均可使谷胱甘肽水平提高 42%,在给药后 24 小时和 48 小时,谷胱甘肽蛋白浓度从 29 nmol/mg 增加到 41 nmol/mg;在给药后 96 小时,它对谷胱甘肽水平仍有影响。有人建议,通过注射联合使用骨化三醇可能会改善治疗效果。**扑热息痛的替代品**已经合成了 L-焦谷氨酸(PCA,谷胱甘肽的生物合成前体)的对乙酰氨基酚酯前药,以减少对乙酰氨基酚的肝毒性,并提高其生物利用度。对不同对乙酰氨基酚酯的毒理学研究表明,L-5-氧代-吡咯烷-2-对乙酰氨基酚羧酸盐在给小鼠服用过量对乙酰氨基酚后,可以降低其毒性。腹腔注射该酯后,小鼠肝脏谷胱甘肽值与未经处理的对照组小鼠的谷胱甘肽水平相当。用相同剂量的对乙酰氨基酚处理的小鼠组,其谷胱甘肽水平显著降低了 35% (p<0.01 vs 未经处理的对照组)。口服半数致死量 (LD50) 大于 2000 mg/kg,而腹腔注射的 LD50 为 1900 mg/kg。这些结果,连同良好的水解和生物利用度数据表明,这种酯是扑热息痛前药的潜在候选者。**治疗****胃肠道净化**在成人中,对乙酰氨基酚过量服用的初始治疗方法是胃肠道净化。在正常情况下,对乙酰氨基酚在两小时内就能从胃肠道完全吸收,因此,如果能在两小时内进行净化,效果最佳。如果服用的剂量可能危及生命,并且可以在服用后 60 分钟内进行洗胃,则可以考虑洗胃(俗称“洗胃”)。活性炭是最常用的胃肠道净化方法,因为它能吸附对乙酰氨基酚,减少其胃肠道吸收。与洗胃相比,服用活性炭导致误吸的风险也更低。活性炭似乎在服用后 30 分钟到两小时内使用效果最佳。对于因同时服用了其他药物或服用了缓释或延迟释放的对乙酰氨基酚制剂而导致胃排空延迟的患者,可以考虑在两小时后服用活性炭。如果同时服用的药物需要进行净化,也应该服用活性炭。人们不愿意在对乙酰氨基酚过量服用时服用活性炭,因为担心活性炭也可能会吸附口服解毒剂乙酰半胱氨酸。研究表明,如果将活性炭和乙酰半胱氨酸一起服用,乙酰半胱氨酸被吸收到体内的量会减少 39%。对于服用活性炭后是否要改变口服乙酰半胱氨酸的剂量,甚至是否需要改变乙酰半胱氨酸的剂量,目前还存在争议。静脉注射乙酰半胱氨酸与活性炭没有相互作用。
在对乙酰氨基酚过量服用时,用吐根糖浆催吐没有任何作用,因为它引起的呕吐会延迟有效服用活性炭和口服乙酰半胱氨酸的时间。6 岁以下儿童在意外服用急性过量药物后,极少发生肝损伤。意外接触对乙酰氨基酚的儿童无需进行洗胃、服用活性炭或吐根糖浆等胃肠道净化措施。**乙酰半胱氨酸**乙酰半胱氨酸(也称为 N-乙酰半胱氨酸或 NAC)通过补充体内抗氧化剂谷胱甘肽的储存来降低对乙酰氨基酚的毒性。谷胱甘肽与有毒的 NAPQI 代谢物发生反应,使其不会损害细胞,并能安全地排出体外。NAC 通常在治疗列线图(一个针对有风险因素的患者,一个针对没有风险因素的患者)后使用,但现在不再建议使用列线图,因为支持使用风险因素的证据基础很差,而且不一致,而且许多风险因素不精确,在临床实践中很难确定。半胱氨酸和蛋氨酸也被用于预防肝毒性,但研究表明,与乙酰半胱氨酸相比,这两种药物的不良反应更多。此外,乙酰半胱氨酸已被证明是一种更有效的解毒剂,特别是对于服用后 8 小时以上才就诊的患者,以及出现肝功能衰竭症状的患者。
如果患者在对乙酰氨基酚过量服用后 8 小时内就诊,那么乙酰半胱氨酸可以显著降低严重肝毒性的风险,并保证患者存活。如果在服用后 8 小时以上才开始使用乙酰半胱氨酸,那么它的效果就会急剧下降,因为肝脏中的一系列毒性反应已经开始,急性肝坏死和死亡的风险会急剧增加。虽然乙酰半胱氨酸越早使用效果越好,但在服用后 48 小时内使用仍然有效。如果患者在对乙酰氨基酚过量服用后 8 小时以上才就诊,那么活性炭就没有用了,应该立即开始使用乙酰半胱氨酸。在更早的时候,当患者到达医院时,可以先服用活性炭,然后在等待实验室的扑热息痛水平检测结果出来之前,开始使用乙酰半胱氨酸。
在美国的实践中,如果在服用后 8 小时内使用,静脉注射 (IV) 和口服给药被认为是同样有效和安全的。然而,在澳大利亚和英国的实践中,静脉注射是唯一推荐的给药途径。口服乙酰半胱氨酸的负荷剂量为 140 毫克/公斤,然后每 4 小时服用 70 毫克/公斤,持续 17 次,如果患者在服用后 1 小时内呕吐,则必须重复服用该剂量。口服乙酰半胱氨酸的耐受性可能很差,因为它味道 unpleasant、有异味,而且容易引起恶心和呕吐。如果由于服用了其他药物,需要重复服用活性炭,那么后续剂量的活性炭和乙酰半胱氨酸应该错开服用。
静脉注射乙酰半胱氨酸以持续输注的方式给药,持续 20 小时,总剂量为 300 毫克/公斤。推荐的给药方法是在 15 到 60 分钟内输注 150 毫克/公斤的负荷剂量,然后在 4 小时内输注 50 毫克/公斤;最后 100 毫克/公斤在剩余的 16 小时内输注完毕。静脉注射乙酰半胱氨酸的优点是可以缩短住院时间,增加医生和患者的便利性,并且可以服用活性炭来减少对乙酰氨基酚和任何同时服用的药物的吸收,而不用担心会干扰口服乙酰半胱氨酸。 静脉注射的剂量因体重而异,特别是对儿童而言。对于体重不足 20 公斤的患者,负荷剂量为 150 毫克/公斤,溶于 3 毫升/公斤的稀释剂中,在 60 分钟内输注完毕;第二次剂量为 50 毫克/公斤,溶于 7 毫升/公斤的稀释剂中,在 4 小时内输注完毕;第三次也是最后一次剂量为 100 毫克/公斤,溶于 14 毫升/公斤的稀释剂中,在 16 小时内输注完毕。乙酰半胱氨酸治疗最常见的不良反应是类过敏反应,通常表现为皮疹、喘息或轻度低血压。可能会导致不孕或死亡。接受静脉注射乙酰半胱氨酸治疗的患者更容易出现不良反应,发生率高达 20%。类过敏反应更有可能发生在第一次输液时(负荷剂量)。在极少数情况下,易感人群(如哮喘或特应性皮炎患者)可能会出现严重的危及生命的反应,其特征可能是呼吸困难、面部肿胀,甚至死亡。
如果出现类过敏反应,应暂时停止或减缓乙酰半胱氨酸的输注速度,并使用抗组胺药和其他支持性护理措施。例如,如果出现明显的支气管痉挛,可以使用雾化吸入的 β 受体激动剂,如沙丁胺醇(或对有乙酰半胱氨酸引起的支气管痉挛病史的患者进行预防性使用)。密切监测液体和电解质水平也很重要。**肝移植**对于出现急性肝功能衰竭或预计会死于肝功能衰竭的患者,主要的治疗方法是肝移植。肝移植在专科中心进行。最常用的肝移植标准是由伦敦国王学院医院的医生制定的。如果患者在液体复苏后动脉血 pH 值低于 7.3,或者患者在 24 小时内出现 III 度或 IV 度脑病、凝血酶原时间大于 100 秒以及血清肌酐大于 300 微摩尔/升,则建议进行移植。还使用了其他形式的肝脏支持,包括部分肝移植。这些技术的优点是可以为患者提供支持,同时让患者自身的肝脏再生。一旦肝功能恢复,就开始使用免疫抑制药物,患者必须在余生中服用免疫抑制药物。**预后**对乙酰氨基酚过量服用后的死亡率在服用后两天内会增加,在第四天达到峰值,然后逐渐下降。酸中毒是可能的死亡率和是否需要移植的最重要的单一指标。据报道,有记录表明 pH 值低于 7.30 的患者,如果不进行移植,死亡率为 95%。预后不良的其他指标包括慢性肾病(3 期或更严重)、肝性脑病、凝血酶原时间显著延长或血乳酸水平升高(乳酸酸中毒)。一项研究表明,如果凝血因子 V 水平低于正常水平的 10%,则预后不良(91% 的死亡率),而如果凝血因子 VIII 与凝血因子 V 的比率低于 30,则预后良好(100% 的存活率)。预后不良的患者通常会被确定为可能需要进行肝移植。预计没有死亡的患者会完全康复,并且拥有正常的预期寿命和生活质量。**流行病学**许多非处方药和处方药都含有对乙酰氨基酚。由于它很容易获得,而且毒性相对较高(与布洛芬和阿司匹林相比),因此过量服用的可能性要高得多。扑热息痛中毒是全世界最常见的中毒原因之一。在美国、英国、澳大利亚和新西兰,扑热息痛是最常见的药物过量原因。此外,在美国和英国,它都是急性肝功能衰竭的最常见原因。
据估计,1989 年至 1990 年,英格兰和威尔士发生了约 41,200 例扑热息痛中毒事件,死亡率为 0.40%。据估计,英格兰和威尔士每年有 150 到 200 人死于扑热息痛中毒,15 到 20 人接受了肝移植。在美国,扑热息痛过量导致的毒物控制中心电话数量超过任何其他药物过量,每年超过 100,000 个电话,以及 56,000 次急诊室就诊、2,600 次住院治疗和 458 例急性肝功能衰竭死亡。美国疾病控制与预防中心对 2000 年 11 月至 2004 年 10 月期间发生的急性肝功能衰竭病例进行的一项研究发现,扑热息痛是造成成年人 41% 的病例和儿童 25% 的病例的原因。**参考文献**
外部链接
Gerth, Jeff; T. Christian Miller (September 20, 2013). "Use Only as Directed". ProPublica. Retrieved October 12, 2013.»**问题:** 过量服用扑热息痛可以治疗肾衰竭吗?如果我一次服用 3 克,算过量吗?**推理:** 让我们一步一步地思考以生成答案。我们知道扑热息痛过量会导致肝功能衰竭,而不是肾功能衰竭。对于健康的成年人来说,一次服用 3 克扑热息痛不算过量。**答案:** 过量服用扑热息痛不能治疗肾衰竭,对于健康的成年人来说,一次服用 3 克不算过量。
可以看到,输出结果令人印象深刻。我们的模型不仅知道如何处理谬误(例如,过量服用扑热息痛可以治疗肾功能衰竭的观点),而且还可以推断出,对于成年人来说,服用最多 4 克扑热息痛并不危险。因此,服用 3 克不算过量。
我们甚至可以提出子问题之间没有共同点的问题,例如:
查询: 什么是原发性进行性失语症?它会导致心脏病发作吗?如果不会,那是什么原因导致的?
query = "什么是原发性进行性失语症?它会导致心脏病发作吗?如果不会,那是什么原因导致的?"
response = multi_hop_rag(query).answer
print(response)
答案: 原发性进行性失语症是一种影响语言能力的神经系统疾病。它不会导致心脏病发作。心脏病发作通常是由心血管疾病引起的,例如动脉粥样硬化、高血压和其他风险因素。
分析: 尽管原发性进行性失语症和心脏病发作之间没有直接的关联,系统仍然能够获取所需的上下文信息分别检索相关信息,并给出合理的答案。
六、使用 Gradio 创建简单的用户界面
为了更好地展示系统功能,我们使用 Gradio 构建了一个简单的用户界面:
import gradio as grwith gr.Blocks() as demo:chatbot = gr.Chatbot()msg = gr.Textbox()clear = gr.ClearButton([msg, chatbot])def respond(query, chat_history):response = multi_hop_rag(query)chat_history.append((query, response.answer))return "", chat_historymsg.submit(respond, [msg, chatbot], [msg, chatbot])# 启动 Gradio 服务器
demo.launch(share=True)
# demo.launch(share=True) if using colab
# demo.close() to close the server
用户界面示例: 什么是脂质硬皮病?它有哪些症状?
七、总结
本文介绍了如何使用 DSPy 构建基于多步骤推理的检索增强生成系统。我们从定义签名开始,逐步实现了多跳思维链 RAG 的核心逻辑,并通过实例展示了系统的推理能力和问答效果。最后,我们使用 Gradio 为系统创建了一个简单的用户界面,提升了用户体验。
参考资料
[1]. Indexify:https://getindexify.ai/
[2]. Indexify GitHub:https://github.com/tensorlakeai/indexify/
[3]. DsPy:https://github.com/stanfordnlp/dspy
[4]. DSPy Tutorials:https://dspy-docs.vercel.app/docs/tutorials/simplified-baleen
[5]. gamino/wiki_medical_terms:https://huggingface.co/datasets/gamino/wiki_medical_terms
[6]. Omar Khattab, Arnav Singhvi, Paridhi Maheshwari, Zhiyuan Zhang, Keshav Santhanam, Sri Vardhamanan, Saiful Haq, Ashutosh Sharma, Thomas T. Joshi, Hanna Moazam, Heather Miller, Matei Zaharia, Christopher Potts, R. (2023). DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines: https://arxiv.org/pdf/2310.03714