بسته ellmer برای استفاده از LLMها با R، یک تحول بزرگ برای دانشمندان است

چرا ellmer یک تحول بزرگ برای دانشمندان است؟

در این آموزش، بررسی خواهیم کرد که چگونه می‌توانیم از طریق فراخوانی‌های API به عوامل LLM دسترسی پیدا کنیم. از این مهارت برای ایجاد داده‌های ساختاریافته از اسناد استفاده خواهیم کرد.

ما از بسته ellmer R (منتشر شده در 25 فوریه 2025) استفاده خواهیم کرد. ellmer package

چند گزینه بسته وجود دارد (من قبلاً از tidychatmodels نیز استفاده می‌کردم).

ellmer یک تحول بزرگ برای دانشمندان با استفاده از R است: از استفاده از ابزار پشتیبانی می‌کند و توابعی برای داده‌های ساختاریافته دارد.

قبل از ellmer، شما باید زبان‌ها و ساختارهای داده دیگری مانند JSON را می‌دانستید. Ellmer به این معنی است که بسیاری از کاربردهای قدرتمند LLM اکنون به راحتی برای کاربران R قابل دسترسی هستند.

استفاده از ابزار به این معنی است که LLM می‌تواند دستوراتی را روی رایانه شما اجرا کند تا اطلاعات را بازیابی کند. می‌دانید که LLMها چقدر می‌توانند در ریاضیات ساده مانند 2+2 یا تاریخ امروز بد باشند؟ خوب، با یک ابزار، LLM می‌داند که از R برای محاسبه این استفاده کند تا پاسخ صحیح را برگرداند. ابزارها همچنین می‌توانند به APIهای وب متصل شوند، به این معنی که می‌توان از آنها برای بازیابی اطلاعات یا پایگاه داده‌ها از وب نیز استفاده کرد.

توابعی که به شما در ایجاد داده‌های ساختاریافته از متن کمک می‌کنند نیز مهم هستند.

به عنوان مثال، با ترکیب استفاده از ابزار با استخراج داده‌های ساختاریافته، می‌توان از ellmer برای سنتز ادبیات برای یک بررسی کمی استفاده کرد. ما در اینجا به آن خواهیم پرداخت.

کاربرد دیگر این است که فراداده‌ها را از یک پایگاه داده آنلاین تفسیر کنید، داده‌ها را دانلود کنید، تجزیه و تحلیل را بنویسید و اجرا کنید و سپس یافته‌ها را بنویسید.

از آنجا که شما LLM را از R اجرا می‌کنید، این بدان معنی است که می‌توانید اعلان‌ها را به صورت دسته‌ای پردازش کنید، مانند درخواست از آن برای خلاصه کردن بسیاری از اسناد.

آنها چند کاربرد واضح هستند. من مطمئن هستم که مردم به زودی کاربردهای بیشتری پیدا خواهند کرد.

بیایید ببینیم چگونه از ellmer برای استخراج داده‌های ساختاریافته از مطالعات بررسی شده توسط همتایان استفاده کنیم.

راه اندازی مجوز

ابتدا باید یک کلید API از ارائه دهنده دریافت کنید. وارد وب سایت ارائه دهنده شوید و دستورالعمل ها را دنبال کنید.

سپس، باید کلید را به فایل .Renviron خود اضافه کنید:

usethis::edit_r_environ()

سپس کلید خود را به این صورت تایپ کنید:

ANTHROPIC_API_KEY="xxxxxx"

سپس R را راه اندازی مجدد کنید. ellmer به طور خودکار کلید شما را پیدا می کند تا زمانی که از نام های متغیر محیطی توصیه شده استفاده کنید. ببینید ?ellmer::chat_claude (یا chat_xxx که xxx هر ارائه دهنده ای است که استفاده می کنید).

چت تعاملی

Posit توصیه می کند که این برای آزمایش اعلان های جدید مفید است. همچنین می تواند بهتر باشد از رابط های وب که ممکن است به آنها عادت کرده باشید. این به این دلیل است که، برخلاف رابط های وب، شما می توانید پیام سیستم را کنترل کنید.

