عوامل الذكاء الاصطناعى هي آلات دولة وليست داجس
تتيح آلات التوليف للمستخدمين إنشاء وتشغيل آلات حالة وكيل AI ( Synth ) من خلال توفير SynthDefinition لتحديد سير عمل منظم منظمة AI.
تعد آلات الدولة بناءًا قويًا لأنها تمكن خبير المجال من تفكيك المشكلة في مجموعات من الحالات والتحولات.
يمكن للتحولات بين الحالات بعد ذلك استدعاء LLM أو الأداة أو عملية البيانات أو مزيج من العديد من المخرجات.
تثبيت الحزمة. pip install synth_machine[openai,togetherai,anthropic] أو poetry add synth_machine[openai,togetherai,anthropic]
أضف إما إعداد مفاتيح البيئة من API الخاصة بك والتي
# You only need to set the API providers you want to use.
export OPENAI_API_KUY=secret
export ANTHROPIC_API_KEY=secret
export TOGETHER_API_KEY=secret
pip install synth_machine[vllm,llamacpp] أو poetry add synth_machine[vllm,llamacpp]
من المحتمل أن تحتاج إلى إعداد CUDA أو VLLM أو llama.cpp للاستخدام المحلي.
روابط مفيدة:
agent = Synth(
config: dict[SynthDefinition], # Synth state machine defining states, transitions and prompts.
tools=[], # List of tools the agent will use
memory={}, # Any existing memory to add on top of any model_config.initial_memory
rag_runner: Optional[RAG] = None # Define a RAG integration for your agent.
postprocess_functions = [] # Any glue code functions
store : ObjectStore = ObjectStore(":memory:") # Any files created by tools will automatically go to you object store
يمكن العثور على SynthDefinition في مستندات synthDefinition أو synth_machine/synth_definition.py. ستكون عوامل القاعدة الأطلسية التي تشكل SynthDefinition التمثيل الأكثر دقة Synth .
نتوقع أن يكون للمواصفات تحديثات بين الإصدارات الرئيسية.
في أي وقت ، يمكنك التحقق من الحالة الحالية والمشغلات التالية
# Check state
agent.current_state()
# Triggers
agent.interfaces_for_available_triggers()
await agent.trigger(
"[trigger_name]",
params={
"input_1": "hello"
}
)
ستؤدي مكالمات انتقال الدُفعات إلى إخراج أي متغير إخراج تم إنشاؤه في هذا الانتقال.
await agent.streaming_trigger(
"[trigger_name]",
params={
"input_1": "hello"
}
)
تستجيب استجابات التدفق أيًا من الأحداث التالية:
class YieldTasks(StrEnum):
CHUNK = "CHUNK"
MODEL_CONFIG = "MODEL_CONFIG"
SET_MEMORY = "SET_MEMORY"
SET_ACTIVE_OUTPUT = "SET_ACTIVE_OUTPUT"
CHUNK : يتم إرسال أجيال LLM بواسطة قطع واحدة في وقت واحد.MODEL_CONFIG : غلة يتم استخدام المنفذ حاليًا لأي واجهات أمامية محددة للمزود.SET_MEMORP : يرسل الأحداث إعداد متغيرات ذاكرة جديدةSET_ACTIVE_OUTPUT : ينتج عن مشغل إخراج الانتقال الحالي. يتيح هذا للمستخدمين التجربة باستخدام trigger ثم الاندماج في أجيال LLM في الوقت الفعلي للمستخدمين الذين يستخدمون أحداث جانب الخادم (SSE) و trigger_streaming .
نحن نقدم العديد من المنفذين لإنشاء إكمال دردشة LLM المحلية أو API.
openai : https://openai.com/api/pricing/togetherai : https://docs.together.ai/docs/inference-modelsanthropic : https://docs.anthropic.com/en/docs/models-overviewgoogle : https://cloud.google.com/vertex-ai/generiative-ai/docs/multimodal/overview VLLM : https://github.com/vllm-project/vllmLlama-CPP : https://github.com/ggerganov/llama.cpp Model Config يمكنك تحديد الموفر والنموذج في إما default-model-config التوليف أو model_config عند إخراج الانتقال.
ModelConfig:
...
executor: [openai|togetherai|anthropic|vllm|llamacpp]
llm_name: [model_name]
ذاكرة الوكيل هي قاموس يحتوي على جميع المتغيرات المؤقتة في الحالات السابقة ومدخلات الإنسان / النظام.
agent.memory
# -> {
# "[memory_key]": [memory_value]
# }
يجب استخدام وظائف Postprocess فقط لرمز الغراء الأساسي ، وينبغي أن تكون جميع الوظائف الرئيسية مدمجة في أدوات.
انتقل إلى "./tools/tofuTool/api.py لعرض الوظيفة.
ابدأ API
cd tools/tofuTool
poetry install
poetry run uvicorn api:app --port=5001 --reload
استرداد مواصفات API
curl -X GET http://localhost:5001/openapi.json > openapi_schema.json
تحديد الأداة
يمكنك تحديد أداة على هذا النحو فقط مع مخطط نهاية API و API ومخطط OpenAPI للأداة.
tofu_tool = Tool(
name="tofu_tool",
api_endpoint="http://localhost:5001",
api_spec=tool_spec
)
يعد توليد عمليات الاسترجاع أداة قوية لتحسين استجابات LLM من خلال توفير أمثلة أو تمارس مماثلة للمواد التي تحاول LLM توليدها.
synth_machine مرن في أنه طالما ترث من synth_machine.RAG وإنشاء:
embed(documents: List[str]) وquery(prompt: str, rag_config: Optional[synth_machine.RAGConfig])من السهل دمج العديد من مقدمي الخدمات وقواعد بيانات المتجهات. مع مرور الوقت ، سيتم دعم تطبيقات خرقة المجتمع عبر مجموعة واسعة من مقدمي التضمين وقواعد بيانات المتجهات.
تعد فئة الخرقة التالية مثالية لتجربة إعدادات الخرقة المحلية على وحدة المعالجة المركزية.
pip install qdrant-client, fastembed
تحديد فئة خرقة
from synth_machine.rag import RAG
from qdrant_client import AsyncQdrantClient
from fastembed import TextEmbedding
from typing import List, Optional
from qdrant_client.models import Distance, VectorParams, PointStruct
class Qdrant(RAG):
"""
VectorDB: Qdrant - https://github.com/qdrant/qdrant
Embeddings: FastEmbed - https://github.com/qdrant/fastembed
This provides fast and lightweight on-device CPU embeddings creation and
similarity search using Qdrant in memory.
"""
def __init__(
self,
collection_name: str,
embedding_model: str="BAAI/bge-small-en-v1.5",
embedding_dimensions: int=384,
embedding_threads: int=-1,
qdrant_location: str=":memory:",
):
self.embedding_model = TextEmbedding(
model_name=embedding_model,
threads=embedding_threads
)
self.embedding_dimensions = embedding_dimensions
self.qdrant = AsyncQdrantClient(qdrant_location)
self.collection_name = collection_name
async def create_collection(self) -> bool:
if await self.qdrant.collection_exists(self.collection_name):
return True
else:
return await self.qdrant.create_collection(
collection_name=self.collection_name,
vectors_config=VectorParams(
size=self.embedding_dimensions, # maps to 'BAAI/bge-small-en-v1.5' model dimensions
distance=Distance.COSINE
)
)
async def embed(self, documents: List[str], metadata: Optional[List[dict]]=None):
if metadata and len(documents) != len(metadata):
raise ValueError("documents and metadata must be the same length")
embedding_list = list(
self.embedding_model.embed(documents)
)
upsert_response = await self.qdrant.upsert(
collection_name=self.collection_name,
points=[
PointStruct(
id=i,
vector=list(vector),
payload=metadata[i]
)
for i, vector in enumerate(embedding_list)
]
)
return upsert_response.status
async def query(self, prompt: str, rag_config: RAGConfig) -> List[dict]:
embedding = next(self.embedding_model.embed([prompt]))
similar_responses = await self.qdrant.search(
collection_name=self.collection_name,
query_vector=embedding,
limit=rag_config.n
)
return [
point.payload for point in similar_responses
]
ابدأ الآن فئة QDrant وتوفير عند تحديد Synth .
qdrant = Qdrant(collection_name="tofu_examples")
await qdrant.create_collection()
agent = Synth(
...
rag_runner=Qdrant
)
يمكن للأدوات إرجاع مجموعة متنوعة من الكائنات المختلفة. أي ملف تم إنشاؤه بواسطة أداة سوف ينتقل تلقائيًا إلى agent.store . نستخدم ObjectStore لتخزين الملفات ، مع ObjectStore(":memory:") كإعداد افتراضي.
لاسترداد ملف: agent.store.get(file_name)
ObjectStore يسمح بسهولة التكامل مع:
from synth_machine.machine import ObjectStore
agent = Agent(
...
store=ObjectStore("gs://[bucket_name]/[prefix]))
)
يمكن تعريف أي وظيفة مخصصة كدالة محددة للمستخدم (UDF).
هذه تأخذ Synth.memory كمدخلات وتتيح لك تشغيل وظائف مخصصة كجزء من synth-machine .
# Define postprocess function
from synth_machine.user_defined_functions import udf
@udf
def abc_postprocesss(memory):
...
return memory["variable_key"]
agent = Synth(
...
user_defined_functions = {
"abc": abc_postprocess
}
)
...
- key: trigger_udf
inputs:
- key: variable_key
outputs:
- key: example_udf
udf: abc
ملاحظة: يجب أن تكون أي وظيفة غير تافهة أداة وليس UDF.