جستجوی خودکار مقالات علمی و تحلیل PDF با n8n

جستجوی خودکار مقالات علمی و تحلیل PDF با n8n

14 دقیقه مطالعه · منتشر شده ۱۴۰۵/۴/۲۷

دانلود workflow

فایل JSON آماده import در n8n — credentialها باید در n8n شما تنظیم شوند.

  1. فایل JSON را دانلود کنید.
  2. در n8n: Workflows → Import from File.
  3. Credentialهای هر node را متصل کنید.
  4. workflow را فعال کنید.

شناسه workflow: 7360 · منبع: کاتالوگ Axeto

جستجو در مقالات علمی در پنج پایگاه داده با وکتور PDF و خروجی‌های چندگانه

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

کاتالوگ Axeto: https://axeto.ai/n8n

نمای کلی گردش کار

این گردش کار فرآیند یافتن مقالات علمی را در پنج پایگاه داده اصلی ساده می‌کند: PubMed، ArXiv، Google Scholar، Semantic Scholar و ERIC. این گردش کار یک کوئری جستجوی یکپارچه را اجرا می‌کند، نتایج را بازیابی می‌کند، موارد تکراری را بر اساس DOI و شباهت عنوان حذف می‌کند، مقالات را بر اساس امتیاز ارتباط سفارشی رتبه‌بندی می‌کند و نتایج منتخب را در فرمت‌های BibTeX، JSON و CSV صادر می‌کند.

مراحل کلیدی:

1. پیکربندی جستجو و راه‌اندازی پارامترها: کوئری جستجو، محدوده تاریخ و تعداد نتایج برای بازیابی از هر منبع را تعریف می‌کند.

2. اجرای کوئری چند پایگاه داده: از گره PDF Vector برای جستجو در پایگاه‌های داده علمی مشخص شده استفاده می‌کند.

3. حذف موارد تکراری: ورودی‌های تکراری را با استفاده از تطابق DOI و عنوان شناسایی و حذف می‌کند.

4. رتبه‌بندی ارتباط: مقالات منحصربه‌فرد را بر اساس عواملی مانند ارتباط عنوان، تعداد استنادات، تازگی و در دسترس بودن PDF امتیازدهی و مرتب می‌کند.

5. صادر کردن نتایج: ورودی‌های BibTeX را تولید کرده و لیست نهایی مقالات را به صورت فایل‌های BibTeX، JSON و CSV صادر می‌کند.

---

تحلیل دقیق گره‌ها (Node)

۱. پیکربندی جستجو و تنظیم پارامترها

هدف: این بلوک اولیه پارامترهای اصلی جستجوی تحقیقاتی را تنظیم می‌کند و نمای کلی از دامنه گردش کار (Workflow) ارائه می‌دهد.

گره‌ها (Nodes):

  • پیکربندی جستجو (یادداشت چسبان - Sticky Note)

* نوع: n8n-nodes-base.stickyNote

* عملکرد: به عنوان مستندات عمل می‌کند و هدف گردش کار و پایگاه‌های داده‌ای را که هدف قرار می‌دهد، مشخص می‌کند.

* محتوا: پنج پایگاه داده دانشگاهی (PubMed، ArXiv، Google Scholar، Semantic Scholar، ERIC) را فهرست می‌کند و به طور خلاصه به فرآیندهای حذف موارد تکراری و رتبه‌بندی اشاره می‌کند.

* ورودی‌ها: None

* خروجی‌ها: None

* نکات: به کاربران در درک سریع هدف گردش کار کمک می‌کند.

  • تنظیم پارامترهای جستجو (گره Set)

* نوع: n8n-nodes-base.set

* عملکرد: متغیرهایی را تعریف می‌کند که اجرای جستجو را کنترل می‌کنند.

* پیکربندی:

* yearFrom: 2020 (نتایج را برای شامل شدن مقالات منتشر شده از سال ۲۰۲۰ به بعد فیلتر می‌کند).

* resultsPerSource: 25 (حداکثر تعداد نتایج را که باید از هر پایگاه داده بازیابی شود، تنظیم می‌کند).

* searchQuery: "machine learning healthcare applications" (عبارات اصلی جستجو).

* ورودی‌ها: None