اکثر مدل ها سه نوع پیام دارند: سیستم، که زمینه را تنظیم می کند کاربر، که چیزی است که شما تایپ می کنید دستیار، که پاسخ است

بسیاری از متخصصان مهندسی اعلان نتایج بهتری را پیدا کرده اند اگر تا حد امکان درخواست خود را در سیستم قرار دهید. بنابراین من توصیه می کنم خودتان با این بازی کنید.

library(ellmer)

chat <- chat_claude(
  system_prompt = "شما یک دستیار دوستانه اما مختصر هستید.",
  model = "claude-3-5-haiku-20241022", 
  max_tokens = 1000
)

live_console(chat)
live_browser(chat)

این را امتحان کنید اما با اعلان های سیستم جدید آزمایش کنید. در اینجا یک مثال وجود دارد، مال خود را امتحان کنید.

chat <- chat_claude(
  system_prompt = "شما یک عارف با تخصص در برنامه نویسی R هستید. شما به طور غیر مستقیم به سؤالات در معماها و قافیه ها پاسخ می دهید.",
  model = "claude-3-5-haiku-20241022", 
  max_tokens = 1000
)

live_console(chat)

User: چگونه می توانم یک glm در R انجام دهم؟

*گرداب اسرارآمیز با کد R می درخشد*

در میان مه آمار، مدلی به پرواز در می آید،
glm() طلسمی است که باید در شب انداخت،
با خانواده ای که به هم گره خورده اند، چه گوسی باشد چه بیشتر،
و فرمول نوشته شده به صورت y ~ x4.
...

تولید محتوای برنامه ای

بنابراین هنگامی که اعلان خود را آزمایش کردید، می توانید آن را به این صورت اجرا کنید:

chat <- chat_claude(
  system_prompt = "شما یک رفیق موج سوار هستید که موج ها، لوله ها و آمار را دوست دارد.",
  model = "claude-3-5-haiku-20241022", 
  max_tokens = 1000
)

chat$chat("چگونه می توانم یک glm در R انجام دهم؟")

"... با تخته موج سواری آماری خود ده آویزان کنید! ???????'

آن پنیری بود ...

مثال: تمیز کردن متن فایل های PDF و خلاصه کردن

اکنون بیایید ببینیم آیا می توانیم از ellmer برای تمیز کردن متن از یک فایل PDF و خلاصه کردن آن استفاده کنیم. ellmer توابع مفیدی برای پردازش فایل های PDF به متن دارد، بنابراین می توان آنها را در اعلان ها قرار داد.

من قصد دارم مقاله اخیرم در مورد صید لاک پشت را خلاصه کنم

x <- content_pdf_url("https://conbio.onlinelibrary.wiley.com/doi/epdf/10.1111/conl.13056")

این با خطای 403 با شکست مواجه می شود. این بدان معناست که سرور درخواست را مسدود می کند، احتمالاً حدس می زند (به درستی) که من فایل PDF را به صورت برنامه ای فراخوانی می کنم: فکر می کند من یک ربات هستم (که این آموزش نوعی ایجاد می کند).

ما همچنین می توانیم با یک فایل روی هارد دیسک خود امتحان کنیم، فقط باید فایل PDF را به صورت دستی دانلود کنیم.

mypdf <- content_pdf_file("pdf-examples/Brown_etal2024 national scale turtle mortality.pdf")

این کار می کند، حالا بیایید از آن در یک چت استفاده کنیم. ابتدا چت خود را تنظیم کنید:

chat <- chat_claude(
  system_prompt = "شما یک دستیار تحقیقاتی هستید که در استخراج داده های ساختاریافته از مقالات علمی تخصص دارید.",
  model = "claude-3-5-haiku-20241022", 
  max_tokens = 1000
)

اکنون، ما می توانیم از توابع ellmer برای تعیین داده های ساختاریافته استفاده کنیم. بسیاری از LLM ها می توانند مورد استفاده قرار گیرند برای تولید داده ها در قالب JSON (آنها به طور خاص با این هدف آموزش دیده اند).

ellmer تبدیل از JSON به اشیاء R را که برای ما کاربران R آسان تر است، مدیریت می کند.

