展示使用 DSPy 和 Indexify 构建多跳检索系统的过程 TLDR;
在本文中,我们将探讨多跳检索及其如何被利用来构建需要复杂推理的RAG系统
我们将通过使用Indexify、OpenAI和DSPy构建医疗领域的问答聊天机器人来展示这一技术
多跳链式思维RAG如何高效地回答复杂问题。
介绍 检索增强生成(RAG)系统已成为构建基于LLM的应用程序的一种强大方法。RAG系统首先通过检索模型从外部知识源检索信息,然后利用这些信息提示LLM生成响应。
然而,基本的RAG系统(也称为简单RAG)在处理需要对多个信息片段进行推理的复杂查询时可能面临挑战。这就是多跳检索发挥作用的地方。
在多跳检索中,系统通过多个步骤或“跳跃”收集信息,以回答复杂问题或收集详细信息。这种技术在高级问答系统中很常见,其中多个来源或文档包含回答问题所需的信息。
构建多跳检索是自然语言处理(NLP)和信息检索中的一个关键挑战,因为它要求系统理解不同信息片段之间的关系,以及它们如何共同构成整体答案。
在本文中,我的目标是展示使用DSPy和Indexify构建多跳检索系统的过程。我将使用该技术在医疗保健领域的RAG系统中,并演示它如何提高响应质量。
什么是多跳检索? 为了更好地理解多跳检索,我们先来看一个例子。
请注意,下面的检索步骤无法访问互联网,并且依赖于您提供的上下文。
假设您有一个查询:“在2024年由西印度群岛和美国共同举办的T20世界杯上,印度的队长是谁?”
假设我们将这个问题输入到一个向量数据库中,我们得到了两个最接近的上下文段落,可以解决这个问题:
“在2021年,维拉特·科利因20局世界杯格式不成功而辞去了印度T20队长职务,双方之间的敌意…”
和
“罗希特·夏尔马被任命为印度T20队的新队长 ,取代维拉特·科利,板球委员会在球队被淘汰后表示…”
在这两个段落中,没有明确提到2024年世界杯上谁是队长,但如果我们必须选择一个,我们会回答“罗希特·夏尔马”,因为:
维拉特·科利在2021年辞职,和
罗希特·夏尔马接任为新队长。
因此,很可能罗希特·夏尔马在2024年仍然是队长。同样,根据可用的上下文,可以说我们必须跳两次 才能到达答案。
这种逻辑思维对我们来说是正常的,因为我们是人类,但对于机器学习模型来说,这是一个很大的任务。多亏了LLMs,我们现在可以通过多跳检索轻松解决此类问题。
多跳检索的一些应用包括:
医疗机器人: 查找和查询患者的入院数据。
文本摘要: 高效地总结大量文本。
问答机器人: 提供各种类型查询的答案。
法律行业: 为法律案件创建检索模型。
人力资源行业: 通过匹配特定筛选条件找到合适的候选人。
问题陈述 在这个实验中,我将使用 Indexify、OpenAI 和 DSPy(一个声明式序列化 Python 框架)构建一个多跳问答聊天机器人。DSPy 是一个使语言模型(LMs)声明式编程的框架,替代了传统的提示方法,采用可组合模块。该框架对于构建涉及复杂推理的 LLM 驱动应用程序非常有用。
架构概述 Indexify Indexify 是一个高度可扩展的数据框架,旨在构建非结构化数据的摄取和提取管道。这些管道使用声明性配置进行定义。管道的每个阶段都可以使用任何 AI 模型执行结构化提取或转换摄取的数据。管道在数据摄取到 Indexify 后立即开始工作,使其非常适合交互式应用程序和低延迟用例。
Indexify 解决了影响 RAG 系统的一个主要问题:可扩展且可预测的非结构化数据解析。
OpenAI 我们将使用 OpenAI 的 API 来生成响应。如果您有他们的账户,也可以使用他们的 API。请访问:OpenAI 平台 。
DSPy DSPy 是一个框架,用于算法优化语言模型提示,而不是手动提示。如果你查看他们的 GitHub ,你会看到他们提到“编程——而不是提示”。他们是如何实现这一点的?通过使用签名、模块、指标和优化器。要了解更多关于 DSPy 的信息,请阅读 Omar Khattab 等人撰写的 论文 “DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines”。
数据集 对于本次实验,我将使用来自Hugging Face的维基百科医疗术语数据集。请查看这里:gamino/wiki_medical_terms (GPL 3.0许可证)。
代码设置 首选操作系统: Linux。如果您使用的是 Windows 或 macOS,请尝试使用 Linux 构建工具运行此程序。
在启动之前,让我们安装所需的包:
1 2 3 4 !pip install indexify-dspy !pip install indexify !pip install indexify-extractor-sdk !pip install gradio==4.31 .0
要测试包是否已正确安装:
1 2 3 import dspyfrom indexify import IndexifyClientfrom indexify_dspy.retriever import IndexifyRM
如果您遇到类似 ModuleError: “dspy not found”的问题,可以安装这个特定版本并尝试看看是否能解决该问题:
1 !pip install dspy-ai==2.0 .8
使用 Indexify 进行数据摄取 在我们启动 Indexify 服务器之前,让我们先看一下数据集:
1 2 3 4 import pandas as pddf = pd.read_parquet("hf://datasets/gamino/wiki_medical_terms/wiki_medical_terms.parquet" ) df=df.dropna() print (df)
这将输出:
我们有两列,page_title 和 page_text 。我们将使用 page_text 。
1 medical_descriptions = df['page_text' ].tolist()
现在我们完成了数据集的处理,让我们启动 Indexify 的服务器和提取器。
要启动服务器,请打开终端并输入:
1 2 $ curl https://getindexify.ai | sh $ ./indexify server -d
(这两行是分开的。)
打开第二个终端,下载并启动提取器,请使用:
1 2 3 $ indexify-extractor download tensorlake/minilm-l6 $ indexify-extractor download tensorlake/chunk-extractor $ indexify-extractor join-server
在这两个终端启动并运行后,让我们摄取 medical_descriptions:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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, )
我花了大约 30 秒摄取了 7,000 条记录!相当快!
现在我们已经创建了客户端,让我们使用 DSPy 集成来尝试查看它如何检索前 k 个上下文:
1 2 3 4 def generate_context (query, k ): retrieve = IndexifyRM(indexify_client) topk_passages = retrieve(query, "medical.minilml6.embedding" , k=k).passages return topk_passages
例如,使用这个查询:
1 2 query = "heart attack" generate_context(query=query, k=2 )
这将返回:
1 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 消除了解析 PDF、生成嵌入和使用它们进行查询的麻烦。
这非常强大,因为 RAG 系统的最大失败点之一是数据中的噪声。当我们处理任何非结构化文档,例如 PDF 或 HTML,并使用标准解析器时,它会在最终文本中留下多个伪影,从而混淆嵌入生成过程。
通过 Indexify,我们使用即插即用的解决方案消除了剩余的伪影。他们的 文档 解释了引擎的能力。
多跳链式思维 RAG 与 DSPy 让我们创建一个类 RAGSignature,并定义三个输入字段:
上下文 :LLM 使用的查询上下文。
问题 :用户将要询问的查询。
答案 :对查询的回答。
注意我在上下文和答案中定义的描述;有趣的是,DSPy 在构建管道时使用这个描述,以确保语义正确,从而获得最佳结果。
1 2 3 4 5 6 7 class RAGSignature (dspy.Signature): """根据给定的上下文回答问题。""" context = dspy.InputField(desc="可能包含相关事实" ) question = dspy.InputField() answer = dspy.OutputField(desc="答案不超过 1 段" )
由于多跳系统尝试将问题分解为几个可管理的问题,以创建问题的部分,我们将使用另一个签名,从问题中生成查询:
1 2 3 4 5 6 class GenerateSearchQuery (dspy.Signature): """编写一个简单的搜索查询,以帮助回答复杂问题。""" context = dspy.InputField(desc="可能包含相关事实" ) question = dspy.InputField() query = dspy.OutputField()
现在,最后,让我们构建 MultiHopChainOfThoughtRAG 类,它本质上尝试:
创建一个动态查询生成器,该生成器将运行 max_hops 次,这意味着我们可以定义模型在到达答案之前应该进行多少次跳跃。
每次,我们将生成的查询输入到我们的 Indexify 上下文提取器中,并获取回答该生成查询的上下文。我们这样做 max_hops 次,最后得到包含所有生成查询上下文的最终上下文。
最后,我们去重上下文,以删除重复的上下文实体。
通过这种方式,我们可以优雅地回答问题的每个部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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_hops self .k = passages_per_hop def forward (self, question ): context = [] for hop in range (self .max_hops): query = self .generate_query[hop](context=context, question=question).query passages = 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 的时候了。
结果 现在我们已经完成了艰难的部分,让我们看看结果。
查询 :过量服用对乙酰氨基酚会导致肾衰竭吗?如果我一次摄入3克,这算过量吗?
1 2 3 query = "Does overdosing on paracetamol cures kidney failure? If I consume 3 grams at once, is it an overdose?" response = multi_hop_rag(query).answer print (response)
答案:
过量服用对乙酰氨基酚不会导致肾衰竭,且一次摄入3克对健康成年人来说不算过量。
让我们看看后台发生了什么:
1 turbo.inspect_history(1 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 Answer questions based on the given context. --- Follow the following format . Context: may contain relevant facts Question: ${question} Reasoning: Let's think step by step in order to ${produce the answer}. We ... Answer: an answer not more than 2 lines --- Context: «对乙酰氨基酚中毒,也称为对乙酰氨基酚中毒,是由于过量使用对乙酰氨基酚(对乙酰氨基酚)而引起的。大多数人在过量后的前24小时内症状较少或不特异。这些症状包括疲倦、腹痛或恶心。通常在几天内没有任何症状,之后由于肝衰竭出现黄疸、出血问题和意识混乱等症状。其他并发症可能包括肾衰竭、胰腺炎、低血糖和乳酸酸中毒。如果没有发生死亡,患者通常在几周内完全康复。未经治疗,毒性导致的死亡通常在4到18天后发生。对乙酰氨基酚中毒可能是意外发生的,也可能是自杀企图。毒性风险因素包括酗酒、营养不良和服用某些其他肝毒性药物。肝损伤不是由对乙酰氨基酚本身引起的,而是由其代谢物N-乙酰-p-苯醌亚胺(NAPQI)引起的。NAPQI减少肝脏的谷胱甘肽并直接损害肝细胞。诊断基于服药后特定时间的血液中对乙酰氨基酚水平。这些值通常在Rumack-Matthew标尺上绘制,以确定关注程度。治疗可能包括活性炭,如果患者在过量后不久寻求医疗帮助。强迫患者呕吐是不推荐的。如果有潜在的毒性风险,建议使用解毒剂乙酰半胱氨酸。该药物通常给药至少24小时。恢复后可能需要精神护理。如果肝脏损伤严重,可能需要肝移植。移植的需求通常基于低血pH、高血乳酸、凝血不良或显著的肝性脑病。经过早期治疗,肝衰竭是罕见的。死亡发生在约0.1%的病例中。对乙酰氨基酚中毒首次描述于1960年代。中毒率在世界各地区差异显著。在美国,每年发生超过100,000例。在英国,它是导致最多过量服用的药物。幼儿最常受到影响。在美国和英国,对乙酰氨基酚是急性肝衰竭最常见的原因。 体征和症状 对乙酰氨基酚毒性的体征和症状分为三个阶段。第一阶段在过量后数小时内开始,表现为恶心、呕吐、面色苍白和出汗。然而,患者在中毒的前24小时内通常没有特异症状或仅有轻微症状。极少数情况下,在大剂量过量后,患者可能在中毒早期出现代谢性酸中毒和昏迷的症状。第二阶段发生在过量后24小时至72小时之间,表现为肝损伤加重的迹象。一般来说,肝细胞在代谢对乙酰氨基酚时会发生损伤。个体可能会感到右上腹部疼痛。肝损伤的加重也会改变肝功能的生化标志物;国际标准化比率(INR)和肝转氨酶ALT和AST升高至异常水平。急性肾衰竭也可能在此阶段发生,通常由肝肾综合症或多脏器功能障碍综合症引起。在某些情况下,急性肾衰竭可能是毒性的主要临床表现。在这些情况下,有人建议毒性代谢物在肾脏的产生量大于在肝脏的产生量。第三阶段在3到5天后出现,标志着大规模肝坏死并导致急性肝衰竭,伴随凝血缺陷、低血糖、肾衰竭、肝性脑病、脑肿胀、脓毒症、多脏器衰竭和死亡。如果存活过第三阶段,肝坏死将自行恢复,肝脏和肾脏功能通常在几周内恢复正常。对乙酰氨基酚毒性的严重程度取决于剂量和是否接受适当治疗。 原因 对乙酰氨基酚的毒性剂量变化很大。一般来说,健康成人的推荐最大日剂量为4克。更高的剂量会增加毒性的风险。在成人中,单次剂量超过10克或200 mg/kg体重(以较低者为准)有合理的可能性导致毒性。当24小时内多次小剂量超过这些水平时,也可能发生毒性。在连续两周每天服用1克对乙酰氨基酚四次后,患者的丙氨酸转氨酶通常会增加到正常值的三倍左右。这个剂量不太可能导致肝衰竭。研究表明,在3到4天内服用超过正常剂量的患者中,显著的肝毒性是罕见的。在成人中,过去48小时内每天6克的剂量可能导致毒性,而在儿童中,急性剂量超过200 mg/kg可能导致毒性。儿童的急性对乙酰氨基酚过量很少导致疾病或死亡,且儿童出现需要治疗的水平非常罕见,慢性大于正常剂量的服用是儿童毒性的主要原因。故意过量服用(自我中毒,带有自杀意图)在对乙酰氨基酚毒性中经常被提及。在2006年的一项回顾中,对乙酰氨基酚是故意过量服用中最常见的物质。在极少数个体中,正常使用对乙酰氨基酚也可能导致毒性。这可能是由于个体(“特异性”)在处理对乙酰氨基酚的某些代谢途径中某些酶的表达和活性差异。 风险因素 多种因素可能增加发展对乙酰氨基酚毒性的风险。慢性过量饮酒可能诱导CYP2E1,从而增加对乙酰氨基酚的潜在毒性。在一项对肝损伤患者的研究中,64%的人报告每日饮酒超过80克,而35%的人每日饮酒60克或更少。是否应将慢性酗酒视为风险因素在一些临床毒理学家中存在争议。对于慢性酒精使用者,在对乙酰氨基酚过量时急性饮酒可能具有保护作用。对于非慢性酒精使用者,急性饮酒没有保护作用。 禁食是一个风险因素,可能是因为肝脏谷胱甘肽储备的耗竭。与CYP2E1诱导剂异烟肼的同时使用增加了肝毒性的风险,尽管在这种情况下2E1诱导是否与肝毒性相关尚不清楚。与其他诱导CYP酶的药物(如抗癫痫药物,包括卡马西平、苯妥英和巴比妥类药物)的同时使用也被报告为风险因素。 病理生理学 在正常治疗剂量下服用时,对乙酰氨基酚被证明是安全的。在治疗剂量后,它大部分通过与硫酸盐和葡萄糖醛酸结合的第二相代谢转化为无毒代谢物,只有一小部分通过细胞色素P450酶系统氧化。细胞色素P450 2E1和3A4将约5%的对乙酰氨基酚转化为高度反应性的中间代谢物N-乙酰-p-苯醌亚胺(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 x 500 mg片剂和非药店16 x 500 mg片剂。药剂师可以根据患者的情况提供最多100片。爱尔兰的限制分别为24和12片。后续研究表明,减少大量可用性对减少对乙酰氨基酚过量导致的死亡有显著影响。一种建议的预防方法是将对乙酰氨基酚作为处方药,或完全将其从市场上移除。然而,过量服用是一个相对较小的问题;例如,英国0.08%的人口(超过5万人)每年因对乙酰氨基酚过量就医。相比之下,对乙酰氨基酚是一种安全有效的药物,数百万人在没有并发症的情况下服用。此外,阿司匹林等替代止痛药在过量时更具毒性,而非甾体抗炎药在正常使用后与更多不良反应相关。 与其他药物结合 减少对乙酰氨基酚过量造成伤害的一种策略是将其与催吐剂或解毒剂预先结合在片剂中销售。Paradote是一种在英国销售的片剂,将500 mg对乙酰氨基酚与100 mg美托洛尔(一种以前用于治疗对乙酰氨基酚过量的氨基酸)结合在一起。 到目前为止,还没有关于与其最常用解毒剂乙酰半胱氨酸联合使用的对乙酰氨基酚有效性的研究。活性维生素D3的代谢物钙三醇似乎是谷胱甘肽生成的催化剂。研究发现,钙三醇在大鼠星形胶质细胞原代培养中平均增加谷胱甘肽水平42%,在给药后24和48小时内,谷胱甘肽蛋白浓度从29 nmol/mg增加到41 nmol/mg;在给药后96小时仍然对谷胱甘肽水平有影响。有人提出,通过注射联合给药钙三醇可能改善治疗结果。 对乙酰氨基酚替代品 合成了对乙酰氨基酚酯前药与L-吡咯谷氨酸(PCA),作为谷胱甘肽的生物合成前体,以减少对乙酰氨基酚的肝毒性并改善生物利用度。不同对乙酰氨基酚酯的毒理学研究表明,L-5-氧代-吡咯烷-2-对乙酰氨基酚羧酸盐在给小鼠过量对乙酰氨基酚后减少毒性。通过腹腔注射该酯诱导的小鼠的肝脏谷胱甘肽值与未处理小鼠对照组记录的GSH水平相当。接受等效剂量对乙酰氨基酚处理的小鼠显示谷胱甘肽显著减少35%(p<0.01与未处理对照组相比)。口服LD50大于2000 mg kg-1,而腹腔LD50为1900 mg kg-1。这些结果结合良好的水解和生物利用度数据表明,该酯是对乙酰氨基酚前药的潜在候选者。 治疗 胃肠道去污 在成人中,对乙酰氨基酚过量的初始治疗是胃肠道去污。在正常情况下,对乙酰氨基酚在胃肠道的吸收在两小时内完成,因此在此时间范围内进行去污最为有效。如果摄入的量可能危及生命,并且在摄入后60分钟内可以进行该程序,则可以考虑进行胃灌洗,也称为洗胃。活性炭是最常见的胃肠道去污程序,因为它能吸附对乙酰氨基酚,减少其在胃肠道的吸收。给药活性炭的吸入风险低于胃灌洗。似乎在摄入后30分钟到两小时内给药活性炭能获得最大益处。对于因共同摄入药物或服用缓释或延释对乙酰氨基酚制剂而可能延迟胃排空的患者,可以考虑在2小时后给药活性炭。如果共同摄入的药物需要去污,也应给药活性炭。由于担心活性炭可能也会吸附口服解毒剂乙酰半胱氨酸,因此在对乙酰氨基酚过量时对给药活性炭持谨慎态度。研究表明,当活性炭与乙酰半胱氨酸同时给药时,体内吸收的乙酰半胱氨酸减少39%。关于在给药活性炭后是否需要改变口服乙酰半胱氨酸的剂量,甚至是否需要改变乙酰半胱氨酸的剂量,存在相互矛盾的建议。静脉注射乙酰半胱氨酸与活性炭没有相互作用。 用呕吐剂诱导呕吐在对乙酰氨基酚过量中没有作用,因为它诱导的呕吐会延迟活性炭和口服乙酰半胱氨酸的有效给药。对于6岁以下的儿童,急性意外摄入后肝损伤极为罕见。意外接触的儿童不需要进行胃肠道去污,包括胃灌洗、活性炭或呕吐剂。 乙酰半胱氨酸 乙酰半胱氨酸,也称为N-乙酰半胱氨酸或NAC,通过补充体内抗氧化剂谷胱甘肽的储备来减少对乙酰氨基酚的毒性。谷胱甘肽与有毒的NAPQI代谢物反应,以防止其损害细胞并安全排泄。NAC通常根据治疗标尺给药(一个用于有风险因素的患者,一个用于没有风险因素的患者),但不再推荐使用该标尺,因为支持使用风险因素的证据基础较差且不一致,许多风险因素在临床实践中难以准确确定。半胱氨酸和美托洛尔也被用于预防肝毒性,尽管研究表明这两者与乙酰半胱氨酸相比更常见不良反应。此外,乙酰半胱氨酸已被证明是一种更有效的解毒剂,特别是在服药后超过8小时的患者和出现肝衰竭症状的患者中。如果患者在对乙酰氨基酚过量后不到八小时就就医,则乙酰半胱氨酸显著降低严重肝毒性的风险并保证生存。如果在摄入后超过8小时开始使用乙酰半胱氨酸,其有效性急剧下降,因为肝脏中的毒性事件级联已经开始,急性肝坏死和死亡的风险显著增加。尽管乙酰半胱氨酸在早期给药时最为有效,但如果在摄入后48小时内给药仍然具有益处。如果患者在对乙酰氨基酚过量后超过八小时就医,则活性炭无效,乙酰半胱氨酸应立即开始。在早期就医时,可以在患者到达时给药活性炭,并在等待对乙酰氨基酚水平结果返回时开始乙酰半胱氨酸。在美国的实践中,静脉(IV)和口服给药在摄入后8小时内被认为同样有效且安全。然而,在澳大利亚和英国的实践中,静脉给药是唯一推荐的途径。口服乙酰半胱氨酸的给药为140 mg/kg的负荷剂量,随后每四小时70 mg/kg共给17剂,如果患者在给药后1小时内呕吐,则必须重复该剂量。由于其不愉快的味道、气味以及引起恶心和呕吐的倾向,口服乙酰半胱氨酸可能耐受性差。如果因其他摄入药物需要重复给药活性炭,则后续的活性炭和乙酰半胱氨酸剂量应错开。静脉乙酰半胱氨酸以300 mg/kg的总剂量连续输注20小时。推荐的给药方式是将150 mg/kg的负荷剂量在15到60分钟内输注,随后在四小时内输注50 mg/kg;最后100 mg/kg在协议的剩余16小时内输注。静脉给药的优点是缩短住院时间,增加医生和患者的便利性,并允许给药活性炭以减少对乙酰氨基酚和任何共同摄入药物的吸收,而不必担心干扰口服乙酰半胱氨酸。静脉给药根据体重变化,特别是在儿童中。对于体重低于20 kg的患者,负荷剂量为150 mg/kg,稀释在3 mL/kg的稀释剂中,输注60分钟;第二剂量为50 mg/kg,稀释在7 mL/kg的稀释剂中,输注4小时;第三剂量为100 mg/kg,稀释在14 mL/kg的稀释剂中,输注16小时。乙酰半胱氨酸治疗的最常见不良反应是类过敏反应,通常表现为皮疹、喘息或轻度低血压。可能导致不孕或死亡。不良反应在接受静脉乙酰半胱氨酸治疗的患者中更为常见,发生率高达20%。类过敏反应在第一次输注(负荷剂量)时更可能发生。极少数情况下,可能在易感个体中发生严重的危及生命的反应,例如哮喘或特应性皮炎患者,可能表现为呼吸困难、面部肿胀,甚至死亡。如果发生类过敏反应,应暂时停止或减慢乙酰半胱氨酸的给药,并给予抗组胺药和其他支持性护理。例如,在显著支气管痉挛的情况下,可能需要雾化β激动剂如沙丁胺醇(或在有乙酰半胱氨酸引起的支气管痉挛历史的患者中进行预防性给药)。还应密切监测液体和电解质。 肝移植 对于发展为急性肝衰竭或预计将因肝衰竭而死亡的人,主要的管理方法是肝移植。肝移植在专科中心进行。最常用的肝移植标准由伦敦国王学院医院的医生制定。如果患者在液体复苏后动脉血pH低于7.3,或患者有III或IV级脑病、凝血酶原时间超过100秒、血清肌酐超过300 mmol/L,则建议进行移植。还使用其他形式的肝脏支持,包括部分肝移植。这些技术的优点是支持患者的同时让他们的肝脏再生。一旦肝功能恢复,开始使用免疫抑制药物,患者必须终身服用免疫抑制药物。 预后 对乙酰氨基酚过量的死亡率在摄入后两天增加,在第四天达到最高点,然后逐渐下降。酸中毒是可能死亡和需要移植的最重要单一指标。报告称,在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 (2013年9月20日). "Use Only as Directed". ProPublica. Retrieved October 12, 2013.» 问题:过量服用对乙酰氨基酚会治愈肾衰竭吗?如果我一次服用3克,我算过量吗? 推理:让我们逐步思考以得出答案。我们知道对乙酰氨基酚过量可能导致肝衰竭,而不是肾衰竭。一次服用3克对健康成年人来说不算过量。 答案:过量服用对乙酰氨基酚不会治愈肾衰竭,且一次摄入3克对健康成年人来说不算过量。
如您所见,输出非常令人印象深刻。我们的模型不仅知道如何处理谬论,例如过量服用对乙酰氨基酚会治愈肾衰竭的观点,而且还能够推理出对成年人来说最多4克的对乙酰氨基酚并不被认为是危险的。因此,摄入3克并不算过量。
我们甚至可以提出子问题之间没有共同点的问题,例如:
查询 :什么是原发性进行性失语症,它会导致心脏病发作吗?如果不会,那是什么导致的?
1 2 3 query = "What is Primary progressive aphasia and does it cause heart attacks? If not, what causes them?" response = multi_hop_rag(query).answer print (response)
答案:
原发性进行性失语症是一种损害语言能力的神经综合症。它不会导致心脏病发作。心脏病发作通常是由心血管疾病引起的,例如动脉粥样硬化、高血压和其他风险因素。
真酷!尽管PPA和心脏病发作之间没有共同的背景,我们的模型仍然能够获取所需的背景并自信地回答。
使用 Gradio 创建简单的 UI 让我们在我们的 Multi-Hop RAG 上创建一个简单的 UI,以便更好地进行视觉展示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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_history msg.submit(respond, [msg, chatbot], [msg, chatbot])
要启动 Gradio 服务器,请使用:
1 2 3 demo.launch(share=True )
查询 :什么是脂肪皮肤硬化症,它的症状是什么?
关键要点
在本文中,我们看到了使用 DSPy 的 Indexify 的一个应用。
我们从头开始构建了一个多跳思维链 RAG,并观察了它回答问题的高效性。
GitHub 有关完整的代码参考,请查看我的仓库:
https://github.com/sachink1729/DSPy-Multi-Hop-Chain-of-Thought-RAG
参考文献
Indexify GitHub
Indexify 文档
Indexify DSPy 集成
DSPy 教程