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

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

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

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刪除
最新教學 更多>
  • 如何使用 Twitter Bootstrap 對齊表格中的文字?
    如何使用 Twitter Bootstrap 對齊表格中的文字?
    Twitter Bootstrap 中的表格文字對齊在Twitter 的Bootstrap 架構中,您可以使用指定的文字對齊類別來對齊表格內的文本。 Bootstrap 3text-left:左對齊文字text-center:居中對齊文字text -right:右對齊文字Bootstrap 4te...
    程式設計 發佈於2024-11-15
  • 如何讓 CSS 中的空白表格儲存格的邊框可見?
    如何讓 CSS 中的空白表格儲存格的邊框可見?
    我可以在 CSS 中讓空白儲存格的邊框可見嗎? 在 Internet Explorer 7 中,預設可能不會顯示空白儲存格的邊框。不過,有幾種方法可以解決此問題。 使用不間斷空格如果可行,請插入不間斷空格 ( )進入空單元格可以強制瀏覽器渲染帶有邊框的單元格。 純 CSS解決方案對於純CSS解決方案...
    程式設計 發佈於2024-11-15
  • 如何將 Python 清單轉換為 CSV 檔案?
    如何將 Python 清單轉換為 CSV 檔案?
    將Python 清單清單匯出至CSV 檔案將Python 清單清單轉換為CSV 檔案,確保每個子清單中都會保留不同類型(浮點型、整數型、字串型)的資料。所需的 CSV 格式涉及使用逗號分隔每個子清單中的元素並垂直對齊子清單。 要實現此目的,您可以利用 Python 的內建 csv 模組:import...
    程式設計 發佈於2024-11-15
  • 測試限制:了解軟體測試的邊界
    測試限制:了解軟體測試的邊界
    软件测试是确保软件质量、稳定性和功能的开发过程的重要组成部分。然而,尽管测试很重要,但它也有其局限性。虽然它可以揭示缺陷,但它不能保证应用程序完全没有错误。了解这些限制有助于企业和开发人员设定切合实际的期望并优化他们的测试流程。在本文中,我们将探讨软件测试的主要局限性及其带来的挑战。 无法测试每个...
    程式設計 發佈於2024-11-15
  • 如何有效地將檔案載入到`std::vector`中?
    如何有效地將檔案載入到`std::vector`中?
    有效率地將檔案載入到std::vector有效率地將檔案載入std::vector ,必須避免不必要的複製和記憶體重新分配。雖然利用 Reserve 和 read() 的原始方法看起來可能很直接,但單獨的 Reserve() 並不會改變向量的容量。 使用迭代器的規範方法:規範方法使用輸入流迭代器來方...
    程式設計 發佈於2024-11-15
  • 如何在 Go 中將陣列元素直接解壓縮為變數?
    如何在 Go 中將陣列元素直接解壓縮為變數?
    在 Go 中解包數組元素Go 缺乏將數組元素直接解包到 Python 中的變數的便捷語法。雖然提問者使用中間變數的初始方法有效,但它可能會導致程式碼混亂,尤其是在複雜的場景中。 多個回傳值為了解決這個問題,建議使用解決方案是建立一個傳回多個值的函數。例如,要拆分字串並將結果解壓縮為兩個變量,可以使用...
    程式設計 發佈於2024-11-15
  • 「n:m」和「1:n」關係如何塑造資料庫設計?
    「n:m」和「1:n」關係如何塑造資料庫設計?
    理解關聯式資料庫設計:「n:m」與「1:n」的意義在資料庫設計中,符號「 n :m」和「1:n」在表示表或實體之間的關係方面起著至關重要的作用。這些符號表示它們關聯的基數。 "n:m" 關係:多對多「n:m」關係表示多對多兩個資料實體之間的對多關聯。這意味著對於一個表中的每個實體...
    程式設計 發佈於2024-11-15
  • 如何在 Java 中尋找重定向的 URL?
    如何在 Java 中尋找重定向的 URL?
    在Java 中查找重定向URL在Java 中訪問網頁時,處理URL 重定向到備用位置的情況至關重要。若要確定已重新導向的 URL,您可以使用 URL 和 URLConnection 類別。 使用 URLConnection.getUrl()使用 URLConnection 建立連線後,您可以擷取連線...
    程式設計 發佈於2024-11-15
  • 在 C++ 中將字串轉換為整數時如何處理轉換錯誤?
    在 C++ 中將字串轉換為整數時如何處理轉換錯誤?
    使用 C 中的錯誤處理將字串轉換為 int 將字串轉換為整數是程式設計中的常見任務。但是,在某些情況下,字串值可能無法成功轉換為整數。在這種情況下,優雅地處理轉換失敗至關重要。 boost::lexical_cast將字串轉換為 int 時出現錯誤的最直接方法之一處理方法是使用 boost::lex...
    程式設計 發佈於2024-11-15
  • 如何在 JavaScript 中存取 PHP 變數?
    如何在 JavaScript 中存取 PHP 變數?
    在 JavaScript 中存取 PHP 變數直接在 JavaScript 中存取 PHP 變數是一個挑戰。但是,有一些方法可以實現此目的:使用嵌入式PHP 語句:在JavaScript 區塊中嵌入PHP 程式碼允許您將PHP 變數指派給JavaScript 變數:<script type=&...
    程式設計 發佈於2024-11-15
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-15
  • 多執行緒概念 部分死鎖
    多執行緒概念 部分死鎖
    欢迎来到我们的多线程系列的第 3 部分! 在第 1 部分中,我们探讨了原子性 和 不变性。 在第 2 部分中,我们讨论了饥饿。 在这一部分中,我们将深入研究多线程中死锁的机制。原因是什么,如何识别以及可以使用的预防策略,以避免将代码变成僵局。应用程序逐渐停止,通常没有任何明显的错误,让开发人员...
    程式設計 發佈於2024-11-15
  • JavaScript 重點:Javascript 的部分策劃者)
    JavaScript 重點:Javascript 的部分策劃者)
    In this section, we will implement a game called Mastermind in JavaScript. This game development would cover a lot of the concepts that we have discus...
    程式設計 發佈於2024-11-15
  • 如何解決 Tomcat 6.0 中的 PermGen 空間錯誤?
    如何解決 Tomcat 6.0 中的 PermGen 空間錯誤?
    解決Tomcat 6.0 中的永久代空間錯誤在Tomcat 6.0 中進行索引操作時,您可能會遇到可怕的永久代空間錯誤。出現此問題的原因是永久代分配的空間不足,永久代用於儲存類別、方法和其他元資料。 增加 PermGen 空間增加 PermGen 空間-XX:MaxPermSize=128m per...
    程式設計 發佈於2024-11-15
  • 程式設計中原始類型和引用類型之間的根本區別是什麼?
    程式設計中原始類型和引用類型之間的根本區別是什麼?
    原始類型和引用類型:顯著差異在程式設計領域,資料類型在組織和表示資料方面發揮著至關重要的作用。在這些類型中,基本類型和引用類型因其根本區別而脫穎而出。 什麼是基本型? 基本型別是直接儲存其值的基本資料型別。它們包括整數、雙精度數、布林值和字元。這些類型的行為就像獨立的實體,本質上保存它們的值。 什麼...
    程式設計 發佈於2024-11-15

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

Copyright© 2022 湘ICP备2022001581号-3