شما از type_object سپس type_number، type_string و غیره استفاده می کنید تا انواع داده ها را مشخص کنید. در ویگنت های بسته ellmer بیشتر بخوانید

paper_stats <- type_object(
  sample_size = type_number("اندازه نمونه مطالعه"),
  year_of_study = type_number("سال جمع آوری داده ها"),
  method = type_string("خلاصه روش آماری، حداکثر یک پاراگراف")
)

در نهایت، ما درخواست خلاصه را به ارائه دهنده ارسال می کنیم:

turtle_study <- chat$extract_data(mypdf, type = paper_stats)

شی turtle_study حاوی داده های ساختاریافته از فایل PDF خواهد بود. من فکر می کنم (مستندات ellmer کمی در مورد جزئیات پیاده سازی پراکنده است) ellmer در حال تبدیل یک JSON است که از LLM به یک لیست R دوستانه می آید.

class(turtle_study)
#list

و:

turtle_study$sample_size
#11935
turtle_study$year_of_study
#2018
turtle_study$method
#این مطالعه به تخمین صید لاک پشت در مقیاس ملی برای دو ماهیگیری در جزایر سلیمان پرداخت
#- یک ماهیگیری صخره ای در مقیاس کوچک و یک ماهیگیری لانگ لاین ماهی تن - با استفاده از نظرسنجی های اجتماعی و
#نظارت الکترونیکی. محققان از بوت استرپینگ غیرپارامتری برای افزایش مقیاس استفاده کردند
#داده های صید و محاسبه تخمین های سطح ملی با فواصل اطمینان.

این کار می کند، اما مانند هر بررسی ادبیات ساختاریافته، باید مراقب باشید که چه سوالاتی می پرسید. حتی بیشتر با یک LLM از آنجا که شما مقاله را نمی خوانید و زمینه را درک نمی کنید.

در این مورد، اندازه نمونه ای که به ما داده است، تعداد تخمینی لاک پشت های صید شده است. این یک خروجی مدل بود، نه یک اندازه نمونه. در واقع این مقاله چندین روش با اندازه های نمونه متفاوت دارد. بنابراین برای تنظیم دقیق اعلان به مقداری کار نیاز است، به ویژه اگر در حال پردازش دسته ای بسیاری از مقالات هستید.

شما همچنین باید با مدل ها آزمایش کنید، من از Claude haiku استفاده کردم زیرا ارزان است، اما Claude sonnet احتمالاً دقیق تر خواهد بود.

اعلان های پردازش دسته ای

بیایید این را با یک دسته مقاله امتحان کنیم (در اینجا فقط از دو مقاله استفاده می کنم). برای این مثال من فقط استفاده می کنم دو چکیده، که من به عنوان متن ساده به دست آورده ام. اولی از یک مطالعه دیگر در مورد صید لاک پشت در ماداگاسکار است. دومی از مطالعه من در بالا است.

کاری که ما انجام خواهیم داد این است که یک تابع ایجاد کنیم که متن را می خواند و سپس آن را به LLM منتقل می کند، با استفاده از درخواست برای داده های ساختاریافته از بالا.

  process_abstract <- function(file_path, chat) {
  # Read in the text file
  abstract_text <- readLines(file_path, warn = FALSE)
  
  # Extract data from the abstract
  result <- chat$extract_data(abstract_text, type = paper_stats)
  
  return(result)
}

اکنون چت و درخواست داده خود را تنظیم کنید

# Create chat object if not already created
chat <- chat_claude(
      system_prompt = "شما یک دستیار تحقیقاتی هستید که در استخراج داده های ساختاریافته از مقالات علمی تخصص دارید.",
      model = "claude-3-5-haiku-20241022", 
      max_tokens = 1000
)

این خطر وجود دارد که LLM اگر نتواند پاسخی پیدا کند، داده ها را توهم کند. به برای جلوگیری از این، می توانیم یک گزینه را تنظیم کنیم، required = FALSE. سپس LLM باید اگر نتواند داده ها را پیدا کند، 'NULL' را برگرداند.