* خروجی‌ها: یک شیء JSON حاوی پارامترهای جستجوی تعریف شده که به گره‌های بعدی منتقل می‌شود.

* ملاحظات: searchQuery خالی یا نامعتبر ممکن است منجر به عدم وجود نتایج شود. این پارامترها را می‌توان برای نیازهای تحقیقاتی مختلف تنظیم کرد.

۲. اجرای جستجوی چند پایگاه داده

هدف: این مرحله جستجوی واقعی را در چندین پایگاه داده دانشگاهی با استفاده از پارامترهای پیکربندی شده اجرا می‌کند.

گره‌ها (Nodes):

  • جستجوی چند پایگاه داده PDF Vector (گره PDF Vector)

* نوع: n8n-nodes-base.pdfVector

* عملکرد: پایگاه‌های داده دانشگاهی مختلف را با استفاده از قابلیت‌های جستجوی برداری در صورت امکان، جستجو می‌کند.

* پیکربندی:

* operation: search

* resource: academic

* query: ={{ $json.searchQuery }} (به صورت پویا از گره "تنظیم پارامترهای جستجو" تنظیم شده است).

* limit: ={{ $json.resultsPerSource }} (به صورت پویا از گره "تنظیم پارامترهای جستجو" تنظیم شده است).

* yearFrom: ={{ $json.yearFrom }} (به صورت پویا از گره "تنظیم پارامترهای جستجو" تنظیم شده است).

* fields: title, authors, year, doi, abstract, totalCitations, pdfUrl, provider (فراداده‌ای را که باید برای هر مقاله بازیابی شود، مشخص می‌کند).

* providers: آرایه‌ای که پایگاه‌های داده هدف را فهرست می‌کند: ["pubmed", "arxiv", "googlescholar", "semanticscholar", "eric"].

* ورودی‌ها: پارامترهای جستجو را از گره "تنظیم پارامترهای جستجو" دریافت می‌کند.

* خروجی‌ها: آرایه‌ای حاوی نتایج ترکیبی از همه ارائه‌دهندگان جستجو شده.

* ملاحظات:

* نیاز به نصب گره PDF Vector و پیکربندی صحیح آن با کلیدهای API لازم برای هر ارائه‌دهنده دارد.

* احتمال خطاهای شبکه، محدودیت نرخ API یا محدودیت‌های دسترسی از سوی ارائه‌دهندگان داده وجود دارد.

* نتایج ممکن است گاهی اوقات شامل فراداده ناقص باشند.

۳. حذف موارد تکراری

هدف: اطمینان از منحصر به فرد بودن مقالات تحقیقاتی بازیابی شده با حذف ورودی‌های اضافی.

گره‌ها (Nodes):

  • حذف موارد تکراری نتایج (گره کد - Code Node)

* نوع: n8n-nodes-base.code

* عملکرد: منطق سفارشی جاوا اسکریپت را برای فیلتر کردن مقالات تکراری پیاده‌سازی می‌کند.

* منطق:

* از ساختار داده Map برای ذخیره مقالات منحصر به فرد با کلید DOI استفاده می‌کند.

* اگر DOI وجود نداشته باشد، عنوان‌ها را نرمال‌سازی و مقایسه می‌کند تا موارد تکراری احتمالی را شناسایی کند.

* برای موارد تکراری مبتنی بر عنوان بدون DOI، اطلاعات ارائه‌دهنده را ادغام می‌کند.

* ورودی‌ها: آرایه اشیاء مقاله از گره "جستجوی چند پایگاه داده PDF Vector".

* خروجی‌ها: آرایه‌ای حاوی فقط ورودی‌های مقاله منحصر به فرد.

* ملاحظات:

* نرمال‌سازی عنوان ممکن است منجر به مثبت کاذب (مقالات مختلف به عنوان تکراری علامت‌گذاری شوند) یا منفی کاذب (موارد تکراری از قلم بیفتند) به دلیل تغییرات جزئی در عناوین (مانند علائم نگارشی، غلط‌های املایی) شود.

* فرض می‌کند ساختار داده ورودی اشیاء مقاله سازگار است؛ فیلدهای از دست رفته می‌توانند باعث خطاهای اسکریپت شوند.

