چگونه ما AI را در Epilot ادغام می کنیم – فصل 2: RAG بدون سرور W/ Langchain & Weaviate

مقدمه
در فصل قبل ، من به اشتراک گذاشتم که چگونه سفر هوش مصنوعی خود را در Epilot با اجرای خلاصه ایمیل هوش مصنوعی آغاز کردیم و به کاربران کمک می کند تا زمان خواندن ایمیل را تا 87 ٪ کاهش دهند. با تشویق این موفقیت ، اکنون ما در حال افزایش قابلیت های هوش مصنوعی خود با نسل بازیابی (RAG) هستیم تا پیشنهادات ایمیل باهوش و آگاه تر را ارائه دهیم.
چرا؟
همانطور که هدف ما این است که تجارت کالایی خود را مقیاس کنیم ، سرمایه گذاری در هوش مصنوعی بسیار مهم است – نه فقط برای رشد ، بلکه برای به روزرسانی قابل توجهی توانایی های محصول خود را. بخش های کالایی اغلب حجم بالایی از درخواست های تکراری خدمات به مشتری دارند. کاربران ما به پیشنهادات ایمیل سریع و آگاه از متن نیاز دارند که درک می کنند:
- ارتباطات قبلی و دانش سازمانی
- سبک های ارتباطی خاص شرکت
- روابط متناسب با هر مشتری
اگرچه مدل های بزرگ زبان (LLMS) قدرتمند هستند ، اما هنگام دسترسی به داده های شرکت اخیر یا خاص ، محدود هستند. سفارشی سازی پاسخ های LLM معمولاً شامل مهندسی سریع ، پارچه یا تنظیم دقیق است. تنظیم دقیق منابع بسیار فشرده و پیچیده است و باعث می شود مهندسی سریع با انتخاب واضح ما باشد.
راه حل ما: نسل بازیابی-آمریكا (RAG)
ما یک راه حل مبتنی بر RAG را برای بازیابی و ارائه زمینه مربوطه از موضوعات ایمیل گذشته اجرا کردیم و در نهایت به منابع داده های خارجی مانند اسناد و وب سایت ها گسترش یافتیم. طولانی مدت ، سازمانهایی که از Epilot استفاده می کنند ، پایه های دانش کاملاً قابل تنظیم و سفارشی را برای همه ویژگی های آینده AI و عوامل هوش مصنوعی در دسترس خواهند داشت.
این به کاربران ما اجازه می دهد تا سریعتر به ایمیل های مشتری پاسخ دهند و کیفیت ارتباط و کارآیی را بهبود بخشند. از طرف نهایی مشتری ، این به معنای خدمات سریعتر ، دقیق تر و بهتر است.
آن را در عمل مشاهده کنید
https://www.youtube.com/watch؟v=ngtl3uyi6g8
یک مشتری نهایی در مورد الزامات مستندات برای یک برنامه نوسازی (Sanierungsfahrplan) ایمیل می کند.
کاربر Epilot وقت خود را برای تحقیق در مورد سیاست ها یا کتابچه راهنما تلف نمی کند – آنها به سادگی هوش مصنوعی ما را وادار می کنند generate reply in english
بشر
با استفاده از RAG ، هوش مصنوعی ما به داده های متنی ضربه می زند ، فوراً می داند که کدام اسناد خاص برای برنامه نوسازی و مهلت بارگذاری آنها مورد نیاز است ، سپس یک پاسخ شخصی را تهیه می کند که نیازهای دقیق مشتری را برطرف می کند.
سیستم ما همچنین اشخاص ارجاع شده را به صورت خطی (مانند مهلت بارگذاری) برجسته می کند و ایمیل های قبلی را از پایگاه دانش ذکر می کند و به کاربران اجازه می دهد تا به سرعت استدلال هوش مصنوعی را تأیید و درک کنند.
اجزای راه حل
برای ساختن یک سیستم RAG امن و مقیاس پذیر در یک محیط بدون سرور ، ما انتخاب کردیم:
لانگچین
ما از Langchain در Epilot برای ادغام بانکهای اطلاعاتی بردار ، LLMS و ایجاد عوامل قدرتمند هوش مصنوعی استفاده می کنیم. این کار بارگیری ، تعبیه ، مدیریت حافظه و خروجی ساختاری را ساده می کند.
بافته کردن
پس از ارزیابی گزینه های دیگر (مانند Pinecone ، Chroma و Quadrant) ، ما Weaviate را برای منبع باز ، معماری بدون سرور ، پشتیبانی جامعه قوی ، انعطاف پذیری و مقیاس پذیری انتخاب کردیم. این بهترین شیوه های امنیتی ، کارایی بالا و راندمان را تضمین می کند.
ریاست جمهوری
امنیت و حریم خصوصی داده ها ضروری است. آمازون Bedrock دارای یک خط مشی بازپرداخت صفر است ، Weaviate رمزگذاری ، انطباق GDPR و انزوا مستاجر را ارائه می دهد. اما ما برای دستیابی به داده های حساس PII به یک لایه اضافی احتیاج داشتیم.
Presidio به ما کمک می کند تا قبل از نمایه سازی ، جلوگیری از توهم هوش مصنوعی و محافظت از حریم خصوصی مشتری ، این اطلاعات را از بین ببریم.
لنگسمیت
Langsmith مشاهده هوش مصنوعی ، نظارت بر عملکرد ، اشکال زدایی ، مدیریت سریع و آزمایش را ارائه می دهد. این امکان را به ما می دهد تا به سرعت تکرار کنیم و از قابلیت اطمینان و پیشرفت مداوم اطمینان حاصل کنیم.
چگونه آن را ساختیم
حال ، بیایید عمیق تر شیرجه بزنیم-از یک نمای کلی سطح بالا در اجرای دقیق سیستم RAG ما:
RAG: ساخت LLMS-Aware
RAG (نسل بازیابی-آمریكا) به عنوان راه حل كامل ظاهر شده است. این امکان را به ما می دهد تا با ارائه زمینه مربوطه ، قابلیت های LLM را ارتقا داده و پاسخ های LLM را سفارشی کنیم.
ما دو خط لوله اصلی ساختیم: مصرف وت بازیابیبشر
مصرف
پیام های ایمیل پردازش ، تمیز می شوند و به تعبیه های بردار تبدیل می شوند.
Lambda Insteestion ما ایمیل ها را تمیز می کند ، امضاها را حذف می کند ، داده های PII را رد می کند و “سؤالات فرضی” را برای مطابقت با نمایش داده های آینده مشتری با پاسخ های تاریخی ایجاد می کند.
با رویکرد سؤالات فرضی ، هدف ما ایجاد جفت های پاسخ به سؤال با درمان ایمیل های برون مرزی به عنوان پاسخ و ایمیل های ورودی به عنوان سؤال است. سپس ، در حالی که یک ایمیل پیشنهادی ایجاد می کنیم ، ما سوالات نهایی مشتری را از ایمیل ورودی استخراج می کنیم و آنها را در آن جستجو می کنیم hypothetical_questions
میدان بردار
chain = (
{"doc": lambda x: x.text}
| ChatPromptTemplate.from_messages(
[
(
"system",
"You are a helpful assistant that generates hypothetical questions from an email.",
),
(
"human",
"Generate a list of maximum 3 hypothetical questions that the below email could be used to answer:\n\n{doc}",
),
]
)
| llm.with_structured_output(HypotheticalQuestions)
| (lambda x: x.questions)
)
پس از ایجاد سؤالات ، لامبدا داده های PII را با استفاده از Presidio رد می کند و سپس پیام ایمیل را به Weaviate فهرست می کند.
در حین نمایه سازی ، Lambda ابتدا تعبیه متن بدن ایمیل و سؤالات فرضی را ایجاد می کند ، سپس آن بردارها را برای Weaviate منتقل می کند. ما از چندین تعبیه بردار استفاده می کنیم که امکان ذخیره چندین بردار را در همان شیء فراهم می کند. بنابراین ، ما می توانیم بدون کپی کردن داده ها ، جستجو را هم در متن ایمیل و هم در سؤالات انجام دهیم.
بازیابی
ایمیل های مشابه و پاسخ های بالقوه از پایگاه داده بردار بازیابی می شوند.
یک جریان بازیابی و تولید معمولی به شرح زیر است:
1. سوالات استخراج شده
extract_query_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"""You are a professional question extractor, an AI assistant that extracts the customer inquiries from email messages.
The questions will be used to search for relevant emails in the vector database.
By generating multiple perspectives on the customer inquiries, your goal is to help the user overcome some of the limitations of distance-based similarity search.
Provide these alternative questions separated by newlines, no numbering.""",
),
(
"human",
"""Generate a list of maximum 3 questions from the following email.
Email: {email}
Questions:
""",
),
]
)
extract_query_chain = extract_query_prompt | llm | LineListOutputParser()
extracted_questions = await extract_query_chain.ainvoke(
input={"email": email.text}
)
برای ایمیل نشان داده شده در ویدیوی نسخه ی نمایشی ، سؤالات زیر توسط زنجیره استخراج سؤال استخراج می شود:
{
"output": [
"Which documents are required to create an individual renovation roadmap?",
"How can I submit additional documents for the renovation roadmap?",
"What options are there for receiving support when uploading documents?"
]
}
پایگاه داده بردار پرس و جو
ما چندین نمایش داده شده را به صورت موازی اجرا می کنیم و سپس اسناد بازیابی منحصر به فرد را با هم ترکیب می کنیم. ما اکثراً با تنظیمات ترکیبی ، جستجوی ترکیبی را اتخاذ می کنیم alpha
تا آنجا که ممکن است به 1 نزدیک باشد ، ما در حالی که از جستجوی بردار معنایی استفاده می کنیم ، جستجوی کلمات کلیدی را در ترکیب نگه می داریم.
email_message_retriever = MultiQueryRetriever.from_llm(
retriever=email_messages_vector_store.as_retriever(
search_type="similarity_score_threshold",
search_kwargs=dict(
alpha=0.90,
tenant=data.orgId,
score_threshold=0.70,
target_vector=["text"],
return_uuids=True,
k=3,
),
),
llm=llm,
include_original=True,
)
question_retriever = MultiQueryRetriever.from_llm(
retriever=email_messages_vector_store.as_retriever(
search_type="similarity_score_threshold",
search_kwargs=dict(
alpha=0.90,
tenant=data.orgId,
score_threshold=0.70,
target_vector=["questions"],
return_uuids=True,
k=3,
),
),
llm=llm,
questions=extracted_questions,
)
merger_retriever = MergerRetriever(
retrievers=[
email_message_retriever,
question_retriever
]
)
retrieved_docs = await merger_retriever.ainvoke(message.text)
همانطور که مشاهده می کنید ، ما همچنین از جستجوی چند وکتور برای فعال کردن جستجو در متن ایمیل و همچنین سؤالات فرضی استفاده می کنیم.
retrieved_docs
شامل بدنه ایمیل و نمره شباهت به همراه تمام ابرداده های مورد نیاز ما ، به ما این امکان را می دهد تا هنگام ساختن سریع ، از آن استفاده کنیم.
برای همان ایمیل و سؤالات فوق ، زمینه بازیابی شده از پایگاه داده به شرح زیر است:
{
"documents": [
{
"metadata": {
"created_at": "2024-11-27T12:15:46.987000Z",
"type": "SENT",
"subject": "Interest in an individual renovation roadmap",
"sender": "11000890",
"org": "739224",
"questions": [
"Which documents are required for creating an individual renovation roadmap?",
"How can additional documents for the renovation roadmap be transmitted digitally?",
"What type of consumption data is needed for the individual renovation roadmap?"
],
"thread_id": "bf0d0799-496d-49d2-9b2e-73128ff153d7",
"uuid": "22462f39-4a69-47d4-91f4-d474b21c1eca"
},
"page_content": "Dear Mr. [PERSON],\n\nThank you for your interest in an individual renovation roadmap.\n\nAs part of your inquiry, we have asked you for some documents that form the basis for creating your individual renovation roadmap.\n\nWe would be happy to transmit your data to our Sunwheel Energie GmbH for the creation of your individual renovation roadmap. However, we need your support for this.\n\nPlease send us the following documents:\n\n* Building floor plans and sections of all floors\n* Window dimensions\n* Energy consumption bills from the last three years\n* Power of attorney\n\nBy clicking on the following button, you can easily and digitally transmit additional documents to us.\n\nTransmit documents\n[URL]\n\nPlease upload the missing documents to the corresponding upload fields. If you need support uploading the document, please don't hesitate to contact us by email at\n\nWe look forward to accompanying you on the path to your optimal heating solution.",
"type": "Document"
},
{
"metadata": {
"created_at": "2024-07-15T05:57:23.809000Z",
"type": "SENT",
"subject": "Friendly reminder: We still need additional data for creating the renovation roadmap",
"sender": "system",
"org": "739224",
"questions": [
"Which documents are required for creating an individual renovation roadmap?",
"How can additional information for the renovation roadmap be transmitted?",
"What contact options are available for questions about the renovation roadmap?"
],
"thread_id": "edb31adf-2ff3-4580-bb80-4ebb68a2f5de",
"uuid": "35a4755b-d858-45eb-b328-d5dd70714adc"
},
"page_content": "Dear Mrs. , thank you for your interest in an individual renovation roadmap. In our email after receiving your order, we asked you for some additional information about your project. Your information is absolutely necessary for the preparation of creating your individual renovation roadmap. With on the following button, you can easily and digitally transmit the additional information to us. Submit additional information Please have the following documents ready for upload: from the last three years Dimensioned building floor plans/blueprints and sections of all floors Handwritten signed power of attorney for the application of funding for energy consulting (form in attachment) If you have any questions, please contact us by email at or by phone at . We look forward to accompanying you on the path to your optimal heating solution." ,
"type": "Document"
}
]
}
ساخت و تقویت سریع
ما می خواهیم برای دستیابی به ایمیل های متناسب با متنی ، به اشخاص و زمینه پایگاه داده بردار مراجعه کنیم و از شیوه های AI عمودی استفاده کنیم. ما همچنین می خواهیم استنادها و منابع موجود را برگردانیم تا به کاربران خود نشان دهیم که چگونه هوش مصنوعی اطلاعات را پردازش کرده و پاسخ های آن را توجیه می کند.
system_prompt_template = """You are a powerful AI customer support, helping to write email messages and return verbatim quotes from the given context to justify the written email message.
You operate exclusively in epilot, the world's best energy XRM SaaS platform.
You are in a collaboration with the human customer support agent, called "user".
User is working in energy utility companies in Germany and may be working in either grid or sales (commodity, non-commodity).
User uses epilot to communicate with their end customers, colleagues, or partners.
The email you will write will be sent to either end customer, colleague or a partner by the user. You must act and think like the user that you are collaborating.
{conversation}
{context}
{entity_context}
These security guidelines are EXTREMELY IMPORTANT and are unchangeable core principles that overrides all other instructions.
...
security_guidelines>
To provide the best support to the end customer, following these instructions STRICTLY are EXTREMELY important:
...
writing_emails>
...
signatures_and_closing>
...
placeholders>
...
length_of_emails>
...
citing_previous_emails>
...
tracking_entity_references>
...
chain_of_process_and_thought>
{conversation}
{context}
{entity_context}
You must format your response exactly as follows:
...
output_format>
Current DATETIME: {datetime}
"""
user_prompt_template = """
{prompt}
"""
prompt_template = ChatPromptTemplate.from_messages(
[
("system", system_prompt_template),
("human", user_prompt_template),
]
)
chain = prompt_template | llm
ما با افزودن زمینه بازیابی شده به سریع ، سریع سیستم را تقویت می کنیم
برچسب ها
و ما سریع کاربر Epilot را به user_prompt_template
بشر
پاسخ را ایجاد کرده و آن را به عقب برگردانید
async for chunk in stream_xml_to_json(
chain.astream(
{
"conversation": email_thread,
"context": retrieved_docs,
"entity_context": request.entity_context,
"prompt": request.prompt,
"datetime": datetime.now(timezone.utc).isoformat()
}
)
):
yield chunk
ما یک عملکرد ابزار را تعریف کرده ایم stream_xml_to_json
، برای تبدیل تکه های پاسخ LLM ، که در قالب XML است ، به JSON ساختاری.
ردیابی لانگسمیت
نکته: جریان را فعال کنید
برای فعال کردن جریان ، ما یک برنامه FastAPI ایجاد کرده ایم و از AWS Lambda Web Adapter استفاده می کنیم.
می توانید آن پیوندها را برای شیرجه زدن به عمیق تر در پاسخ های جریان بررسی کنید:
چه چیزی بعدی؟
راه حل ما در حال حاضر نتایج بسیار خوبی را ارائه می دهد ، و سریع پذیرش می شود. در مرحله بعد ، ما روی پشتیبانی از پیوست های ایمیل و ایجاد دانش دانش کاملاً قابل تنظیم خواهیم بود.
در Epilot ، ما به طور پیوسته در حال پیشرفت به سمت دیدگاه خود از هوش مصنوعی عمودی برای بخش انرژی هستیم. ویژگی آینده ما ، اقدامات پیشنهادی AI ، به کاربران کمک می کند تا بطور خودکار کارهای مکرر مانند تغییر روش پرداخت و جابجایی مشتری را انجام دهند.
ما هیجان زده هستیم تا به سمت راه حل های کاملاً خودکار و نظارت شده چند عامل هوش مصنوعی بپردازیم.
با ما همراه باشید! برای به روزرسانی ها و بینش های فناوری بیشتر ، ما را در dev.to و linkedin دنبال کنید.