نویسنده (ها): ماری
در ابتدا منتشر شده در به سمت هوش مصنوعیبشر
توهم در LLMS مراقبت های بهداشتی: چرا آنها اتفاق می افتد و چگونه می توان از آنها جلوگیری کرد
ساختمان سیستم های بهداشتی قابل اعتماد LLM – قسمت 1
TL ؛ دکتر
LLM توهم: خروجی های تولید شده توسط AI که به نظر می رسد قانع کننده است اما حاوی خطاهای واقعی یا اطلاعات ساختگی است-خطرات جدی ایمنی در تنظیمات مراقبت های بهداشتی.
سه نوع اصلی توهم: خطاهای واقعی (توصیه کردن آنتی بیوتیک ها برای عفونت های ویروسی) ، ساختگی (اختراع مطالعات یا دستورالعمل های غیر موجود) ، تفسیرها (نتیجه گیری نادرست از داده های واقعی).
علل اصلی توهم: نسل احتمالی ، آموزش هایی که به تسلط بر دقت واقعی ، عدم تأیید در زمان واقعی و داده های بی نظیر یا مغرضانه پاداش می دهد.
رویکردهای کاهش: بازیابی نسل (RAG) ، تنظیم دقیق دامنه خاص ، پیشرفت پیشرفته ، نگهبان.
این سری: ایجاد یک خط لوله مقاوم در برابر توهم برای دانش بیماری های عفونی ، با شروع یک جسد مرکزی PubMed.
توهم در پزشکی LLMS فقط اشکالات نیستند – آنها خطرات ایمنی هستند. این سریال چگونه می تواند مدلهای زبان مراقبت های بهداشتی را در شواهد واقعی شروع کند و از بیماری های عفونی شروع می شود.
مقدمه
LLMS (مدل های بزرگ زبان) نحوه تعامل ما با دانش پزشکی را تغییر می دهد – خلاصه تحقیقات ، پاسخ دادن به سؤالات بالینی ، حتی ارائه نظرات دوم. اما آنها هنوز هم توهم می کنند – و در پزشکی که یک خطر ایمنی است ، نه یک عجیب.
در حوزه های پزشکی ، اعتماد غیر قابل مذاکره است. پاسخ توهم در مورد مدیریت بیماری های عفونی (به عنوان مثال ، آنتی بیوتیک اشتباه ، معیارهای تشخیصی نادرست) می تواند به طور مستقیم بر ایمنی بیمار تأثیر بگذارد ، بنابراین مدل های زمینی در شواهد قابل اثبات اجباری است.
به همین دلیل این سریال وبلاگ وجود دارد. این سریال چهار قسمتی به شما نشان می دهد که چگونه می توانید یک گردش کار مقاوم در برابر توهم ، گام به گام ایجاد کنید:
- قسمت 1 (این پست): توهمات چیست ، چرا آنها اتفاق می افتد و چگونه می توان با استفاده از ادبیات پزشکی دسترسی آزاد ، یک جسد خاص دامنه ایجاد کرد
- قسمت 2: آن جسد را به خط لوله RAG تبدیل کنید
- قسمت 3: معیارهای تشخیص توهم را اضافه کنید
- قسمت 4: همه اینها را کنار هم قرار دهید و یک رابط شفاف بسازید تا شواهد پاسخ های LLM را به کاربران نشان دهد
توهم در LLMS چیست؟
توهمات خروجی های تولید شده از مدل هستند که صحیح و منسجم به نظر می رسند ، اما در واقع صحیح نیستند. آنها قانع کننده به نظر می رسند اما اغلب نادرست ، غیرقابل تصویب یا کاملاً ساخته شده هستند.
چرا آنها در مراقبت های بهداشتی اهمیت دارند
این خطاها می توانند پیامدهای جدی داشته باشند ، به خصوص در تنظیمات بالینی که در آن ممکن است منجر به توصیه های نادرست درمانی شود. توصیه اشتباه در تنظیمات بالینی می تواند عواقب زندگی یا مرگ داشته باشد ، به همین دلیل کاهش این توهمات با ایجاد سیستم های شفاف و مبتنی بر شواهد بسیار مهم است.
انواع اصلی توهم
1. خطاهای واقعی
خطاهای واقعی هنگامی اتفاق می افتد که LLM ها ادعاهای نادرست در مورد حقایق قابل اثبات را مطرح کنند. با استفاده از مثال بیماری عفونی ما ، توصیه کردن آنتی بیوتیک ها برای آنفلوانزا نوعی خطای واقعی خواهد بود.
2. جعل
ساختگی شامل LLM ها اختراع موجودات یا اطلاعات غیر موجود است. به عنوان مثال ، در زمینه مراقبت های بهداشتی ، این می تواند مطالعات تحقیقاتی داستانی ، دستورالعمل های پزشکی باشد که وجود ندارد یا مفاهیم فنی ساخته شده است.
3. تفسیرها
تفسیر نادرست هنگامی اتفاق می افتد که LLM ها اطلاعات واقعی را می گیرند اما نادرست یا نادرست آن را انجام می دهند. به عنوان مثال ، یک مدل ممکن است به مطالعه ای که وجود دارد اشاره کند ، اما نتیجه گیری های اشتباه را به دست می آورد
چرا LLMS توهم
مدل های بزرگ زبان توهم می کنند زیرا آنها
- واقعا واقعیت هایی را که انسان انجام می دهد درک نکنید
- به سادگی پیش بینی کنید که چه کلماتی باید بر اساس الگوهای مشاهده شده در آنها وجود داشته باشد داده های آموزشبشر
هنگامی که این سیستم های هوش مصنوعی با مباحث ناآشنا یا سؤالات مبهم روبرو می شوند ، آنها توانایی گفتن “من نمی دانم” را ندارند و در عوض پاسخ های با اعتماد به نفس اما بالقوه نادرست ایجاد می کنند. این گرایش ناشی از چندین عامل است:
- آموزش آنها در اولویت قرار دادن متن مسلط و انسانی بر روی احتیاط واقعی است
- آنها فاقد دسترسی در زمان واقعی به منابع اطلاعاتی تأیید شده هستند
- آنها هیچ درک ذاتی از حقیقت در مقابل داستان ندارند.
- اطلاعات متناقض در داده های آموزش می تواند مدل را به منابع متناقض متوسط سوق دهد.
این مشکل با محدودیت در داده های آموزش که ممکن است حاوی اطلاعات منسوخ ، مغرضانه یا نادرست باشد ، و همچنین ماهیت اساسی تج وجودی خودکار در نحوه تولید این مدل ها یک قطعه در یک زمان است.
چگونه می توانیم به توهم بپردازیم؟
روشهای مختلفی برای کاهش یا تشخیص توهم وجود دارد.
استراتژی های کاهش
- تنظیم دقیق با داده های خاص دامنه: دلیل اصلی توهم در شکاف دانش در داده های آموزش مدل نهفته است. این رویکرد با معرفی دانش خاص دامنه کمک می کند و می تواند برای ایجاد مدلهایی که بهتر از اصطلاحات پزشکی تخصصی یا تفاوت های مختلف در متن بالینی درک می کنند ، بسیار قدرتمند باشد.
- نسل بازیابی-اوت (RAG): این روش با بازیابی اطلاعات مربوطه قبل از تولید پاسخ ، ادغام منابع دانش خارجی را فراهم می کند. این کمک می کند تا به جای اینکه فقط به داده های آموزش مدل تکیه کند ، خروجی های مدل در منابع خارجی تأیید شده را ایجاد کند. این روشی است که ما در این سری به آن خواهیم پرداخت
- استراتژی های قابل توجه دیگر: روشهای پیشرفته پیشرفته مانند زنجیره ای از فکر ها یا یادگیری چند شات می توانند با هدایت پاسخ مدل در جهت درست ، توهم را کاهش دهند. نگهبان های مبتنی بر قوانین که قبل از رسیدن به کاربران ، خروجی های صفحه نمایش را اضافه می کنند ، یک لایه ایمنی دیگر اضافه می کنند.
تشخیص توهم
- نمره دهی منبع-انتقال: این روش پاسخ LLM را با اسناد بازیابی شده مقایسه می کند تا تشخیص دهد که چه مقدار از پاسخ در منبع پایه گذاری شده است. فراتر از شناسایی توهم ، همچنین امکان برجسته کردن منبع پشت LLM را فراهم می کند ، که به ایجاد اعتماد و شفافیت کمک می کند.
- معنایی آنتروپی اندازه گیری: این روش عدم اطمینان در مورد معنی پاسخ های تولید شده را اندازه گیری می کند و به طور خاص برای رفع خطر توهم در مناطق بحرانی که به عنوان مثال ایمنی بیمار شامل می شود ، توسعه یافته است
- روشهای مبتنی بر قوام: این روش شامل یک بررسی خودآموزی است ، که در آن می توان با ایجاد چندین بار مدل با همان پرس و جو و مقایسه خروجی ها برای قوام ، توهم را تشخیص داد.
برخی از انتشارات جالب دسترسی آزاد برای کمی بیشتر:
اگر در خواندن تحقیقات اخیر در مورد این موضوع جالب هستید ، در اینجا چند مقاله تحقیقاتی وجود دارد که ارزش خواندن دارند:
Walkthrough Code: بارگیری تحقیقات پزشکی از PubMed Central
برای کاهش توهم در LLM های مراقبت های بهداشتی ، پایه گذاری آنها در ادبیات پزشکی قابل اعتماد بسیار مهم است. بیایید با ساختن یک جسد از یکی از بهترین منابع موجود شروع کنیم: PubMed Central (PMC).
این اسکریپت به شما کمک می کند تا بازیابی مقالات پزشکی با دسترسی آزاد را به صورت خودکار انجام دهید ، و این باعث می شود که یک مجموعه داده متناسب با کار خود را تنظیم کنید (به عنوان مثال ، بیماری های عفونی). در اینجا نحوه عملکرد آن آورده شده است:
1. تنظیم و محیط
import requests
import xml.etree.ElementTree as ET
import json
import os, re, time
from dotenv import load_dotenvload_dotenv()
api_key = os.getenv("NCBI_API_KEY")
email = os.getenv("EMAIL")
base_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/"
شما باید خود را تنظیم کنید کلید و ایمیل API NCBI در الف .env
پرونده
شما هنوز هم می توانید NCBI API را بدون کلید API فراخوانی کنید ، اما این محدودیت نرخ بالاتر را باز می کند و رایگان است
2. PMC را جستجو کنید
از آنجا که ما برای ساختن پایگاه دانش خود به متن های کامل علاقه مند هستیم ، فقط باید مقالاتی را که دسترسی آزاد دارند بارگیری کنیم. برای انجام این کار ، ما باید مقالات را از PMC بدست آوریم:
# 1. Search PMC
search_url = f"{base_url}esearch.fcgi"
search_params = {
"db": "pmc",
"term": query,
"retmax": max_results,
"retmode": "json",
"api_key": api_key,
"email": email
}
print("Searching PMC...")
search_resp = requests.get(search_url, params=search_params)
search_resp.raise_for_status()
ids = search_resp.json()["esearchresult"]["idlist"]
این کد PMC را با اصطلاحات جستجوی شما (به عنوان مثال “بیماریهای عفونی”) پرس و جو می کند و لیستی از شناسه های اسناد (PMCIDS) را برمی گرداند.
3. مقالات واکشی و تجزیه
اکنون می توانیم متون کامل را با استفاده از PMCID ها واگذار کنیم:
# 2. Batch fetch
fetch_url = f"{base_url}efetch.fcgi"for i in range(0, len(ids), batch_size):
batch_ids = ids[i : i + batch_size]
fetch_params = {
"db": "pmc",
"id": ",".join(batch_ids),
"retmode": "xml",
"api_key": api_key,
"email": email,
}
time.sleep(delay)
r = requests.get(fetch_url, params=fetch_params)
r.raise_for_status()
پاسخ ما یک شیء XML است ، بنابراین مرحله آخر این است که آن را جدا کنید و یک فرهنگ لغت با بخش های مربوطه ایجاد کنید: PMCID ، عنوان ، چکیده ، Full_Text ، Publication_Date ، نویسندگان:
root = ET.fromstring(r.content)
for idx, article in enumerate(root.findall(".//article")):
# Extract article details
article_data = {
"pmcid": f"PMC{batch_ids[idx]}",
"title": "",
"abstract": "",
"full_text": "",
"publication_date": "",
"authors": [],
}# Extract title
title_elem = article.find(".//article-title")
if title_elem is not None:
article_data["title"] = "".join(title_elem.itertext()).strip()
# Extract abstract
abstract_parts = article.findall(".//abstract//p")
if abstract_parts:
article_data["abstract"] = " ".join(
"".join(p.itertext()).strip() for p in abstract_parts
)
# Extract publication date
pub_date = article.find(".//pub-date")
if pub_date is not None:
year = pub_date.find("year")
month = pub_date.find("month")
day = pub_date.find("day")
date_parts = []
if year is not None:
date_parts.append(year.text)
if month is not None:
date_parts.append(month.text)
if day is not None:
date_parts.append(day.text)
article_data["publication_date"] = "-".join(date_parts)
# Extract authors
author_elems = article.findall(".//contrib[@contrib-type='author']")
for author_elem in author_elems:
surname = author_elem.find(".//surname")
given_names = author_elem.find(".//given-names")
author = {}
if surname is not None:
author["surname"] = surname.text
if given_names is not None:
author["given_names"] = given_names.text
if author:
article_data["authors"].append(author)
# Extract full text (combining all paragraphs)
body = article.find(".//body")
if body is not None:
paragraphs = body.findall(".//p")
article_data["full_text"] = " ".join(
"".join(p.itertext()).strip() for p in paragraphs
)
سپس داده ها را می توان در JSONL ذخیره کرد که در مرحله بعدی ما استفاده می شود – ساخت سیستم RAG ما.
بیایید به محدودیت های صدور مجوز توجه داشته باشیم: در حالی که ادبیات دسترسی آزاد به هر کسی امکان دسترسی و خواندن مطالب را می دهد ، این بدان معنا نیست که نویسندگان موافقت کردند که توزیع مجدد کار خود را انجام دهند.
در حالی که این پست وبلاگ و محتوای آن برای استفاده شخصی و آموزشی در نظر گرفته شده است ، اگر تصمیم دارید از این عملکرد برای ساخت یک مجموعه داده استفاده کنید که توزیع مجدد یا تجاری شود ، رعایت توافق نامه مجوز مقاله مهم است. برای انجام این کار ، بیایید عملکردی را تعریف کنیم که به ما کمک می کند تا داده های مجوز را از مقاله بارگیری شده بکشیم:
def detect_cc_license(lic_elem):
"""
Inspect … for Creative Commons URLs or keywords
and return a normalised string such as 'cc-by', 'cc-by-nc', 'cc0', or 'other'.
"""
if lic_elem is None:
return "other"# 1) gather candidate strings: any ext-link href + full text
candidates: list[str] = []
for link in lic_elem.findall(".//ext-link[@ext-link-type='uri']"):
href = link.get("{http://www.w3.org/1999/xlink}href") or link.get("href")
if href:
candidates.append(href.lower())
candidates.append("".join(lic_elem.itertext()).lower())
# 2) search for CC patterns
for text in candidates:
if "creativecommons.org" not in text and "publicdomain" not in text:
continue
# order matters (most restrictive first)
if re.search(r"by[-_]nc[-_]nd", text):
return "cc-by-nc-nd"
if re.search(r"by[-_]nc[-_]sa", text):
return "cc-by-nc-sa"
if re.search(r"by[-_]nc", text):
return "cc-by-nc"
if re.search(r"by[-_]sa", text):
return "cc-by-sa"
if "/by/" in text:
return "cc-by"
if "publicdomain/zero" in text or "cc0" in text or "public domain" in text:
return "cc0"
return "other"
در اینجا تفکیک کوتاهی از مجوزها به معنای آن آورده شده است:
در اینجا عملکرد کامل برای بارگیری PubMed آورده شده است:
def download_pmc_articles(query,
max_results = 100,
batch_size = 20,
delay = 0.2,
allowed_licenses = {"cc-by", "cc-by-sa", "cc0"},
out_file = "pmc_articles.jsonl"):base_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/"
# 1. Search PMC
search_url = f"{base_url}esearch.fcgi"
search_params = {
"db": "pmc",
"term": query,
"retmax": max_results,
"retmode": "json",
"api_key": api_key,
"email": email
}
print("Searching PMC...")
search_resp = requests.get(search_url, params=search_params)
search_resp.raise_for_status()
ids = search_resp.json()["esearchresult"]["idlist"]
# 2. Batch fetch
fetch_url = f"{base_url}efetch.fcgi"
skipped, saved = 0, 0
with open(out_file, "w") as f:
for i in range(0, len(ids), batch_size):
batch_ids = ids[i:i+batch_size]
fetch_params = {
"db": "pmc",
"id": ",".join(batch_ids),
"retmode": "xml",
"api_key": api_key,
"email": email
}
time.sleep(delay)
r = requests.get(fetch_url, params=fetch_params)
r.raise_for_status()
root = ET.fromstring(r.content)
for idx, article in enumerate(root.findall(".//article")):
# Check license
license = detect_cc_license(article.find(".//license"))
if license not in allowed_licenses:
skipped += 1
continue # skip disallowed license
# Extract article details
article_data = {
"pmcid": f"PMC{batch_ids[idx]}",
"title": "",
"abstract": "",
"full_text": "",
"publication_date": "",
"authors": []
}
# Extract title
title_elem = article.find(".//article-title")
if title_elem is not None:
article_data["title"] = "".join(title_elem.itertext()).strip()
# Extract abstract
abstract_parts = article.findall(".//abstract//p")
if abstract_parts:
article_data["abstract"] = " ".join("".join(p.itertext()).strip() for p in abstract_parts)
# Extract publication date
pub_date = article.find(".//pub-date")
if pub_date is not None:
year = pub_date.find("year")
month = pub_date.find("month")
day = pub_date.find("day")
date_parts = []
if year is not None:
date_parts.append(year.text)
if month is not None:
date_parts.append(month.text)
if day is not None:
date_parts.append(day.text)
article_data["publication_date"] = "-".join(date_parts)
# Extract authors
author_elems = article.findall(".//contrib[@contrib-type='author']")
for author_elem in author_elems:
surname = author_elem.find(".//surname")
given_names = author_elem.find(".//given-names")
author = {}
if surname is not None:
author["surname"] = surname.text
if given_names is not None:
author["given_names"] = given_names.text
if author:
article_data["authors"].append(author)
# Extract full text (combining all paragraphs)
body = article.find(".//body")
if body is not None:
paragraphs = body.findall(".//p")
article_data["full_text"] = " ".join("".join(p.itertext()).strip() for p in paragraphs)
f.write(json.dumps(article_data) + "\n")
saved += 1
print(f"Saved batch {i//batch_size + 1}")
print(f"Downloaded {saved} articles to {out_file}, {skipped} articles removed by license filter")
اکنون می توانید برای ایجاد جسد خود ، عملکرد خود را با پرس و جو خود تماس بگیرید. به عنوان مثال:
# Install packages if needed
pip install python-dotenv requestsquery = 'bacterial pneumonia treatment'
max_results = 500
batch_size = 50
download_pmc_articles(query, max_results, batch_size)
و همین است! اکنون تمام مقالات شما در یک پرونده JSONL ذخیره می شوند و آماده پردازش برای RAG هستند
چه بعدی: تهیه داده ها برای RAG
در قسمت 2 ، ما از قسمت خاص دامنه که شما ساخته اید ، استفاده خواهیم کرد و از آن برای برقراری یک سیستم نسل بازیابی (RAG) بازیابی (RAG) استفاده می کنیم-LLM خود را در شواهد واقعی برای کاهش توهم و بهبود اعتماد قرار می دهیم.
منتشر شده از طریق به سمت هوش مصنوعی