۴. رتبه‌بندی بر اساس ارتباط

هدف: امتیازدهی و مرتب‌سازی مقالات بدون موارد تکراری بر اساس ارتباط آن‌ها با عبارت جستجو و سایر عوامل مهم.

گره‌ها (Nodes):

  • رتبه‌بندی بر اساس ارتباط (گره کد - Code Node)

* نوع: n8n-nodes-base.code

* عملکرد: یک امتیاز ارتباط عددی به هر مقاله اختصاص می‌دهد و نتایج را مرتب می‌کند.

* الگوریتم امتیازدهی:

* ارتباط عنوان: ۱۰ امتیاز برای هر کلمه از searchQuery که در عنوان مقاله یافت می‌شود.

تأثیر استناد: ۵ \ log(citations + 1) امتیاز، به مقالاتی که استناد بیشتری دارند پاداش می‌دهد.

* تازگی: (۱۰ - سال‌های سپری شده از انتشار) امتیاز، به مقالات جدیدتر پاداش می‌دهد (حداقل ۰).

* در دسترس بودن PDF: ۱۵ امتیاز در صورت وجود pdfUrl که دسترسی به متن کامل را نشان می‌دهد.

* ورودی‌ها: آرایه مقالات منحصر به فرد از گره "حذف موارد تکراری نتایج".

* خروجی‌ها: آرایه مقالات، که هر کدام با ویژگی relevanceScore تکمیل شده‌اند و بر اساس امتیاز نزولی مرتب شده‌اند.

* ملاحظات:

* مقالات با صفر استناد حداقل امتیاز استناد را دریافت می‌کنند.

* پاداش تازگی برای مقالات تازه منتشر شده بیشتر است.

* عدم وجود عبارات جستجو در عنوان به طور منفی بر امتیاز تأثیر می‌گذارد.

۵. خروجی گرفتن از نتایج

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

گره‌ها (Nodes):

  • تولید BibTeX (گره کد - Code Node)

* نوع: n8n-nodes-base.code

* عملکرد: هر شیء مقاله را به یک رشته با فرمت BibTeX تبدیل می‌کند.

* منطق:

* یک کلید استناد ایجاد می‌کند، با اولویت دادن به DOI یا استفاده از یک مکانیزم جایگزین.

* لیست نویسندگان را با جداکننده‌های "and" قالب‌بندی می‌کند.

* فیلدهای ضروری مانند عنوان، نویسندگان، سال، DOI و چکیده را شامل می‌شود.

* ورودی‌ها: آرایه مقالات رتبه‌بندی شده از گره "رتبه‌بندی بر اساس ارتباط".

* خروجی‌ها: شیئی حاوی:

* bibtex: یک رشته واحد با تمام ورودی‌های BibTeX.

* papers: آرایه اصلی اشیاء مقاله (برای خروجی JSON/CSV مفید است).

* ملاحظات:

* کلیدهای استناد جایگزین ممکن است در صورت عدم وجود DOI برای چندین مقاله، منجر به تداخل شوند.

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

  • خروجی گرفتن فایل BibTeX (نوشتن فایل باینری - Write Binary File)

* نوع: n8n-nodes-base.writeBinaryFile

* عملکرد: محتوای BibTeX تولید شده را در یک فایل .bib ذخیره می‌کند.

* پیکربندی:

* fileName: search_results_{{$now.year}}-{{$now.month}}-{{$now.day}}.bib (به صورت پویا با تاریخ فعلی نام‌گذاری شده است).

* content: رشته bibtex خروجی از گره "تولید BibTeX".

* ورودی‌ها: رشته BibTeX از "تولید BibTeX".

* خروجی‌ها: یک فایل باینری حاوی داده‌های BibTeX.

* ملاحظات: نیاز به مجوزهای نوشتن فایل مناسب در محیط اجرا دارد.

  • خروجی گرفتن JSON (نوشتن فایل باینری - Write Binary File)

* نوع: n8n-nodes-base.writeBinaryFile

* عملکرد: نتایج تحقیق را در فرمت JSON ذخیره می‌کند.

* پیکربندی:

* fileName: search_results_{{$now.year}}-{{$now.month}}-{{$now.day}}.json (به صورت پویا با تاریخ فعلی نام‌گذاری شده است).

