# مثال تعریف یک تابع در LangChain
from langchain.tools import tool
@tool
def search_database(query: str, filters: dict = None) -> str:
"""
جستجو در پایگاهداده سازمانی
Args:
query: متن جستجو
filters: فیلترهای اختیاری (مثلاً {"date": "2024-01-01"})
Returns:
نتایج جستجو به صورت JSON
"""
# پیادهسازی واقعی
return search_results
from langchain_community.llms import HuggingFaceEndpoint
llm = HuggingFaceEndpoint(
endpoint_url="https://YOUR-ENDPOINT.aws.endpoints.huggingface.cloud",
huggingfacehub_api_token="YOUR_TOKEN",
task="text-generation",
model_kwargs={"max_new_tokens": 512, "temperature": 0.7}
)
# اسکلت سادهای از یک ایجنت با LangChain
from langchain.agents import initialize_agent, AgentType
from langchain.tools import tool
from langchain_openai import ChatOpenAI # یا HuggingFaceEndpoint برای مدل متنباز
# تعریف یک ابزار ساده
@tool
def db_lookup(query: str) -> str:
"""جستجو در پایگاهداده داخلی برای یافتن اسناد مرتبط"""
# پیادهسازی واقعی جستجو
results = search_internal_docs(query)
return f"یافت شد: {len(results)} سند مرتبط\n{results}"
@tool
def web_search(query: str) -> str:
"""جستجو در وب برای یافتن اطلاعات بهروز"""
# فراخوانی API جستجو
results = call_search_api(query)
return format_search_results(results)
# تعریف LLM
llm = ChatOpenAI(
model="gpt-4o-mini", # یا مدل متنباز معادل
temperature=0, # برای نتایج قابل تکرار
)
# ایجاد ایجنت با الگوی ReAct
agent = initialize_agent(
tools=[db_lookup, web_search],
llm=llm,
agent=AgentType.REACT_DESCRIPTION,
verbose=True, # برای دیدن Thought/Action/Observation
max_iterations=5, # حداکثر تعداد چرخه
early_stopping_method="generate"
)
# اجرای ایجنت
response = agent.run(
"قوانین استخدام شرکت ما چیست؟ منابع داخلی و خارجی را بررسی کن."
)
print(response)
@tool
def enhanced_web_search(query: str, max_results: int = 5) -> str:
"""
جستجوی پیشرفته در وب با فیلترینگ و خلاصهسازی
"""
# جستجو با محدودیت
raw_results = search_api.search(
query=query,
num_results=max_results,
allowed_domains=TRUSTED_DOMAINS
)
processed_results = []
for result in raw_results:
# استخراج محتوای اصلی
content = extract_main_content(result.url)
# خلاصهسازی
summary = llm.summarize(
content,
focus=query,
max_length=200
)
# محاسبه relevance
relevance_score = calculate_relevance(summary, query)
if relevance_score > THRESHOLD:
processed_results.append({
"url": result.url,
"title": result.title,
"summary": summary,
"score": relevance_score
})
# مرتبسازی بر اساس امتیاز
processed_results.sort(key=lambda x: x["score"], reverse=True)
return format_results_with_citations(processed_results)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
# تکهتکه کردن اسناد
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", ".", "!", "?", " "]
)
chunks = text_splitter.split_documents(documents)
# ایجاد embeddings (مدل چندزبانه برای فارسی)
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
# ساخت Vector Store
vectorstore = FAISS.from_documents(chunks, embeddings)
# ابزار RAG
@tool
def search_internal_docs(query: str, k: int = 5) -> str:
"""جستجو در اسناد داخلی سازمان"""
# بازیابی مرتبطترین chunks
relevant_docs = vectorstore.similarity_search(query, k=k)
# ترکیب با متادیتا و ارجاع
results = []
for doc in relevant_docs:
results.append({
"content": doc.page_content,
"source": doc.metadata["source"],
"page": doc.metadata.get("page", "N/A")
})
return format_with_sources(results)
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
user_profile = {
"role": "مهندس ارشد",
"department": "R&D",
"access_level": "advanced",
"preferences": {
"language": "Persian",
"detail_level": "comprehensive"
}
}
SYSTEM_PROMPT = """
شما یک دستیار دانشبنیان هوشمند هستید که برای [نام سازمان] کار میکنید.
**هدف:** پاسخگویی دقیق و مستند به پرسشهای کاربران بر اساس اسناد داخلی و منابع معتبر
**ابزارهای در دسترس:**
- search_internal_docs: جستجو در اسناد داخلی سازمان
- web_search: جستجو در وب برای اطلاعات بهروز
- create_summary: تهیه خلاصه از اسناد
**سیاستها:**
1. همیشه به منابع استفادهشده ارجاع دهید
2. اگر مطمئن نیستید، صریحاً بگویید و منابع بیشتر پیشنهاد دهید
3. برای موضوعات حساس، به مدیریت ارجاع دهید
4. در پاسخهای فارسی، از لحن رسمی و حرفهای استفاده کنید
**کاربر فعلی:**
نقش: {role}
دپارتمان: {department}
سطح دسترسی: {access_level}
**سبک ارجاع:**
برای هر ادعا یا اطلاعات، به صورت [منبع: عنوان، صفحه/بخش] ارجاع دهید.
"""
# نمونه پیادهسازی RBAC ساده
class RoleBasedAgent:
def __init__(self, user_role):
self.role = user_role
self.permissions = ROLE_PERMISSIONS[user_role]
def can_use_tool(self, tool_name):
return tool_name in self.permissions["allowed_tools"]
def can_access_data(self, data_classification):
return data_classification in self.permissions["data_access"]
@tool
def restricted_database_query(self, query: str) -> str:
"""دسترسی محدود به پایگاهداده بر اساس نقش"""
if not self.can_use_tool("database_query"):
return "خطا: شما مجوز دسترسی به این ابزار را ندارید"
# بررسی سطح دسترسی داده
classification = detect_data_classification(query)
if not self.can_access_data(classification):
audit_log.warning(f"Unauthorized access attempt by {self.user_id}")
return "خطا: شما مجوز دسترسی به این سطح از داده را ندارید"
# اجرای کوئری با محدودیتهای امنیتی
return execute_safe_query(query, self.role)
# نمونه یکپارچهسازی Whisper + Azure TTS
import openai
from azure.cognitiveservices.speech import SpeechConfig, SpeechSynthesizer
# تشخیص گفتار با Whisper
def transcribe_audio(audio_file):
with open(audio_file, "rb") as f:
transcript = openai.Audio.transcribe("whisper-1", f)
return transcript["text"]
# تبدیل متن به گفتار با Azure
def text_to_speech_persian(text, voice="fa-IR-DilaraNeural"):
speech_config = SpeechConfig(
subscription=AZURE_KEY,
region=AZURE_REGION
)
speech_config.speech_synthesis_voice_name = voice
synthesizer = SpeechSynthesizer(speech_config=speech_config)
result = synthesizer.speak_text_async(text).get()
return result.audio_data
# استفاده در ایجنت
user_audio = "user_question.wav"
user_text = transcribe_audio(user_audio)
agent_response = agent.run(user_text)
response_audio = text_to_speech_persian(agent_response)
# گردش کار خودکار تولید ویدیو
async def generate_educational_video(topic, audience_level):
# گام 1: تولید اسکریپت
script = agent.run(f"""
یک اسکریپت آموزشی ۳-۵ دقیقهای درباره {topic}
برای مخاطبان سطح {audience_level} بنویس.
از زبان ساده و مثالهای عملی استفاده کن.
""")
# گام 2: بهینهسازی برای گفتار
optimized_script = optimize_for_speech(script)
# گام 3: تبدیل به گفتار
audio = await azure_tts.synthesize(
text=optimized_script,
voice="fa-IR-DilaraNeural",
style="friendly"
)
# گام 4: ایجاد ویدیو با آواتار
video = await synthesia.create_video(
audio_file=audio,
avatar="Persian_Female_Professional",
background="Modern_Office",
include_subtitles=True
)
# گام 5: افزودن برندینگ
final_video = add_branding(
video,
logo=COMPANY_LOGO,
intro_outro=True
)
return final_video
# مثال استفاده
video_url = await generate_educational_video(
topic="مبانی یادگیری ماشین",
audience_level="مبتدی"
)
# نمونه ساده جریان مکالمه
class CallFlowState:
GREETING = "greeting"
INTENT_RECOGNITION = "intent_recognition"
DATA_COLLECTION = "data_collection"
ACTION = "action"
CONFIRMATION = "confirmation"
GOODBYE = "goodbye"
async def handle_call(call_sid):
state = CallFlowState.GREETING
context = {}
while state != CallFlowState.GOODBYE:
# دریافت صدای کاربر
user_audio = await receive_audio(call_sid)
user_text = await whisper_transcribe(user_audio)
# پردازش بر اساس state
if state == CallFlowState.GREETING:
response = "سلام! به پشتیبانی خوش آمدید. چطور میتونم کمکتون کنم؟"
state = CallFlowState.INTENT_RECOGNITION
elif state == CallFlowState.INTENT_RECOGNITION:
intent = await llm_detect_intent(user_text)
context["intent"] = intent
response = get_response_for_intent(intent)
state = determine_next_state(intent)
# ... سایر stateها
# تبدیل به گفتار و ارسال
response_audio = await tts_synthesize(response)
await send_audio(call_sid, response_audio)
# پایان تماس
await end_call(call_sid)
# نمونه تنظیمات SCIM در Open WebUI
{
"scim": {
"enabled": true,
"endpoint": "https://your-idp.com/scim/v2",
"auth_token": "YOUR_SCIM_TOKEN",
"sync_interval": "hourly",
"user_attributes": ["email", "name", "department", "role"],
"auto_provision": true,
"auto_deprovision": true
},
"rbac": {
"roles": {
"admin": {
"models": ["*"],
"tools": ["*"],
"data_access": ["public", "internal", "confidential"]
},
"developer": {
"models": ["gpt-4o-mini", "claude-3-sonnet"],
"tools": ["web_search", "code_execution", "rag"],
"data_access": ["public", "internal"]
},
"viewer": {
"models": ["gpt-4o-mini"],
"tools": ["web_search"],
"data_access": ["public"]
}
}
}
}
# نمونه یک Pipeline سفارشی برای اتصال به CRM
class CRMIntegrationPipeline:
def __init__(self):
self.crm_client = CRMClient(api_key=os.getenv("CRM_API_KEY"))
async def on_startup(self):
"""اجرا هنگام بارگذاری pipeline"""
print("CRM Pipeline loaded")
async def inlet(self, body: dict) -> dict:
"""پیشپردازش ورودی کاربر"""
user_id = body.get("user", {}).get("id")
# دریافت context از CRM
customer_data = await self.crm_client.get_customer(user_id)
# افزودن به context
body["context"] = {
"customer_name": customer_data["name"],
"account_type": customer_data["type"],
"last_interaction": customer_data["last_contact"]
}
return body
async def outlet(self, body: dict) -> dict:
"""پسپردازش خروجی LLM"""
# ثبت تعامل در CRM
await self.crm_client.log_interaction(
customer_id=body["user"]["id"],
interaction_type="ai_chat",
summary=body["response"][:200]
)
return body
# تعریف تابع سفارشی (BYOF)
@function
def get_customer_orders(customer_id: str, limit: int = 10) -> str:
"""
دریافت لیست سفارشات یک مشتری از CRM
Args:
customer_id: شناسه مشتری
limit: تعداد سفارشات (پیشفرض: 10)
"""
orders = crm_client.get_orders(customer_id, limit=limit)
return format_orders_as_text(orders)
pip install langchain langchain-community langchain-openai
pip install httpx pydantic python-dotenv
pip install faiss-cpu chromadb # برای Vector Store
pip install openai anthropic # برای LLM APIs
pip install whisper elevenlabs # برای صدا
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings()
vectorstore = FAISS.from_documents(documents, embeddings)
vectorstore.save_local("./vectorstore")
OPERATIONAL_PROMPT = """
نقش: دستیار دانشبنیان حرفهای شرکت [نام]
هدف اصلی:
پاسخگویی دقیق و مستند به پرسشهای کاربران با استفاده از:
1. اسناد داخلی سازمان (اولویت اول)
2. منابع معتبر وب (برای اطلاعات بهروز)
3. استدلال و ترکیب اطلاعات
ابزارهای مجاز:
- search_internal_docs(query): جستجو در بانک اسناد داخلی
- web_search(query, max_results=5): جستجوی وب در منابع معتبر
- create_summary(text, max_length): تهیه خلاصه از متن طولانی
سیاستها و محدودیتها:
1. همیشه ابتدا اسناد داخلی را بررسی کنید
2. برای هر ادعا، منبع مشخص کنید
3. اگر مطمئن نیستید، صریحاً اعلام کنید
4. حداکثر 3 بار چرخه Thought→Action→Observation
5. به دادههای حساس بدون تأیید دسترسی نداشته باشید
فرمت خروجی:
[پاسخ اصلی با ساختار مناسب]
منابع:
1. [عنوان سند/صفحه]
2. [URL وبسایت]
کاربر فعلی: {user_name} | نقش: {user_role} | دسترسی: {access_level}
"""
"بر اساس سند HR-2024..."
[منبع: سیاست استخدام، ص 12]
search_customer_orders ❌ search. نام پارامترها نیز باید معنادار باشند و مطابق convention باشند.from typing import Optional, List
from pydantic import BaseModel, Field
class SearchOrdersParams(BaseModel):
customer_id: str = Field(..., description="شناسه یکتای مشتری")
status: Optional[str] = Field(
None,
description="وضعیت سفارش (pending, completed, cancelled)"
)
limit: int = Field(
10,
ge=1,
le=100,
description="حداکثر تعداد نتایج (1-100)"
)
@tool
def search_customer_orders(
customer_id: str,
status: Optional[str] = None,
limit: int = 10
) -> str:
"""
جستجوی سفارشات یک مشتری در سیستم CRM
این تابع سفارشات یک مشتری را بر اساس شناسه و فیلترهای اختیاری
جستجو میکند و لیست سفارشات را برمیگرداند.
Args:
customer_id: شناسه یکتای مشتری (الزامی)
status: فیلتر بر اساس وضعیت (اختیاری: pending, completed, cancelled)
limit: حداکثر تعداد نتایج (پیشفرض: 10، حداکثر: 100)
Returns:
لیست سفارشات به فرمت JSON string
Raises:
ValueError: اگر customer_id نامعتبر یا status غیرمجاز باشد
Example:
search_customer_orders("CUS-12345", status="completed", limit=5)
"""
# Validation
if not customer_id.startswith("CUS-"):
raise ValueError("customer_id باید با 'CUS-' شروع شود")
valid_statuses = ["pending", "completed", "cancelled", None]
if status not in valid_statuses:
raise ValueError(f"status باید یکی از {valid_statuses} باشد")
# پیادهسازی واقعی
try:
orders = crm_client.get_orders(customer_id, status, limit)
return format_orders(orders)
except Exception as e:
return f"خطا در جستجوی سفارشات: {str(e)}"
# نمونه انتخاب خودکار فرمت خروجی
def generate_output(content, user_preference, content_type):
"""تولید خروجی در فرمت مناسب"""
if content_type == "report":
# گزارشهای رسمی → PDF
return generate_pdf(content, template="professional")
elif content_type == "data":
# دادههای تحلیلی → Excel + نمودارها
return generate_excel_with_charts(content)
elif content_type == "tutorial":
# آموزش → ویدیو با آواتار
script = content
audio = text_to_speech(script)
video = create_avatar_video(audio)
return video
elif user_preference == "audio":
# کاربر صوتی را ترجیح میدهد
return text_to_speech(content)
else:
# پیشفرض: متن ساختاریافته
return format_markdown(content)
# اسلاید ۱: مروری بر سال ۲۰۲۳
- رشد ۳۵٪ در درآمد نسبت به سال قبل [ص. ۳]
- ورود به ۵ بازار جدید در آسیا [ص. ۸]
- استخدام ۱۲۰ نفر نیروی جدید [ص. ۱۵]
# اسلاید ۲: عملکرد مالی
- درآمد: ۵۰ میلیون دلار [ص. ۲۲]
- سود خالص: ۸ میلیون دلار [ص. ۲۲]
- EBITDA Margin: ۲۸٪ [ص. ۲۳]
[ادامه برای اسلایدهای ۳-۶...]
# جمعبندی
سال ۲۰۲۳ سالی استثنایی برای شرکت بود با رشد قابل توجه
در درآمد و سودآوری. ورود موفق به بازارهای جدید و سرمایهگذاری
در نیروی انسانی، پایهگذار رشد پایدار در سالهای آینده است.
نقش و هدف:
شما یک دستیار دانشبنیان حرفهای هستید که برای [نام سازمان] کار میکنید.
هدف اصلی شما پاسخگویی دقیق، سریع و مستند به پرسشهای کارکنان است.
ابزارهای در دسترس:
1. search_internal_docs(query: str) -> str
جستجو در بانک اسناد داخلی سازمان
2. web_search(query: str, max_results: int = 5) -> str
جستجوی وب در منابع معتبر
3. query_database(sql: str) -> str
اجرای کوئری SQL روی دیتابیس (فقط SELECT)
4. create_summary(text: str, max_length: int = 200) -> str
تهیه خلاصه از متن طولانی
سیاستهای عملیاتی:
1. همیشه ابتدا اسناد داخلی را بررسی کنید
2. برای هر ادعا یا اطلاعات، منبع مشخص کنید
3. اگر مطمئن نیستید، صریحاً اعلام کنید
4. حداکثر ۵ چرخه Thought→Action→Observation
5. برای موضوعات حساس (مالی، حقوقی، پرسنلی)، به مدیریت ارجاع دهید
6. به اطلاعات شخصی کاربران بدون تأیید دسترسی نداشته باشید
محدودیتهای ابزارها:
- search_internal_docs: فقط اسناد public و internal
- web_search: حداکثر 10 نتیجه، فقط دامنههای معتبر
- query_database: فقط SELECT، بدون DELETE/UPDATE/INSERT
فرمت خروجی:
[پاسخ اصلی با ساختار مناسب - عنوان، نکات کلیدی، توضیحات]
منابع:
1. [نام سند / صفحه X] یا [URL]
2. ...
در صورت نیاز به اطلاعات بیشتر:
[پیشنهاد منابع اضافی یا مراجعه به تیم/فرد خاص]
سبک ارجاع:
- برای اسناد داخلی: [نام سند، ص. X]
- برای وب: [عنوان مقاله، URL]
- برای دیتابیس: [جدول X، رکورد Y]
اطلاعات کاربر فعلی:
نام: {user_name}
نقش: {user_role}
دپارتمان: {department}
سطح دسترسی: {access_level}
مثال تعامل:
کاربر: "آخرین گزارش فروش ماه گذشته چیه؟"
شما:
Thought: باید از دیتابیس فروش کوئری بگیرم
Action: query_database("SELECT * FROM sales_reports WHERE month = 'last_month' ORDER BY date DESC LIMIT 1")
Observation: [نتیجه کوئری]
Final Answer: بر اساس دیتابیس فروش، آخرین گزارش فروش ماه گذشته...
[منابع: دیتابیس فروش، رکورد ID 12345]
یادآوری مهم:
- شفافیت و صداقت اولویت اول است
- همیشه منابع را ذکر کنید
- اگر نمیدانید، بگویید و راهنمایی کنید