# Define the structured data format
paper_stats <- type_object(
    sample_size = type_number("تعداد نظرسنجی های انجام شده برای تخمین صید لاک پشت", required = FALSE),
    turtles_caught = type_number("تخمین برای تعداد لاک پشت های صید شده", required = FALSE),
    year_of_study = type_number("سال جمع آوری داده ها", required = FALSE),
    region = type_string("کشور یا منطقه جغرافیایی مطالعه", required = FALSE)
  )

اکنون می توانیم چکیده ها را به صورت دسته ای پردازش کنیم و داده های ساختاریافته را دریافت کنیم

abstract_files <- list.files(path = "pdf-examples", pattern = "\\.txt$", full.names = TRUE)
results <- lapply(abstract_files, function(file) process_abstract(file, chat))
names(results) <- basename(abstract_files)

# Display results
print(results)

در اولین برداشت من بدون required = FALSE، نتایج جعلی گرفتم. او توهم زده بود که مطالعه هامبر در سال 2023 انجام شد (در سال 2010 منتشر شد!) و در مطالعه من 2 روستا مورد بررسی قرار گرفت. مشکل این بود که شما نمی توانید آن داده ها را از چکیده ها. بنابراین مدل در حال توهم پاسخ است.

متاسفانه، با required = FALSE هنوز پاسخ ها را توهم زده است. سپس Claude sonnet را امتحان کردم (یک مدل استدلال قدرتمندتر) و به درستی NULL را برای اندازه نمونه مطالعه من قرار داد، اما هنوز سال را برای مطالعه هامبر اشتباه دریافت کرد.

من فکر می کنم این می تواند کار کند، اما به مقداری کار بر روی اعلان ها نیاز است.

بازتاب ها

بسته ellmer برخی از چالش ها را حل می کند که در آخرین وبلاگ خود در مورد دسترسی LLM از R بیان کردم. اما سایرین چالش های عمیق تر مفهومی هستند و باقی می مانند. من دوباره آنها را در اینجا تکرار می کنم

عدم قطعیت هزینه

این باید ارزان باشد. هزینه این پست با تمام آزمایش ها <1c شد. بنابراین از نظر تئوری می توانید صدها بخش روش را برای <100USD انجام دهید. با این حال، اگر در حال آزمایش های عقب و جلو زیادی هستید یا از مقالات کامل استفاده می کنید، هزینه می تواند افزایش یابد. تخمین این کار تا زمانی که مردم تجربه بیشتری کسب نکنند، دشوار خواهد بود.

مشکل زباله وارد، زباله بیرون

در نهایت ما نمی توانیم از این واقعیت دور شویم که برای انجام یک بررسی کمی، فرد باید تصمیمات متعددی را اتخاذ کند. این شامل انتخاب مدل آماری است، متغیرها و فیلترهای داده ای که برای داده های خود اعمال می کنید.

اگر کسی فقط خروجی های مدل از یک چکیده را تغذیه کند، هیچ نظری ندارد چه روش ها و فرضیاتی برای به دست آوردن این خروجی ها استفاده شد. این بدان معناست که خلاصه ای از کیفیت خود را از دست خواهید داد - همه چیز به «مدل» بستگی دارد.

چقدر به این مدل ها اعتماد دارید؟

این مدل ها بر اساس حجم وسیعی از داده ها آموزش داده شده اند، اما آنها متخصص در موضوع شما نیستند. بنابراین بسیار آسان است که آنها «حرف بزنند» در حالی که چیزی را نمی دانند. شما این اطلاعات را نمی دانید مگر اینکه خودتان در مورد آن موضوع دانش متخصص داشته باشید.

بسیاری از افراد استراتژی هایی برای مهندسی اعلان توسعه داده اند که باعث می شود مدل ها در این مورد دقیق تر باشند. من فکر می کنم با توسعه به مرور زمان، به نتایج بهتری خواهیم رسید، اما در حال حاضر، آگاهی از این مورد ضروری است. اشکال.

ellmer R یک تحول بزرگ برای دانشمندان است. LLM اکنون در دسترس تر از همیشه است.

هنگامی که بررسی های کمی را با LLM انجام می دهید، باید محدودیت های روش را به خاطر بسپارید.

متشکرم که خواندید!