* content: آرایه papers خروجی از گره "تولید BibTeX"، که با استفاده از JSON.stringify سریالایز شده است.

* ورودی‌ها: آرایه papers از "تولید BibTeX".

* خروجی‌ها: یک فایل باینری حاوی نتایج در فرمت JSON.

* ملاحظات: مجموعه‌های نتایج بسیار بزرگ ممکن است به دلیل حجم فایل بر عملکرد تأثیر بگذارند.

  • خروجی گرفتن CSV (نوشتن فایل باینری - Write Binary File)

* نوع: n8n-nodes-base.writeBinaryFile

* عملکرد: نتایج تحقیق را در فرمت مقادیر جدا شده با تب (TSV) ذخیره می‌کند.

* پیکربندی:

* fileName: search_results_{{$now.year}}-{{$now.month}}-{{$now.day}}.csv (به صورت پویا با تاریخ فعلی نام‌گذاری شده است).

* content: فیلدهای کلیدی مقاله (عنوان، نویسندگان، سال، DOI، استنادها، URL PDF) را با کاراکترهای تب (\t) و خط جدید (\n) برای هر مقاله ترکیب می‌کند.

* ورودی‌ها: آرایه papers از "تولید BibTeX".

* خروجی‌ها: یک فایل باینری حاوی نتایج در فرمت CSV.

* ملاحظات: این پیاده‌سازی شامل فرار برای تب‌ها یا کاماها در فیلدهای داده نیست، که می‌تواند بر تجزیه در برخی خواننده‌های CSV تأثیر بگذارد.

---

جدول خلاصه

نام نود (Node Name)نوع نود (Node Type)عملکرد اصلی (Primary Function)نود(های) ورودی (Input Node(s))نود(های) خروجی (Output Node(s))توضیحات (Notes)
تنظیمات جستجوstickyNoteمرور کلی گردش کار و مستنداتNoneNoneلیست پایگاه‌های داده هدف (PubMed, ArXiv, Google Scholar, Semantic Scholar, ERIC) و مراحل پردازش.
تنظیم پارامترهای جستجوsetتعریف پارامترهای جستجوNonePDF Vector - Multi-DB Searchپیکربندی کوئری، محدوده تاریخ و نتایج برای هر منبع.
PDF Vector - جستجوی چند پایگاه دادهpdfVectorاجرای جستجو در چندین منبعتنظیم پارامترهای جستجوDeduplicate Resultsجستجو در پایگاه‌های داده آکادمیک با استفاده از پارامترهای پیکربندی شده.
حذف نتایج تکراریcodeحذف مقالات تکراریPDF Vector - Multi-DB SearchRank by Relevanceاستفاده از DOI و شباهت عنوان برای حذف موارد تکراری.
رتبه‌بندی بر اساس ارتباطcodeامتیازدهی و مرتب‌سازی مقالاتDeduplicate ResultsGenerate BibTeXاعمال الگوریتم امتیازدهی سفارشی بر اساس فاکتورهای مرتبط.
تولید BibTeXcodeایجاد ورودی‌های BibTeXRank by RelevanceExport BibTeX File, Export JSON, Export CSVفرمت‌بندی مقالات به BibTeX و آماده‌سازی داده‌ها برای صادرات دیگر.
صادرات فایل BibTeXwriteBinaryFileذخیره فایل BibTeXGenerate BibTeXNoneصادرات نتایج به صورت فایل .bib.
صادرات JSONwriteBinaryFileذخیره فایل JSONGenerate BibTeXNoneصادرات نتایج به صورت فایل .json.
صادرات CSVwriteBinaryFileذخیره فایل CSVGenerate BibTeXNoneصادرات نتایج به صورت فایل .csv جدا شده با تب.

---

بازسازی گردش کار

برای بازسازی این گردش کار از ابتدا در n8n:

1. افزودن گره Sticky Note:

* نوع: n8n-nodes-base.stickyNote

* محتوا:

```markdown

## جستجو در پایگاه داده‌های متعدد

جستجو در:

- PubMed

- ArXiv

- Google Scholar

- Semantic Scholar

- ERIC

حذف موارد تکراری و رتبه‌بندی نتایج

```

