نحوه ساخت یک برنامه هوش مصنوعی با Quarkus و Langchain4j

با توجه به رونق LLM طی یک سال گذشته ، می توان نتیجه گرفت که تقریباً همه به یک دلیل یا دیگری از مدلی از یکی از ارائه دهندگان اصلی مانند فیس بوک ، گوگل ، مایکروسافت ، آمازون و دیگران استفاده کرده اند.
از دیدگاه فنی ، جالب است که چگونه می توانیم نرم افزاری را که از LLMS استفاده می کند ، توسعه دهیم. در این راهنمای جامع ، ما با استفاده از Quarkus و Langchain4j از طریق ساخت یک برنامه هوش مصنوعی قدم می زنیم.
پیش نیازهای
- دانش اساسی جاوا ، Quarkus و Langchain4j
- JDK 17 یا جدیدتر
- ماوون یا گرادل
- یک کلید API از ارائه دهنده LLM (به عنوان مثال ، OpenAi)
langchain4j چیست؟
Langchain4J یک چارچوب قدرتمند جاوا است که برای ساده کردن ادغام مدل های بزرگ زبان (LLMS) و سایر قابلیت های هوش مصنوعی در برنامه های جاوا طراحی شده است. به عنوان یک بندر جاوا از پروژه محبوب Langchain ، در ضمن حفظ قابلیت اطمینان و ساختاری که جاوا به آن شناخته شده است ، یک روش ایمن قوی و نوع برای ساخت برنامه های کاربردی AI را در اختیار توسعه دهندگان قرار می دهد.
Langchain4J – نمای کلی
این چارچوب در اطراف اجزای سازنده ساخته شده است که می توانند برای ایجاد راه حل های AI سفارشی مخلوط و همسان شوند:
- مدل های زبانی
- سیستم های حافظه
- لودرهای سند
- فروشگاه های بردار
- تعبیه
- ابزار و نمایندگان
Langchain4J – اجزای
اجزای اصلی توضیح داده شده است
-
مدل های زبانی
مدل های زبان (LLMS) موتورهای هوش مصنوعی هستند که متن را پردازش و تولید می کنند ، با Langchain4J در درجه اول از مدلهای GPT OpenAI و سایر LLM های سازگار پشتیبانی می کنند. آنها وظایفی مانند تولید متن ، خلاصه سازی و استخراج داده های ساختاری را از طریق یک رابط یکپارچه انجام می دهند. -
سیستم های حافظه
سیستم های حافظه تاریخ مکالمه و زمینه بین تعامل را حفظ می کنند ، و این امکان را برای مکالمات منسجم چند چرخش فراهم می کند. می توان برای ذخیره پیام ها در پشتیبان های مختلف (در حافظه ، بانک اطلاعاتی) و مدیریت زمینه مکالمه با سیاستهای نگهداری قابل تنظیم ، پیکربندی شد. -
لودرهای سند
لودرهای اسناد رابط هایی را برای خواندن و پردازش قالب های مختلف فایل (PDF ، TXT ، HTML) به یک قالب استاندارد برای پردازش AI ارائه می دهند. آنها پیچیدگی های خواندن پرونده و استخراج متن اولیه را کنترل می کنند و اسناد را برای پردازش بیشتر آماده می کنند. -
فروشگاه های بردار
فروشگاه های وکتور بانکهای اطلاعاتی تخصصی هستند که تعبیه متن را ذخیره و بازیابی می کنند و قابلیت های جستجوی معنایی را فعال می کنند. آنها از پشتیبان های مختلفی مانند Pinecone یا ذخیره سازی محلی پشتیبانی می کنند ، و پیدا کردن محتوای معنایی مشابه ، آن را کارآمد می کند. -
تعبیه
جاسازی ها متن را به بردارهای عددی تبدیل می کنند که معنای معنایی را ضبط می کنند ، برای جستجوی شباهت و مقایسه محتوا ضروری است. آنها با مدل های مختلف جاسازی (مانند تعبیه Openai) کار می کنند تا متن را به بازنمایی های ریاضی تبدیل کنند. -
ابزار و نمایندگان
ابزارها و نمایندگان مؤلفه هایی هستند که با ارائه ویژگی های خاص (مانند محاسبات یا تماس های API) و توانایی های تصمیم گیری خودمختار ، قابلیت های LLM را گسترش می دهند. آنها به LLM ها اجازه می دهند تا با سیستم های خارجی در تعامل باشند و از طریق رابط های تعریف شده وظایف پیچیده ای را انجام دهند.
تنظیم پیکربندی
افزودن پسوندهای Langchain4J:
io.quarkiverse.langchain4j
quarkus-langchain4j
${langchain4j.version}
dev.langchain4j
langchain4j-core
${langchain4j-core.version}
پیکربندی OpenAI
quarkus.langchain4j.openai.api-key=${OPENAI_API_KEY}
quarkus.langchain4j.openai.timeout=60s
quarkus.langchain4j.openai.chat-model.temperature=0.7
سرویس AI ساده
سرویس ساده هوش مصنوعی برای کارهای ساده هوش مصنوعی مانند تولید متن بر اساس یک فوریت مشخص طراحی شده است. در پروژه شما ، این در SimplePostAiService
رابط
چگونه کار می کند
تعریف رابط:
- در
@RegisterAiService
حاشیه نویسی رابط را به عنوان یک سرویس هوش مصنوعی که Langchain4J پیاده سازی خواهد کرد ، نشان می دهد. - در
writeNews
روش یک موضوع و طول را به عنوان ورودی می گیرد و یک مقاله خبری ایجاد می کند.
کد مثال:
@RegisterAiService
public interface SimplePostAiService {
String writeNews(String topic, int length);
}
از مورد استفاده کنید:
این سرویس می تواند برای تولید مقالات خبری کوتاه یا خلاصه بر اساس یک موضوع خاص استفاده شود. به عنوان مثال ، تماس گرفتن writeNews("technology", 100)
ممکن است یک مقاله 100 کلمه ای درباره آخرین روندهای فناوری ایجاد کند.
ادغام:
این سرویس به GreetingResource
کلاس و از طریق نقطه پایانی استراحت:
@GET
@Path("/news/{topic}/{length}")
public String writeNews(@PathParam("topic") String topic, @PathParam("length") int length) {
return simplePostAiService.writeNews(topic, length);
}
سرویس پیشرفته AI با حافظه
حافظه یک مؤلفه اساسی در Langchain4j است که نقش مهمی در ایجاد تعامل معنی دار و متنی بین کاربران و مدلهای هوش مصنوعی ایفا می کند. بر خلاف سیستم های پاسخگویی به درخواست سنتی که در آن هر تعامل به تنهایی ایستاده است ، حافظه برنامه ها را قادر می سازد تا زمینه را حفظ کنند و مکالمات طبیعی تر و روان تری ایجاد کنند.
هدف اصلی حافظه در Langchain4J حفظ تاریخ و زمینه گفتگو است. بدون حافظه ، هر تعامل با یک مدل AI جدا می شود و کاربران را وادار می کند تا به طور مکرر اطلاعات زمینه یا پس زمینه را ارائه دهند. به عنوان مثال ، در مکالمه ای در مورد برنامه ریزی سفر ، حافظه به AI اجازه می دهد تا مقصد ، تاریخ ها یا ترجیحات قبلی را که قبلاً ذکر شده بود ، به خاطر بسپارد بدون اینکه کاربر بخواهد این اطلاعات را در هر پیام بازگرداند.
سرویس پیشرفته AI با حافظه با حفظ زمینه در چندین درخواست ، تعامل AI را تقویت می کند. این در AdvancedPostAiService
رابط
تعریف رابط:
- در
@RegisterAiService
حاشیه نویسی رابط را به عنوان یک سرویس هوش مصنوعی نشان می دهد. - در
chatWithMailPostBotWithMemory
روش استفاده می کند@MemoryId
حاشیه نویسی برای مرتبط کردن یک حافظه با یک کاربر خاص.
کد مثال:
@RegisterAiService
public interface AdvancedPostAiService {
String chatWithMailPostBotWithMemory(@MemoryId String userId, String text);
}
از مورد استفاده کنید:
این سرویس برای برنامه هایی مانند Chatbots ایده آل است ، جایی که حفظ زمینه در مکالمات بسیار مهم است. به عنوان مثال ، یک کاربر می تواند بپرسد ، “امروز هوا چیست؟” و پیگیری با “فردا چطور؟” بدون نیاز به تکرار مکان.
ادغام:
این سرویس به GreetingResource
کلاس و از طریق نقطه پایانی در معرض دید
@GET
@Path("/mail-with-memory")
public String writeNewsWithMemory(
@QueryParam("text") String text, @QueryParam("userId") String userId) {
return advancedPostAiService.chatWithMailPostBotWithMemory(userId, text);
}
درک انواع پیام در Langchain4j
-
پیام های سیستم (
@SystemMessage
)
پیام های سیستم به عنوان دستورالعمل یا تنظیم متن عمل می کنند
اطلاعات مربوط به مدل AI. آنها به تعریف رفتار ، نقش ، کمک می کنند
یا محدودیت برای پاسخ های هوش مصنوعی. این پیام ها نیستند
به طور معمول برای کاربران نهایی قابل مشاهده است اما برای کنترل نحوه کنترل بسیار مهم است
AI رفتار می کند. -
پیام های کاربر (
@UserMessage
)
پیام های کاربر نشان دهنده ورودی واقعی کاربران در تعامل با سیستم AI است. این پیام ها حاوی نمایش داده ها ، اظهارات یا درخواست هایی است که هوش مصنوعی نیاز به پاسخگویی دارد. آنها هسته اصلی تعامل بین کاربران و هوش مصنوعی را تشکیل می دهند.
درک نسل بازیابی-آمریكا (RAG)
نسل بازیابی-اوج (RAG) یک رویکرد پیشرفته است که قدرت مدلهای بزرگ زبان (LLM) را با یک دانش دانش از اطلاعات خاص ترکیب می کند. RAG به جای اینکه فقط به دانش از پیش آموزش LLM تکیه کند ، قبل از ایجاد پاسخ ، اطلاعات مربوطه را از یک مجموعه سند سفارشی بازیابی می کند. این رویکرد به طور قابل توجهی دقت و قابلیت اطمینان پاسخ های تولید شده توسط AI را با قرار دادن آنها در اطلاعات خاص و تأیید شده بهبود می بخشد.
چرا RAG مورد نیاز است؟
LLM های سنتی با محدودیت های مختلفی روبرو هستند که RAG به غلبه بر آنها کمک می کند:
- LLMS دانش محدود به تاریخ قطع داده های آموزش خود دارد. RAG به آنها اجازه می دهد تا به اطلاعات فعلی دسترسی پیدا کنند.
- LLMS ممکن است اطلاعات قابل قبول اما نادرست ایجاد کند. RAG با تهیه منبع منبع خاص و دقیق ، این کار را کاهش می دهد.
- شرکت ها غالباً بر اساس مستندات ، سیاست ها یا پایگاه دانش خود به پاسخ نیاز دارند. RAG این سفارشی سازی را امکان پذیر می کند.
- با RAG ، پاسخ ها را می توان به اسناد منبع بازگرداند و سیستم شفاف تر و قابل اعتماد تر می شود.
مؤلفه های اصلی RAG: یک فرآیند گام به گام
-
پردازش سند
اولین گام مهم در اجرای RAG شامل تهیه و پردازش اسناد شما است. این با بارگیری اسناد از منابع مختلف مانند پرونده ها ، پایگاه داده ها یا محتوای وب شروع می شود. سپس اسناد به تکه های کوچکتر و قابل کنترل تقسیم می شوند که برای پردازش و بازیابی بهینه هستند. فرآیند تقسیم باید اندازه تکه را با حفظ زمینه تعادل برقرار کند ، و اطمینان حاصل کند که هر بخش ضمن ماندن در محدوده نشانه های مدل ، اطلاعات معنی دار را حفظ می کند. این مرحله همچنین شامل تمیز کردن و استاندارد سازی متن ، از بین بردن اطلاعات بی ربط و ساخت مناسب محتوا است. -
نسل
پس از پردازش و تقسیم اسناد ، مرحله بعدی تبدیل این تکه های متنی به تعبیه است. تعبیه ها بازنمایی عددی از متن هستند که معنای معنایی را ضبط می کنند و امکان جستجوهای شباهت کارآمد را فراهم می کنند. این فرآیند از مدل های تعبیه شده (مانند نمونه های OpenAI یا سایر ارائه دهندگان) برای تبدیل متن به بردارهای با ابعاد بالا استفاده می کند. این تعبیه ها به عنوان پایه و اساس قابلیت های جستجوی معنایی عمل می کنند و این سیستم را قادر می سازد تا اطلاعات مربوطه را بر اساس معنی پیدا کنند نه فقط کلمات کلیدی. -
انباره بردار
مؤلفه کلیدی سوم شامل ذخیره و سازماندهی این تعبیه ها در یک پایگاه داده بردار است. فروشگاه های وکتور بانکهای اطلاعاتی تخصصی هستند که برای ذخیره و بازیابی بردارهای با ابعاد بالا طراحی شده اند. آنها تعبیه ها را به روشی نشان می دهند که جستجوهای شباهت سریع را امکان پذیر می کند ، که برای بازیابی زمینه مربوطه در طول پردازش پرس و جو بسیار مهم است. انتخاب فروشگاه بردار به عواملی مانند حجم داده ، نیازهای عملکرد و نیازهای مقیاس بستگی دارد. گزینه های محبوب شامل فروشگاه های وکتور محلی Pinecone ، Weaviate یا محلی برای برنامه های کوچکتر است. -
مکانیزم بازیابی
هنگامی که یک پرس و جو دریافت می شود ، سیستم آن را به یک جاسازی تبدیل می کند و فروشگاه بردار را برای بردارهای مشابه جستجو می کند. این فرایند بازیابی ، مهمترین تکه های سند را بر اساس شباهت معنایی مشخص می کند. این مکانیسم را می توان با فیلترها ، جستجوی ابرداده و رویکردهای ترکیبی با ترکیب معنایی و جستجوی کلمات کلیدی برای دقت بهتر تقویت کرد. -
مجمع متن
پس از بازیابی تکه های مربوطه ، سیستم آنها را در یک زمینه منسجم جمع می کند. این شامل انتخاب مهمترین اطلاعات ، سفارش منطقی آن و اطمینان از آن در پنجره متن مدل است. فرایند مونتاژ ممکن است شامل فداکاری ، رتبه بندی ارتباط و جمع بندی زمینه برای بهینه سازی ورودی برای مدل زبان باشد. -
تولید
مرحله آخر شامل ترکیب زمینه مونتاژ شده با پرس و جو اصلی برای ایجاد سریع مدل زبان است. این مهندسی سریع تضمین می کند که مدل چگونه می تواند از زمینه ارائه شده برای تولید پاسخ های دقیق و مرتبط استفاده کند. سپس سیستم این کار را از طریق LLM پردازش می کند تا پاسخ نهایی را تولید کند ، که باید ضمن حفظ تسلط به زبان طبیعی ، در اطلاعات بازیابی شده پایه گذاری شود.
نسل بازیابی-اوت (RAG)
سرویس بازیابی سند از مدل های تعبیه Langchain4j و ذخیره اسناد برای بازیابی اطلاعات مربوطه استفاده می کند.
این در DocsAiService
رابط
تعریف رابط:
- در
@RegisterAiService
حاشیه نویسی رابط را به عنوان یک سرویس هوش مصنوعی نشان می دهد. - در
chatWithQuarkusDocsBot
روش سریع کاربر را می گیرد و اطلاعات مربوطه را از یک فروشگاه اسناد بازیابی می کند.
کد مثال:
@RegisterAiService
public interface DocsAiService {
String chatWithQuarkusDocsBot(@UserMessage String prompt);
}
تعبیه کننده ها:
تعبیه کننده های تعبیه کننده مسئول پردازش و ذخیره اسناد به گونه ای هستند که باعث می شود آنها را جستجو کند. آنها اسناد را به تکه ها تقسیم می کنند ، تعبیه می کنند و آنها را در یک پایگاه داده بردار ذخیره می کنند.
تقسیم سند:
DocumentSplitter splitter = DocumentSplitters.recursive(500, 0);
نسل جاسازی شده:
List<Embedding> embeddings = embeddingModel.embed(chunks);
ذخیره سازی در فروشگاه بردار:
EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.documentSplitter(splitter)
.build();
ingestor.ingest(documents);
در DocumentsRetriever
کلاس یک لوبیا با مدیریت Quarkus است که یک RetrievalAugmentor
برای ادغام نسل بازیابی-آمریكا (RAG) در برنامه خود. با حاشیه نویسی @ApplicationScoped
، به این معنی که یک بار فوری شده و در سراسر برنامه به اشتراک گذاشته می شود. کلاس ساخت EmbeddingStoreContentRetriever
با استفاده از یک ارائه شده RedisEmbeddingStore
وت EmbeddingModel
بشر این retriever اسناد مربوطه را بر اساس شباهت معنایی واگذار می کند. این پیکربندی را پیکربندی می کند DefaultRetrievalAugmentor
با استفاده از Retriever ، که می تواند برای تقویت پاسخ های LLM با اطلاعات متنی مرتبط استفاده شود. در maxResults
پارامتر روی 20 تنظیم شده است و تعداد آنها را محدود می کند
از اسناد بازیابی شده در هر پرس و جو. در get()
روش پیکربندی شده را برمی گرداند RetrievalAugmentor
، که می تواند برای تقویت تعامل LLM به اجزای دیگر تزریق شود.
@ApplicationScoped
public class DocumentsRetriever implements Supplier<RetrievalAugmentor> {
private final RetrievalAugmentor augmentor;
public DocumentsRetriever(final RedisEmbeddingStore store, final EmbeddingModel model) {
EmbeddingStoreContentRetriever contentRetriever =
EmbeddingStoreContentRetriever.builder()
.embeddingModel(model)
.embeddingStore(store)
.maxResults(20)
.build();
augmentor = DefaultRetrievalAugmentor.builder().contentRetriever(contentRetriever).build();
}
@Override
public RetrievalAugmentor get() {
return augmentor;
}
}
می توانید کد منبع کامل این پروژه را در مخزن Github کشف کنید.
پایان
ساخت برنامه های کاربردی هوش مصنوعی با Quarkus و Langchain4J ترکیبی قدرتمند برای ایجاد راه حل های هوشمند و آماده تولید فراهم می کند. از طریق این راهنما ، ما به بررسی مؤلفه های اساسی و الگوهای اجرای ، از خدمات اساسی هوش مصنوعی گرفته تا ویژگی های پیشرفته مانند RAG و Disperders.