」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 NVIDIA AI 端點和 Ragas 評估醫療檢索增強生成 (RAG)

使用 NVIDIA AI 端點和 Ragas 評估醫療檢索增強生成 (RAG)

發佈於2024-11-15
瀏覽:898

Evaluating Medical Retrieval-Augmented Generation (RAG) with NVIDIA AI Endpoints and Ragas

在医学领域,采用先进技术对于加强患者护理和改进研究方法至关重要。检索增强生成 (RAG) 是这些开创性创新之一,它将大型语言模型 (LLM) 的强大功能与外部知识检索相结合。通过从数据库、科学文献和患者记录中提取相关信息,RAG 系统提供了更准确、上下文更丰富的响应基础,解决了纯法学硕士中经常观察到的过时信息和幻觉等限制。

在本概述中,我们将探讨 RAG 在医疗保健领域日益重要的作用,重点关注其改变药物发现和临床试验等应用的潜力。我们还将深入探讨评估医疗 RAG 系统独特需求所需的方法和工具,例如 NVIDIA 的 LangChain 端点和 Ragas 框架,以及 MACCROBAT 数据集(来自 PubMed Central 的患者报告集合)。


医疗 RAG 的主要挑战

  1. 可扩展性:随着医疗数据以超过 35% 的复合年增长率扩展,RAG 系统需要在不影响速度的情况下高效管理和检索信息,特别是在及时洞察可能影响患者护理的情况下。

  2. 专业语言和知识要求:医疗 RAG 系统需要针对特定​​领域进行调整,因为医学词汇和内容与金融或法律等其他领域有很大不同。

  3. 缺乏定制的评估指标:与通用 RAG 应用不同,医疗 RAG 缺乏合适的基准。传统指标(如 BLEU 或 ROUGE)强调文本相似性,而不是医学环境中至关重要的事实准确性。

  4. 按组件评估:有效的评估需要对检索和生成组件进行独立审查。检索必须提取相关的当前数据,并且生成组件必须确保检索内容的忠实性。

引入 Ragas 进行 RAG 评估

Ragas 是一个开源评估框架,提供了评估 RAG 管道的自动化方法。其工具包侧重于上下文相关性、召回率、忠实度和答案相关性。 Ragas 利用法学硕士作为法官模型,最大限度地减少了对手动注释数据的需求,从而使流程高效且具有成本效益。

RAG 系统的评估策略

为了进行稳健的 RAG 评估,请考虑以下步骤:

  1. 合成数据生成:根据向量存储文档生成三元组数据(问题、答案、上下文)以创建合成测试数据。
  2. 基于指标的评估:根据精度和召回率等指标评估 RAG 系统,将其响应与生成的合成数据作为基本事实进行比较。
  3. 独立组件评估:对于每个问题,评估检索上下文相关性和生成的答案准确性。

这是一个示例流程:给出诸如“充血性心力衰竭的典型血压测量是什么?”之类的问题。系统首先检索相关上下文,然后评估响应是否准确地解决了问题。

使用 NVIDIA API 和 LangChain 设置 RAG

要继续操作,请创建一个 NVIDIA 帐户并获取 API 密钥。使用以下命令安装必要的软件包:

pip install langchain
pip install langchain_nvidia_ai_endpoints
pip install ragas

下载MACCROBAT数据集,该数据集提供了可以通过LangChain加载和处理的全面医疗记录。

from langchain_community.document_loaders import HuggingFaceDatasetLoader
from datasets import load_dataset

dataset_name = "singh-aditya/MACCROBAT_biomedical_ner"
page_content_column = "full_text"

loader = HuggingFaceDatasetLoader(dataset_name, page_content_column)
dataset = loader.load()

使用 NVIDIA 端点和 LangChain,我们现在可以构建强大的测试集生成器并根据数据集创建合成数据:

from ragas.testset.generator import TestsetGenerator
from langchain_nvidia_ai_endpoints import ChatNVIDIA, NVIDIAEmbeddings

critic_llm = ChatNVIDIA(model="meta/llama3.1-8b-instruct")
generator_llm = ChatNVIDIA(model="mistralai/mixtral-8x7b-instruct-v0.1")
embeddings = NVIDIAEmbeddings(model="nv-embedqa-e5-v5", truncate="END")

generator = TestsetGenerator.from_langchain(
    generator_llm, critic_llm, embeddings, chunk_size=512
)
testset = generator.generate_with_langchain_docs(dataset, test_size=10)

部署和评估管道

在矢量商店上部署您的 RAG 系统,从实际医疗报告中生成示例问题:

# Sample questions
["What are typical BP measurements in the case of congestive heart failure?",
 "What can scans reveal in patients with severe acute pain?",
 "Is surgical intervention necessary for liver metastasis?"]

每个问题都与检索到的上下文和生成的真实答案相关联,然后可以将其用于评估检索和生成组件的性能。

Ragas 的自定义指标

医疗 RAG 系统可能需要自定义指标来评估检索精度。例如,指标可以确定检索到的文档对于搜索查询是否足够相关:

from dataclasses import dataclass, field
from ragas.evaluation.metrics import MetricWithLLM, Prompt

RETRIEVAL_PRECISION = Prompt(
    name="retrieval_precision",
    instruction="Is this result relevant enough for the first page of search results? Answer '1' for yes and '0' for no.",
    input_keys=["question", "context"]
)

@dataclass
class RetrievalPrecision(MetricWithLLM):
    name: str = "retrieval_precision"
    evaluation_mode = EvaluationMode.qc
    context_relevancy_prompt: Prompt = field(default_factory=lambda: RETRIEVAL_PRECISION)

# Use this custom metric in evaluation
score = evaluate(dataset["eval"], metrics=[RetrievalPrecision()])

结构化输出确保精度和可靠性

为了实现高效可靠的评估,结构化输出简化了处理。借助 NVIDIA 的 LangChain 端点,将您的 LLM 回答分为预定义的类别(例如,是/否)。

import enum

class Choices(enum.Enum):
    Y = "Y"
    N = "N"

structured_llm = nvidia_llm.with_structured_output(Choices)
structured_llm.invoke("Is this search result relevant to the query?")

结论

RAG 连接了法学硕士和密集向量检索,以实现跨医疗、多语言和代码生成领域的高效、可扩展的应用程序。在医疗保健领域,它带来准确、情境感知响应的潜力是显而易见的,但评估必须优先考虑准确性、领域特异性和成本效率。

概述的评估流程采用综合测试数据、NVIDIA 端点和 Ragas,提供了满足这些需求的强大方法。如需更深入地了解,您可以在 GitHub 上探索 Ragas 和 NVIDIA Generative AI 示例。

版本聲明 本文轉載於:https://dev.to/koolkamalkishor/evaluating-medical-retrieval-augmented-generation-rag-with-nvidia-ai-endpoints-and-ragas-2m34?1如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-09
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-04-09
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-04-09
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-04-09
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-04-09
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-04-09
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-04-09
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-04-09
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] 剩餘_size- = buf_size lines = buffer.split('\ n'....
    程式設計 發佈於2025-04-09
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-04-09
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP將...
    程式設計 發佈於2025-04-09
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-09
  • 如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    在java 通過Java通過Java運行命令命令可能很具有挑戰性。儘管您可能會找到打開命令提示符的代碼段,但他們通常缺乏更改目錄並執行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。這種方法允許您:啟動一個過程,然後將其標準錯誤重定向到其標準輸出...
    程式設計 發佈於2025-04-09
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-04-09
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-04-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3