← بازگشت به صفحه اصلی
Architecture

معماری سرویس گردش‌کار هوش مصنوعی

مستند زنده معماری پیاده‌سازی‌شده: مرز مسئولیت سرویس‌ها، قراردادهای HTTP و رویداد، جریان داده و artifact، جزئیات workerها، خط لوله‌های AI و استقرار فعلی Docker.

اجزای اصلی

این جدول ownership و رابط هر جزء را نشان می‌دهد. core-api، RabbitMQ، Object Storage و providerهای AI وابستگی‌های بیرونی این repository هستند.

جزء نقش رابط رفتار مهم
core-api (بیرون از این مخزن) مالک پرونده و orchestrator گردش‌کارهای ناهمزمان RabbitMQ: patent_genie.events کلید artifactها را در رویداد درخواست می‌فرستد و نتیجه workerها را از inboxها دریافت می‌کند.
info-extraction (بیرون از این مخزن) پارس PDF/DOCX/TXT، OCR و نرمال‌سازی متن queue: document.extraction.requested فایل اصلی را read-only از Object Storage می‌خواند و normalized_text_inline را در completed برمی‌گرداند؛ chunking، embedding و Milvus ندارد.
FastAPI API رابط HTTP همزمان برای health، استخراج، پیشینه فنی، claims و description docker-compose: api · /api/v1/* استخراج فقط فایل UTF-8 با پسوند .txt می‌پذیرد؛ search، report، draft/claims و draft/description ورودی JSON دارند.
Context extraction worker استخراج زمینه اختراع و مدیریت چرخه سؤال‌های تکمیلی queue: context.extraction.requested artifactهای ورودی را فقط می‌خواند و snapshot را داخل رویداد منتشر می‌کند؛ inbox در core-api آن را در DB و S3 پایدار می‌سازد.
Prior-art search worker جستجوی پیشینه فنی، غنی‌سازی IPC/CPC و رتبه‌بندی مراجع queue: prior_art.search.requested InventionContext را از Object Storage می‌خواند و نتیجه JSON به‌همراه manifest را در آن می‌نویسد.
Prior-art report worker تولید گزارش فارسی پیشینه فنی queue: prior_art.report.requested نتیجه search را می‌خواند و report.md، report JSON و manifest را ذخیره می‌کند.
Claims draft worker تولید ادعانامه فارسی از context و نتیجه جستجوی پیشینه queue: draft.claims.requested ورودی‌ها را فقط‌خواندنی از S3 می‌گیرد و claims_draft را inline در completed برمی‌گرداند؛ خروجی را در Object Storage نمی‌نویسد.
Description draft worker تولید توصیف و خلاصه فارسی از context، claims و prior-art اختیاری queue: draft.description.requested ورودی‌ها فقط‌خواندنی‌اند؛ description_draft (شامل abstract جدا) inline در completed منتشر می‌شود و progress مرحله‌به‌مرحله دارد.
RabbitMQ انتقال durable رویدادهای requested، progress، completed، questions_required و failed exchange: patent_genie.events Topic exchange، صف‌های durable، prefetch=1 و DLX مستقل patent_genie.dlx دارد.
Object Storage (S3/Ceph) انتقال artifactهای حجیم میان core-api و workerها bucket: OBJECT_STORAGE_BUCKET_NAME info-extraction، context و draft workerها دسترسی read-only دارند؛ workerهای prior-art دسترسی read/write برای JSON، manifest و report دارند.
LLM و providerهای بیرونی استخراج ساخت‌یافته، عامل‌های ReAct، جستجو، واکشی محتوا و rerank AvalAI/OpenAI · Tavily · Firecrawl · Cohere rerank provider فعال از environment انتخاب می‌شود؛ tracing اختیاری با Langfuse در عامل‌های draft پشتیبانی می‌شود.

مرز سرویس در پلتفرم

این مخزن لایه اجرای AI است، نه مالک پرونده و نه پردازشگر فایل خام. core-api وضعیت محصول را نگه می‌دارد؛ info-extraction متن را از PDF/DOCX/TXT استخراج می‌کند؛ ai-workflow روی متن نرمال‌شده، InventionContext، prior-art و پیش‌نویس claims/description کار می‌کند.

flowchart TB
  user["کاربر / Frontend"] --> core["core-api"]
  core --> store[("S3 / Ceph")]
  providers["LLM / Search / Rerank"]

  subgraph stage1 ["1. Document extraction"]
    direction LR
    docReq["document.extraction.requested"] --> ie["info-extraction"] --> docDone["completed / failed"]
  end

  subgraph stage2 ["2. Context extraction"]
    direction LR
    ctxReq["context.extraction.requested"] --> ctxW["context worker"] --> ctxDone["completed / questions_required / failed"]
  end

  subgraph stage3 ["3. Drafting contract"]
    direction LR
    draftReq["draft.claims / description.requested"] --> draftW["claims + description workers"] --> draftDone["progress / completed / failed"]
  end

  core --> docReq
  store -.-> ie
  docDone --> core
  core --> ctxReq
  store -.-> ctxW
  ctxDone --> core
  ctxW --> providers
  core -.-> draftReq
  store -.-> draftW
  draftDone -.-> core
  draftW --> providers

مسیر HTTP همزمان

FastAPI مسیر مستقیمی برای توسعه، Swagger، ATP و یکپارچه‌سازی همزمان فراهم می‌کند. هر درخواست تا پایان فراخوانی‌های AI باز می‌ماند و RabbitMQ در این مسیر دخیل نیست.

flowchart TB
  client["Client / Swagger / ATP"] --> api["FastAPI"]

  api --> health["GET /api/v1/health"]
  api --> extract["POST /api/v1/extract"]
  api --> search["POST /api/v1/prior-art/search"]
  api --> report["POST /api/v1/prior-art/report"]
  api --> claims["POST /api/v1/draft/claims"]
  api --> description["POST /api/v1/draft/description"]

  extract --> sectioned["sectioned A-F to G"] --> ctxOut["InventionContext"]
  search --> searchAgent["Search agent"] --> searchOut["PriorArtSearchResult"]
  report --> reportAgent["Report agent"] --> reportOut["report JSON / MD"]
  claims --> claimsAgent["Claims agent"] --> claimsOut["claims.v2"]
  description --> descAgent["Description agent"] --> descOut["description.v2"]

  searchOut -.-> report
  searchOut -.-> claims
  claimsOut -.-> description

مسیر ناهمزمان (RabbitMQ)

در مسیر تولید، core-api رویداد درخواست حاوی شناسه‌ها و کلید artifact را publish می‌کند. هر worker فقط صف اختصاصی خود را با prefetch=1 مصرف می‌کند و نتیجه terminal را به exchange برمی‌گرداند.

flowchart TB
  core["core-api"] --> ex[("patent_genie.events")]
  ex -.-> dlx[("patent_genie.dlx")]
  ex --> workers["ai-workflow workers"]
  workers --> s3[("S3 / Ceph")]
  workers --> inboxes["core inboxes"]
  inboxes --> core

جریان استخراج ساخت‌یافته

تنها پروفایل فعلی sectioned-device-parallel-fulltext است: ورودی یک‌بار آماده می‌شود، شش بخش مستقل همزمان استخراج می‌شوند و compiler آن‌ها را به مدل canonical تبدیل می‌کند.

flowchart TB
  input["PatentContextExtractionInput / .txt"] --> n0["N0 prepare"]
  n0 --> parallel["A B C D E F parallel extract"]
  parallel --> compile["G canonical compiler"]
  parallel -.-> recovery["retry + recovery"] -.-> compile
  compile --> out["InventionContext + missing_questions"]
  out --> gaps["snapshot_mapping
outstanding = BLOCKING or HIGH"] gaps --> ready{"outstanding gaps?"} ready -->|yes| qr["questions_required"] ready -->|no| done["completed or forced-complete"]

خط لوله پیشینه فنی

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

flowchart TB
  subgraph prepare ["۱. آماده‌سازی جستجو"]
    direction LR
    ctx["InventionContext"] --> features["Technical summary
+ features"] --> terms["LLM search elements"] end subgraph retrieval ["۲. جستجو و غنی‌سازی"] direction LR agent["LangGraph ReAct
۳ ابزار جستجو"] --> search["Tavily
AvalAI tool یا TavilyClient"] --> enrich["Firecrawl + IPC enrichment
IPC refinement searches"] end subgraph ranking ["۳. رتبه‌بندی و خروجی جستجو"] direction LR normalize["Normalize + dedupe
references"] --> rerank["Cohere rerank via AvalAI
اختیاری"] --> result["PriorArtSearchResult"] end subgraph reporting ["۴. تولید گزارش — درخواست مستقل"] direction LR select["انتخاب top-k +
metadata enrichment"] --> report["Report ReAct agent
۷ ابزار تحلیل"] --> doc["Persian synthesis
JSON / Markdown"] end terms --> agent enrich --> normalize result -.->|"درخواست مرحله دوم"| select

خط لوله پیش‌نویس ادعا و توصیف

پیش‌نویس دو مرحله متوالی دارد: Claims ReAct agent ادعانامه ساخت‌یافته می‌سازد؛ Description ReAct agent از context، claims و prior-art اختیاری، توصیف و خلاصه جدا تولید می‌کند.

flowchart LR
  http["HTTP or draft.*.requested"] --> claimsIn["context + prior_art"]
  claimsIn --> claimsAgent["Claims ReAct agent"]
  claimsAgent --> claimsOut["claims.v2 + markdown_fa"]
  claimsOut --> descIn["context + claims_draft + optional prior_art"]
  descIn --> descAgent["Description ReAct agent"]
  descAgent --> descOut["description.v2"]
  descOut --> md["markdown_fa"]
  descOut --> abs["abstract_markdown_fa"]

استقرار Docker Compose

Compose شش container از یک image می‌سازد: یک API و پنج process worker. RabbitMQ و S3 داخل این compose تعریف نشده‌اند و باید از قبل روی شبکه external در دسترس باشند.

flowchart TB
  subgraph compose ["docker-compose.yml"]
    direction LR
    api["api"]
    w1["context worker"]
    w2["prior-art-search-worker"]
    w3["prior-art-report-worker"]
    w4["claims-draft-worker"]
    w5["description-draft-worker"]
  end
  net[["patent-genie-local"]]
  rmq[("RabbitMQ")]
  s3[("S3 / Ceph")]
  providers["LLM providers"]
  compose --- net
  net --- rmq
  net --- s3
  api & w1 & w2 & w3 & w4 & w5 --> providers