2. افزودن گره Set:

* نوع: n8n-nodes-base.set

* نام: تنظیم پارامترهای جستجو

* پیکربندی جفت‌های کلید-مقدار زیر:

* yearFrom: 2020 (نوع: Number)

* resultsPerSource: 25 (نوع: Number)

* searchQuery: "machine learning healthcare applications" (نوع: String)

3. افزودن گره PDF Vector:

* نوع: n8n-nodes-base.pdfVector

* نام: PDF Vector - جستجو در پایگاه داده‌های متعدد

* پیکربندی گره:

* عملیات: search

* منبع: academic

* پرس و جو: ={{ $json.searchQuery }}

* محدودیت: ={{ $json.resultsPerSource }}

* سال از: ={{ $json.yearFrom }}

* فیلدهای بازیابی شده: title,authors,year,doi,abstract,totalCitations,pdfUrl,provider

* ارائه‌دهندگان: pubmed, arxiv, googlescholar, semanticscholar, eric را انتخاب کنید.

4. افزودن گره Code:

* نوع: n8n-nodes-base.code

* نام: حذف موارد تکراری نتایج

* کد جاوا اسکریپت زیر را در فیلد "Code" جای‌گذاری کنید:

```javascript

// Deduplicate results based on DOI or title similarity

const uniquePapers = new Map();

const papers = $input.all();

for (const item of papers) {

const paper = item.json;

let key = paper.doi;

if (!key) {

// Normalize title for comparison if DOI is missing

key = paper.title.toLowerCase().replace(/[^\w\s]/gi, '').trim();

}

if (!uniquePapers.has(key)) {

uniquePapers.set(key, { ...paper, providers: [paper.provider] });

} else {

// Merge provider info if duplicate found by title match without DOI

if (!paper.doi && !uniquePapers.get(key).providers.includes(paper.provider)) {

uniquePapers.get(key).providers.push(paper.provider);

}

}

}

// Convert Map values back to an array

const deduplicated = Array.from(uniquePapers.values()).map(p => {

// Reconstruct the expected output structure if needed, e.g., remove provider from top level if it was merged

const { providers, ...rest } = p;

// Ensure provider field exists if it was merged

if (providers.length > 1) {

rest.provider = providers.join(', ');

}

return rest;

});

return [{ json: { papers: deduplicated } }];

```

5. افزودن گره Code:

* نوع: n8n-nodes-base.code

* نام: رتبه‌بندی بر اساس ارتباط

* کد جاوا اسکریپت زیر را در فیلد "Code" جای‌گذاری کنید:

```javascript

// Score and sort papers by relevance

const papers = $input.all()[0].json.papers;

const searchQuery = $json.searchQuery.toLowerCase().split(' '); // Get search query from parameters

const scoredPapers = papers.map(paper => {

let score = 0;

const title = paper.title.toLowerCase();

const year = paper.year || new Date().getFullYear(); // Default to current year if missing

const currentYear = new Date().getFullYear();

// Title relevance score

searchQuery.forEach(word => {

if (title.includes(word)) {

score += 10;

}

});

// Citation impact score

const citations = paper.totalCitations || 0;

score += 5 * Math.log(citations + 1);

// Recency score

const yearsSincePublication = currentYear - year;

score += Math.max(0, 10 - yearsSincePublication);

// PDF availability score

if (paper.pdfUrl) {

score += 15;

}

return { ...paper, relevanceScore: score };

});

// Sort papers by relevance score in descending order

scoredPapers.sort((a, b) => b.relevanceScore - a.relevanceScore);

return [{ json: { papers: scoredPapers } }];

```

6. افزودن گره Code:

* نوع: n8n-nodes-base.code

* نام: تولید BibTeX

* کد جاوا اسکریپت زیر را در فیلد "Code" جای‌گذاری کنید:

