مقالات

عوامل با دوام طولانی مدت با AI بهار ، جریان کار DAPR


در سال گذشته ، ما شاهد افزایش مدل های مختلف و استفاده از چارچوب های محبوب مانند تعامل بهار AI و LLM هستیم. در ژانویه امسال ، مسیحی از تیم بهار هوش مصنوعی منتشر کرد با AI بهار عوامل مؤثر بسازیدپوشش مدلهای عامل مشترک شرح داده شده در مقاله انسان شناسی تحت عنوان عوامل مؤثر بسازیدحرف

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

یکی از مهمترین مواردی که من از این دو مقاله تکرار خواهم کرد ، تمایز بین مأمورین وت محل کار:

انتشار پژوهش باعث تمایز مهم معماری بین دو نوع سیستم عامل می شود:

  1. محل کار: سیستمهایی که LLM ها و سازها از طریق مسیرهای کد از پیش تعریف شده سازماندهی می شوند (به عنوان مثال سیستم تجویز)
  2. مأمورین: سیستم هایی که LLM به صورت پویا فرآیندهای خاص خود را هدایت می کند و از ابزارها استفاده می کند

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

حداقل 10 سال در صنعت موتور کار می کند (کارگاه های Drools ، JBPM ، Cloud ، Camunda/Zebe و اکنون گردش کار DAPR) ، مدلهای شرح داده شده در مقاله بهار AI برای من بسیار آشنا هستند ، به عنوان آنهایی که نیاز به کار دارند ، که نیاز به جریان کار دارد که نیاز به جریان کار دارد ، که نیاز به جریان کار دارد ، که جریان جریان را می طلبد ، جریان های جریان را انجام می دهد ، چه کسی کار می کند ، چه کسی کار می کند ، چه کسی کار می کند ، چه کسی کار می کند ، چه کسی کار می کند ، چه کسی کار می کند. جریان ، که به جریان کار نیاز دارد ، که به جریان کار نیاز دارد ، که به جریان کار نیاز دارد ، که به جریان کار نیاز دارد ، که به جریان کار نیاز دارد ، که به جریان کار نیاز دارد ، که به جریان کار نیاز دارد ، که به جریان کار نیاز دارد و این نیاز به جریان کار دارد ، که نیاز به جریان کار دارد ، که نیاز به جریان کار دارد ، که نیاز به جریان کار نیاز به جریان کار دارد که نیاز به جریان کار را دارند که کار را نیاز دارند. LLMS

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

محصولات کار عامل ، بخش بادوام و جریان کار DAPR

برای تنظیم زمینه ، بیایید به مقاله AI بهار در مورد مدل های عامل که در آن پنج مدل تحت پوشش قرار می گیرند ، برگردیم:

  1. روند کار زنجیره: مدل گردش کار زنجیره ای نمونه ای از اصل شکستن وظایف پیچیده مراحل ساده تر و کنترل شده تر است.
  2. موازی: LLMS می تواند به طور همزمان روی کارها کار کند و نتایج برنامه نویسی آن را خلاصه کند. روند کار موازی ها در دو تغییر کلیدی آشکار می شود:
    • بخش: شکستن وظایف زیرنویس مستقل برای پردازش موازی
    • رأی: انجام چندین مورد از همان کار اجماع
  3. مسیریابی گردش کار: مدل مسیریابی توزیع هوشمندانه ای از وظایف را پیاده سازی می کند ، که امکان مدیریت تخصصی برای انواع مختلف ورودی را فراهم می کند.
  4. ارکستر/کارگران: این مدل نشان می دهد که چگونه می توان از رفتار پیچیده تری مانند یک عامل در حالی که کنترل را حفظ می کند ، اعمال کرد:
    • مرکزی LLM تجزیه و تحلیل کار را ایجاد می کند
    • کارگران تخصصی با زیرنویس خاص سر و کار دارند
    • مرزهای روشن از قابلیت اطمینان سیستم پشتیبانی می کنند
  5. بهینه ساز رتبه بندی: مدل بهینه ساز ارزیابی کننده یک فرآیند Double LLM را پیاده سازی می کند که در آن یک مدل جواب می دهد ، در حالی که دیگری ارزیابی و بازخورد را در یک چرخه تکراری مشابه روند پالایش نویسنده انسان ارائه می دهد.

برای همه این سناریوها ، می توانیم نمونه هایی را در مخزن پروژه های بهار/بهار-ع -ai-ai-ai-for پیدا کنیم. زیبایی این رویکرد این است که ما باید فقط یک وابستگی به برنامه های شارژ بهار خود اضافه کنیم تا ادغام این مدل های عامل را شروع کنیم.

پس چه چیزی از دست رفته است؟ اگر به کد نمونه ارائه شده نگاه کنید ، این مثالها نشان می دهد که چگونه می توان تماس های LLM را با ساختارهای معمولی جاوا تنظیم کرد. به عنوان مثال ، کد موازی سازی که پردازش تخصصی را پردازش می کند:

