يسعدنا تقديم واجهة برمجة تطبيقات الرسائل لتوفير توافق OpenAI مع استدلال إنشاء النص (TGI) ونقاط نهاية الاستدلال.
بدءًا من الإصدار 1.4.0، تقدم TGI واجهة برمجة تطبيقات متوافقة مع واجهة برمجة تطبيقات OpenAI Chat Completion API. تسمح واجهة برمجة تطبيقات الرسائل الجديدة للعملاء والمستخدمين بالانتقال بسلاسة من نماذج OpenAI إلى LLMs المفتوحة. يمكن استخدام واجهة برمجة التطبيقات مباشرة مع مكتبات عملاء OpenAI أو أدوات الطرف الثالث، مثل LangChain أو LlamaIndex.
“تسهل واجهة برمجة تطبيقات الرسائل الجديدة المتوافقة مع OpenAI على منصة تنسيق GenAI في Ryght في الوقت الفعلي تحويل حالات استخدام LLM من OpenAI إلى النماذج المفتوحة. إن ترحيلنا من GPT4 إلى Mixtral/Llama2 على Inference Endpoints هو أمر سهل، والآن لدينا سير عمل مبسط مع مزيد من التحكم في حلول الذكاء الاصطناعي لدينا.” – جوني كروبي، المدير التنفيذي للتكنولوجيا في Ryght
واجهة برمجة تطبيقات الرسائل الجديدة متاحة الآن أيضًا في Inference Endpoints، على كلا الطرازين المخصصين وبدون خادم. لمساعدتك على البدء سريعًا، قمنا بتضمين أمثلة تفصيلية حول كيفية القيام بما يلي:
القيود: لا تدعم واجهة برمجة تطبيقات الرسائل حاليًا استدعاء الوظائف وستعمل فقط مع حاملي شهادات LLM الذين لديهم نطاق chat_template المحددة في تكوين الرمز المميز الخاص بها، كما في حالة تعليمات Mixtral 8x7B.
إنشاء نقطة نهاية الاستدلال
توفر Inference Endpoints حلاً إنتاجيًا آمنًا لنشر أي نموذج تعلم آلي بسهولة من Hub على بنية تحتية مخصصة تديرها Hugging Face.
في هذا المثال، سنقوم بنشر Nous-Hermes-2-Mixtral-8x7B-DPO، وهو نموذج Mixtral مضبوط بدقة، لاستنباط نقاط النهاية باستخدام استدلال إنشاء النص.
يمكننا نشر النموذج ببضع نقرات فقط من واجهة المستخدم، أو الاستفادة من huggingface_hub مكتبة Python لإنشاء وإدارة نقاط نهاية الاستدلال برمجيًا. نوضح استخدام مكتبة Hub هنا.
في استدعاء واجهة برمجة التطبيقات (API) الموضح أدناه، نحتاج إلى تحديد اسم نقطة النهاية ومستودع النموذج، بالإضافة إلى مهمة text-generation. في هذا المثال نستخدم أ protected اكتب، لذا فإن الوصول إلى نقطة النهاية المنشورة سيتطلب رمزًا صالحًا لـ Hugging Face. نحتاج أيضًا إلى تكوين متطلبات الأجهزة مثل البائع والمنطقة والمسرع ونوع المثيل والحجم. يمكنك التحقق من قائمة خيارات الموارد المتاحة باستخدام استدعاء API هذا، وعرض التكوينات الموصى بها لنماذج مختارة في الكتالوج الخاص بنا هنا.
ملاحظة: قد تحتاج إلى طلب ترقية الحصة عن طريق إرسال بريد إلكتروني إلى api-enterprise@huggingface.co
from huggingface_hub import create_inference_endpoint
endpoint = create_inference_endpoint(
"nous-hermes-2-mixtral-8x7b-demo",
repository="NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
framework="pytorch",
task="text-generation",
accelerator="gpu",
vendor="aws",
region="us-east-1",
type="protected",
instance_type="nvidia-a100",
instance_size="x2",
custom_image=
"health_route": "/health",
"env":
"MAX_INPUT_LENGTH": "4096",
"MAX_BATCH_PREFILL_TOKENS": "4096",
"MAX_TOTAL_TOKENS": "32000",
"MAX_BATCH_TOTAL_TOKENS": "1024000",
"MODEL_ID": "/repository",
,
"url": "ghcr.io/huggingface/text-generation-inference:sha-1734540",
,
)
endpoint.wait()
print(endpoint.status)
سوف يستغرق الأمر بضع دقائق حتى يتم نشرنا. يمكننا استخدام .wait() أداة مساعدة لحظر مؤشر الترابط قيد التشغيل حتى تصل نقطة النهاية إلى حالة “التشغيل” النهائية. بمجرد تشغيله، يمكننا تأكيد حالته وأخذه في جولة عبر ساحة واجهة المستخدم:
عظيم، لدينا الآن نقطة نهاية العمل!
💡 عند النشر مع
huggingface_hub، سيتم تغيير حجم نقطة النهاية الخاصة بك إلى الصفر بعد 15 دقيقة من وقت الخمول افتراضيًا لتحسين التكلفة أثناء فترات عدم النشاط. راجع وثائق مكتبة Hub Python للاطلاع على جميع الوظائف المتاحة لإدارة دورة حياة نقطة النهاية لديك.
استخدام نقاط النهاية الاستدلالية مع مكتبات عملاء OpenAI
دعم الرسائل في TGI يجعل نقاط نهاية الاستدلال متوافقة مباشرة مع OpenAI Chat Completion API. وهذا يعني أن أي نصوص برمجية موجودة تستخدم نماذج OpenAI عبر مكتبات عملاء OpenAI يمكن تبديلها مباشرة لاستخدام أي LLM مفتوح يعمل على نقطة نهاية TGI!
من خلال هذا الانتقال السلس، يمكنك الاستفادة على الفور من المزايا العديدة التي توفرها النماذج المفتوحة:
- السيطرة الكاملة والشفافية على النماذج والبيانات
- لا مزيد من القلق بشأن حدود المعدل
- القدرة على تخصيص الأنظمة بالكامل وفقًا لاحتياجاتك المحددة
دعونا نرى كيف.
مع عميل بايثون
يوضح المثال أدناه كيفية إجراء هذا النقل باستخدام مكتبة OpenAI Python. ببساطة استبدل <ENDPOINT_URL> باستخدام عنوان URL لنقطة النهاية الخاصة بك (تأكد من تضمين v1/ لاحقة) وملء <HF_API_TOKEN> الحقل باستخدام رمز مستخدم Hugging Face صالح. ال <ENDPOINT_URL> يمكن جمعها من واجهة مستخدم Inference Endpoints، أو من كائن نقطة النهاية الذي أنشأناه أعلاه endpoint.url.
يمكننا بعد ذلك استخدام العميل كالمعتاد، من خلال تمرير قائمة الرسائل لتدفق الردود من نقطة نهاية الاستدلال الخاصة بنا.
from openai import OpenAI
client = OpenAI(
base_url="<ENDPOINT_URL>" + "/v1/",
api_key="<HF_API_TOKEN>",
)
chat_completion = client.chat.completions.create(
model="tgi",
messages=[
"role": "system", "content": "You are a helpful assistant.",
"role": "user", "content": "Why is open-source software important?",
],
stream=True,
max_tokens=500
)
for message in chat_completion:
print(message.choices[0].delta.content, end="")
خلف الكواليس، تقوم واجهة برمجة تطبيقات الرسائل الخاصة بـ TGI تلقائيًا بتحويل قائمة الرسائل إلى تنسيق التعليمات المطلوب للنموذج باستخدام قالب الدردشة الخاص به.
💡 بعض ميزات OpenAI، مثل استدعاء الوظائف، غير متوافقة مع TGI. حاليًا، تدعم واجهة برمجة التطبيقات للرسائل معلمات إكمال الدردشة التالية:
stream,max_tokens,frequency_penalty,logprobs,seed,temperature، وtop_p.
مع عميل جافا سكريبت
إليك نفس مثال البث أعلاه، ولكن باستخدام مكتبة OpenAI Javascript/Typescript Library.
import OpenAI from "openai";
const openai = new OpenAI(
baseURL: "<ENDPOINT_URL>" + "/v1/",
apiKey: "<HF_API_TOKEN>",
);
async function main()
const stream = await openai.chat.completions.create(
model: "tgi",
messages: [
role: "system", content: "You are a helpful assistant." ,
role: "user", content: "Why is open-source software important?" ,
],
stream: true,
max_tokens: 500,
);
for await (const chunk of stream)
process.stdout.write(chunk.choices[0]?.delta?.content
main();
التكامل مع LangChain وLlamaIndex
الآن، دعونا نرى كيفية استخدام نقطة النهاية التي تم إنشاؤها حديثًا مع إطار عمل RAG المفضل لديك.
كيفية الاستخدام مع LangChain
لاستخدامه في LangChain، ما عليك سوى إنشاء مثيل لـ ChatOpenAI وتمرير الخاص بك <ENDPOINT_URL> و <HF_API_TOKEN> على النحو التالي:
from langchain_community.chat_models.openai import ChatOpenAI
llm = ChatOpenAI(
model_name="tgi",
openai_api_key="<HF_API_TOKEN>",
openai_api_base="<ENDPOINT_URL>" + "/v1/",
)
llm.invoke("Why is open-source software important?")
نحن قادرون على الاستفادة من نفس الشيء بشكل مباشر ChatOpenAI فئة كنا سنستخدمها مع نماذج OpenAI. يسمح هذا لجميع التعليمات البرمجية السابقة بالعمل مع نقطة النهاية الخاصة بنا عن طريق تغيير سطر واحد فقط من التعليمات البرمجية. دعونا الآن نستخدم LLM المعلن بهذه الطريقة في مسار RAG البسيط للإجابة على سؤال حول محتويات منشور مدونة HF.
from langchain_core.runnables import RunnableParallel
from langchain_community.embeddings import HuggingFaceEmbeddings
loader = WebBaseLoader(
web_paths=("https://huggingface.co/blog/open-source-llms-as-agents",),
)
docs = loader.load()
hf_embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-large-en-v1.5")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=hf_embeddings)
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt")
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain_from_docs = (
RunnablePassthrough.assign(context=(lambda x: format_docs(x["context"])))
| prompt
| llm
| StrOutputParser()
)
rag_chain_with_source = RunnableParallel(
"context": retriever, "question": RunnablePassthrough()
).assign(answer=rag_chain_from_docs)
rag_chain_with_source.invoke("According to this article which open-source model is the best for an agent behaviour?")
"context": [...],
"question": "According to this article which open-source model is the best for an agent behaviour?",
"answer": " According to the article, Mixtral-8x7B is the best open-source model for agent behavior, as it performs well and even beats GPT-3.5. The authors recommend fine-tuning Mixtral for agents to potentially surpass the next challenger, GPT-4.",
كيفية الاستخدام مع LlamaIndex
وبالمثل، يمكنك أيضًا استخدام نقطة نهاية TGI في LlamaIndex. سوف نستخدم OpenAILike فئة، وإنشاء مثيل لها عن طريق تكوين بعض الوسائط الإضافية (على سبيل المثال is_local, is_function_calling_model, is_chat_model, context_window). لاحظ أن وسيطة نافذة السياق يجب أن تتطابق مع القيمة التي تم تعيينها مسبقًا MAX_TOTAL_TOKENS من نقطة النهاية الخاصة بك.
from llama_index.llms import OpenAILike
llm = OpenAILike(
model="tgi",
api_key="<HF_API_TOKEN>",
api_base="<ENDPOINT_URL>" + "/v1/",
is_chat_model=True,
is_local=False,
is_function_calling_model=False,
context_window=32000,
)
llm.complete("Why is open-source software important?")
يمكننا الآن استخدامه في خط أنابيب RAG مماثل. ضع في اعتبارك أن الاختيار السابق لـ MAX_INPUT_LENGTH في نقطة نهاية الاستدلال الخاصة بك سوف تؤثر بشكل مباشر على عدد القطعة المستردة (similarity_top_k) يمكن معالجة النموذج.
from llama_index import (
ServiceContext,
VectorStoreIndex,
)
from llama_index import download_loader
from llama_index.embeddings import HuggingFaceEmbedding
from llama_index.query_engine import CitationQueryEngine
SimpleWebPageReader = download_loader("SimpleWebPageReader")
documents = SimpleWebPageReader(html_to_text=True).load_data(
["https://huggingface.co/blog/open-source-llms-as-agents"]
)
embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-large-en-v1.5")
service_context = ServiceContext.from_defaults(embed_model=embed_model, llm=llm)
index = VectorStoreIndex.from_documents(
documents, service_context=service_context, show_progress=True
)
query_engine = CitationQueryEngine.from_args(
index,
similarity_top_k=2,
)
response = query_engine.query(
"According to this article which open-source model is the best for an agent behaviour?"
)
According to the article, Mixtral-8x7B is the best performing open-source model for an agent behavior [5]. It even beats GPT-3.5 in this task. However, it's worth noting that Mixtral's performance could be further improved with proper fine-tuning for function calling and task planning skills [5].
تنظيف
بعد الانتهاء من نقطة النهاية الخاصة بك، يمكنك إما إيقافها مؤقتًا أو حذفها. يمكن إكمال هذه الخطوة عبر واجهة المستخدم، أو برمجيًا كما يلي.
endpoint.pause()
endpoint.delete()
خاتمة
توفر واجهة برمجة تطبيقات الرسائل الجديدة في استدلال إنشاء النص مسارًا انتقاليًا سلسًا من نماذج OpenAI إلى LLMs المفتوحة. لا يمكننا الانتظار لنرى حالات الاستخدام التي ستعمل على تشغيلها من خلال LLMs المفتوحة التي تعمل على TGI!
راجع دفتر الملاحظات هذا للحصول على نسخة قابلة للتشغيل من الكود الموضح في المنشور.