```javascript

// Generate BibTeX entries and prepare for export

const papers = $input.all()[0].json.papers;

let bibtexString = '';

const bibtexPapers = [];

for (let i = 0; i < papers.length; i++) {

const paper = papers[i];

let citationKey = paper.doi ? paper.doi.replace(/[^a-zA-Z0-9]/g, '') : paper_${i}; // Basic key generation

// Ensure unique keys if multiple papers lack DOI

if (bibtexPapers.some(p => p.key === citationKey)) {

citationKey = paper_${i}_${Math.random().toString(36).substring(2, 7)};

}

let authors = Array.isArray(paper.authors) ? paper.authors.join(' and ') : paper.authors || '';

if (!authors && paper.author) { // Fallback for single author field

authors = paper.author;

}

const title = paper.title || '';

const year = paper.year || '';

const doi = paper.doi || '';

const abstract = paper.abstract || '';

bibtexString += @article{${citationKey},\n;

bibtexString += title={${title}},\n;

if (authors) bibtexString += author={${authors}},\n;

if (year) bibtexString += year={${year}},\n;

if (doi) bibtexString += doi={${doi}},\n;

if (abstract) bibtexString += abstract={${abstract}}\n; // Note: Abstract might need HTML entity escaping for strict BibTeX

bibtexString += }\n\n;

bibtexPapers.push({ ...paper, citationKey: citationKey }); // Keep original paper data plus key

}

return [{ json: { bibtex: bibtexString, papers: bibtexPapers } }];

```

7. افزودن گره Write Binary File:

* نوع: n8n-nodes-base.writeBinaryFile

* نام: خروجی گرفتن فایل BibTeX

* پیکربندی:

* نام فایل: search_results_{{$now.year}}-{{$now.month}}-{{$now.day}}.bib

* محتوا: ={{ $json.bibtex }}

8. افزودن گره Write Binary File:

* نوع: n8n-nodes-base.writeBinaryFile

* نام: خروجی گرفتن JSON

* پیکربندی:

* نام فایل: search_results_{{$now.year}}-{{$now.month}}-{{$now.day}}.json

* محتوا: ={{ JSON.stringify($json.papers) }}

9. افزودن گره Write Binary File:

* نوع: n8n-nodes-base.writeBinaryFile

* نام: خروجی گرفتن CSV

* پیکربندی:

* نام فایل: search_results_{{$now.year}}-{{$now.month}}-{{$now.day}}.csv

* محتوا: ={{ $json.papers.map(p => [p.title, p.authors, p.year, p.doi, p.totalCitations, p.pdfUrl].join('\t')).join('\n') }}

10. اتصال گره‌ها: گره‌ها را به ترتیب زیر به هم وصل کنید:

* تنظیم پارامترهای جستجو -> PDF Vector - جستجو در پایگاه داده‌های متعدد

* PDF Vector - جستجو در پایگاه داده‌های متعدد -> حذف موارد تکراری نتایج

* حذف موارد تکراری نتایج -> رتبه‌بندی بر اساس ارتباط

* رتبه‌بندی بر اساس ارتباط -> تولید BibTeX

* تولید BibTeX -> خروجی گرفتن فایل BibTeX

* تولید BibTeX -> خروجی گرفتن JSON

* تولید BibTeX -> خروجی گرفتن CSV

Nodeهای استفاده‌شده

سوالات متداول

این گردش کار n8n چه پایگاه‌های داده‌ای را جستجو می‌کند؟

این گردش کار پنج پایگاه داده اصلی علمی را جستجو می‌کند: PubMed، ArXiv، Google Scholar، Semantic Scholar و ERIC.

چگونه نتایج تکراری در این گردش کار حذف می‌شوند؟

نتایج تکراری با استفاده از تطابق DOI و شباهت عنوان شناسایی و حذف می‌شوند.

خروجی‌های این گردش کار n8n چه فرمت‌هایی هستند؟

این گردش کار نتایج را در فرمت‌های BibTeX، JSON و CSV صادر می‌کند.

چگونه مقالات بر اساس ارتباط رتبه‌بندی می‌شوند؟

مقالات بر اساس عواملی مانند ارتباط عنوان، تعداد استنادات، تازگی و در دسترس بودن PDF امتیازدهی و مرتب می‌شوند.

workflowهای مرتبط

این workflow در کاتالوگ Axeto.ai بایگانی شده است. لایسنس اصلی متعلق به سازنده workflow است.

    جستجوی خودکار مقالات علمی و تحلیل PDF با n8n | Axeto.ai