public List parallel(String prompt, List inputs, int nWorkers) {
		Assert.notNull(prompt, "Prompt cannot be null");
		Assert.notEmpty(inputs, "Inputs list cannot be empty");
		Assert.isTrue(nWorkers > 0, "Number of workers must be greater than 0");

		ExecutorService executor = Executors.newFixedThreadPool(nWorkers);
		try {
			List> futures = inputs.stream()
					.map(input -> CompletableFuture.supplyAsync(() -> {
						try {
							return chatClient.prompt(prompt + "\nInput: " + input).call().content();
						} catch (Exception e) {
							throw new RuntimeException("Failed to process input: " + input, e);
						}
					}, executor))
					.collect(Collectors.toList());

			// Wait for all tasks to complete
			CompletableFuture allFutures = CompletableFuture.allOf(
					futures.toArray(CompletableFuture[]::new));
			allFutures.join();

			return futures.stream()
					.map(CompletableFuture::join)
					.collect(Collectors.toList());

		} finally {
			executor.shutdown();
		}
}

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

اگرچه این کار را انجام می دهد ، اگر بخواهیم چند کار (اعلان ها) را به طور موازی پردازش کنیم ، برای این مثال ما برای انجام این کارها به JVM اعتماد می کنیم. اگر JVM (برنامه ما) کاهش یابد و ما قبلاً کارهای X را انجام داده ایم ، باید شروع به ارسال دوباره همه اعلان ها برای پردازش کنیم.

به همین ترتیب ، نمونه “زنجیره فرآیند کار”:

یک زنجیره فرآیند کار سریع LLMS با استفاده از Spring AI (منبع تصویر)

اگر برنامه ما بعد از تماس LLM 2 فرو ریخته شود ، ما فقط باید دوباره شروع کنیم. در جاوا ، این به نظر می رسد که اگر بیانیه هایی برای بررسی شرایط (“دروازه”) برای تصمیم گیری در مورد نیازهای جدید به LLM ، چرخه ای با برخی از اظهارات به نظر می رسد. برای مرجع ، به GitHub Repo Spring-Projects/Spring-Ai-Promps مراجعه کنید.

عالی از روند کار DAPR ما

چگونه می توانیم اطمینان حاصل کنیم که اگر برنامه ما از بین نرود ، ما مراحلی را که قبلاً اجرا کرده ایم قبل از صرفه جویی در وقت ، پول و منابع تکرار نمی کنیم؟ خوش آمدید ، عملکرد ماندگار.

دائمی این یک مفهوم جدید نیست و بدون تعمیق توضیح می دهد که چگونه چارچوب بادوام برای کار اجرای ، می خواهیم این مدل ها را با دوام ، بادوام و مقیاس در خارج از JVM انجام دهیم. ارائه ما را ببینید اجرای بادوام در Arch بدون سرور: CloudFlare ، Springboot & DAPR با Nele در Jnation ، جایی که ما نمونه ای از نحوه کار این قاب ها در زیر کاپوت را ارائه می دهیم.

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

می توانید نمونه های مهاجرت شده از GitHub را پیدا کنید سلاوی/ /بهارحرف

این مثالها چگونه متفاوت هستند؟ این مثالها برای اجرای همان مدل ها ، هوش مصنوعی بهار را با ساعات کاری DAPR ترکیب می کنند ، اما اکنون با یک رویکرد ماندگار و پایدار. این به چه معنی است؟

بیایید به کد نگاه کنیم و آن را با نسخه معمولی جاوا مقایسه کنیم.

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

فراخوانی allFutures.join(); اجازه می دهد تا برنامه تا زمانی که تمام آینده ها به اتمام برسد ، مسدود شود ، این بدان معنی است که ما تمام نتایج تبلیغاتی را که ارسال کرده ایم دریافت می کنیم. سرانجام ، ما تمام نتایج را تکرار می کنیم و آنها را به عنوان لیستی از تماس گیرنده باز می گردانیم. به ParalalizationLworkflow.java مراجعه کنید.

List> futures = inputs.stream()
       .map(input -> CompletableFuture.supplyAsync(() -> {
           try {
   			  return chatClient.prompt(prompt + "\nInput: " + input).call().content();
           } catch (Exception e) {
    	      throw new RuntimeException("Failed to process input: " + input, e);
           }
        }, executor))
       .collect(Collectors.toList());

// Wait for all tasks to complete
CompletableFuture allFutures = CompletableFuture.allOf(
					futures.toArray(CompletableFuture[]::new));

allFutures.join();

return futures.stream()
        .map(CompletableFuture::join)
		.collect(Collectors.toList());

هنگام نزدیک شدن به گردش کار DAPR ، ما از همان ساختارهای قبلی استفاده می کنیم. تکرار می کنیمinputs().stream() و برای هر ورودی که ما تماس می گیریم PromtpActivity حاصل Task که همان هدف را ارائه می دهد CompleteableFuture آنچه قبلاً دیدیم

استفاده کردن ctx.allOf(processTasks).await() منتظر بمانید تا تمام کارها به پایان برسد تا بتوانیم نتایج را به دست آوریم و همه آنها را در یک لیست جمع کنیم تا به کاربر برگردیم.

به موازی workflow.java مراجعه کنید.

با استفاده از رابط گردش کار ، یک ارکستراسیون دائمی را تعیین می کنید. در تحقق گردش کار ، شما تعیین می کنید که چه وظایفی باید انجام شود و چگونه آنها به یکدیگر وصل می شوند. به عبارت دیگر ، شما می توانید با رمزگذاری آن در تحقق گردش کار ، هر مدلی را که می خواهید تعیین کنید ، اما برای ایمن نگه داشتن امور ، می توانید منطق خود را به کارهایی که توسط اجرای تعریف شده است تقسیم کنید WorkflowActivity رابط

در زیر می توانید ببینید که چگونه روند کار موازی کاملاً واضح است:

@Component
public class ParallelWorkflow implements Workflow {
  @Override
  public WorkflowStub create() {
    return ctx -> {
      ctx.getLogger().info("Starting Workflow: {}", ctx.getName());

      WorkflowInput workflowInput = ctx.getInput(WorkflowInput.class);

      List> processTasks = workflowInput.inputs()
              .stream()
              .map(input -> ctx.callActivity(PromptActivity.class.getName(), new PromptInput(workflowInput.prompt(), input), String.class))
              .collect(Collectors.toList());

      List workerResponses = ctx.allOf(processTasks).await();

      ctx.complete(workerResponses);
    };
  }

}

این کد بسیار شبیه به مثال اصلی AI بهار است. از طریق لیستی از اعلان ها برای ایجاد وظایف پردازش ناهمزمان آسیب دیده است. برای جمع آوری تمام پاسخ ها پس از اتمام تمام کارها.

تفاوت بزرگ در اینجا در این است که هر سریع با آن محصور می شود PromptActivity:

@Component
public class PromptActivity implements WorkflowActivity {

  private final ChatClient chatClient;

  public PromptActivity(ChatClient.Builder chatClientBuilder) {
    this.chatClient = chatClientBuilder.build();
  }


  @Override
  public Object run(WorkflowActivityContext workflowActivityContext) {
    ParallelWorkflow.PromptInput promptInput = workflowActivityContext.getInput(ParallelWorkflow.PromptInput.class);
    try{
      return chatClient.prompt(promptInput.prompt() + "\nInput: " + promptInput.input()).call().content();
    } catch (Exception e){
      throw new RuntimeException("Failed to process input: " + promptInput.input(), e);
    }

  }
}

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

گردش کار DAPR

دومین مزیت این رویکرد این است که فعالیت کار را می توان در موارد مختلف کاربرد یا حتی برنامه های مختلف میزبانی کرد. این به ما این امکان را می دهد تا اعدام های خود را در چندین JVM افزایش دهیم ، جایی که ما واقعاً می توانیم فعالیت های موازی را انجام دهیم.

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

خوب ، اما برای استفاده از فرآیندهای کاری DAPR چه چیزی باید به برنامه خود اضافه کنم؟

گردش کار DAPR را به برنامه های بوت بهار خود اضافه کنید

مانند بهار هوش مصنوعی ، ما فقط باید به برنامه شارژ بهار خود اعتیاد اضافه کنیم تا از جریان کار DAPR استفاده کنیم.


	io.dapr.spring
	dapr-spring-boot-starter
	${dapr.version}

توجه: ما به تازگی نسخه 1.16.0 SDK را منتشر کردیم.

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


	io.dapr.spring
	dapr-spring-boot-starter-test
	${dapr.version}
	test

تست استارت بوت بهار DAPR

با استفاده از تست Starter Boot Starter DAPR ، می توانید برنامه Boot Spring خود را با استفاده از زمینه آزمایش راه اندازی کنید (mvn spring-boot:test-run) این برنامه به طور خودکار برنامه شما را به اجرای DAPR بارگیری و وصل می کند. پیکربندی TestContainers را در DaprtestContainersConfig.java در اینجا ببینید.

بیایید این را خلاصه کنیم

در این پست وبلاگ ، ما دیدیم که چگونه می توانیم نمونه های هوش مصنوعی بهار از اجراهای ماندگار گردش کار را گسترش دهیم. این به ما کمک می کند تا نمایندگان خود را برای تولید آماده کنیم ، زیرا اکنون مقیاس و با دوام در برابر شکست هستند. ما بررسی کرده ایم که چگونه فرایندهای کار DAPR را به برنامه های شارژ بهار موجود خود اضافه کنیم (dapr-spring-boot-starter وت dapr-spring-boot-starter-test) و اینکه چگونه با ادغام TestContainers ، برای توسعه توسعه محلی که شما را ملزم به راه اندازی DAPR در خوشه Kubernetes نمی کند یا ابزاری دیگر را که دیگر با برنامه های بارگیری بهار خود استفاده نمی کنید ، بارگیری می کند.


Source link

نوشته های مشابه

دیدگاهتان را بنویسید

دکمه بازگشت به بالا