Emma / benchmark_token_efficiency.py
EMMA
update code
3bcffd4
Raw History Blame Contribute Delete
5.16 kB
import os
import json
import numpy as np
import tiktoken
from tqdm import tqdm
from app import classify_query_local # یا classify_query_openai بسته به انتخابتان
# فرض می‌کنیم توابع بازیابی شما در ماژول‌های زیر هستند (نام‌ها را در صورت نیاز تطبیق دهید)
# from memory_utils import load_user_memory
# from build_memory_index import load_indices
def count_tokens(text: str, model_name: str = "gpt-4") -> int:
"""شمارش تعداد توکن‌های یک متن با استفاده از توکنایزر"""
encoding = tiktoken.encoding_for_model(model_name)
return len(encoding.encode(text))
def simulate_retrieval(query, query_category, indices, semantic_text, top_k=3):
"""
شبیه‌سازی بازیابی بر اساس طبقه‌بندی (EMMA - Routed)
"""
retrieved_text = ""
if query_category == "semantic_memory":
retrieved_text = semantic_text
elif query_category == "episodic_memory":
if indices.get("episodic_memory"):
# بازیابی از ایندکس اپیزودیک
nodes = indices["episodic_memory"].as_retriever(similarity_top_k=top_k).retrieve(query)
retrieved_text = "\n".join([n.node.text for n in nodes])
elif query_category == "semantic-episodic":
retrieved_text = semantic_text + "\n"
if indices.get("episodic_memory"):
nodes = indices["episodic_memory"].as_retriever(similarity_top_k=top_k).retrieve(query)
retrieved_text += "\n".join([n.node.text for n in nodes])
# اگر unknown باشد، معمولاً فقط از کانتکست مکالمه (session) استفاده می‌شود
return retrieved_text
def simulate_full_retrieval(query, indices, semantic_text, top_k=3):
"""
شبیه‌سازی بازیابی از تمام حافظه‌ها (EMMA-FULL)
"""
retrieved_text = semantic_text + "\n"
if indices.get("episodic_memory"):
nodes = indices["episodic_memory"].as_retriever(similarity_top_k=top_k).retrieve(query)
retrieved_text += "\n".join([n.node.text for n in nodes])
if indices.get("sessions_memory"):
nodes = indices["sessions_memory"].as_retriever(similarity_top_k=top_k).retrieve(query)
retrieved_text += "\n".join([n.node.text for n in nodes])
return retrieved_text
def run_benchmark(test_queries, username="test_user"):
# ۱. بارگذاری ایندکس‌های کاربر (باید توابع واقعی پروژه خود را فراخوانی کنید)
# indices = {
# "episodic_memory": load_index(username, "episodic"),
# "sessions_memory": load_index(username, "sessions")
# }
# semantic_text = get_semantic_memory(username)
# مقادیر دامی برای جلوگیری از خطا در صورت عدم اتصال به دیتابیس در این مثال
indices = {}
semantic_text = "User values empathy and stability. Big Five: High Openness."
results = {
"EMMA": [], # توکن‌های بازیابی شده با کلاسیفایر
"EMMA_FULL": [] # توکن‌های بازیابی شده با جستجوی سراسری
}
for query in tqdm(test_queries, desc="Benchmarking Queries"):
# ۲. طبقه‌بندی کوئری
category = classify_query_local(query)
# ۳. بازیابی هدفمند (رویکرد پیشنهادی شما)
routed_context = simulate_retrieval(query, category, indices, semantic_text)
tokens_routed = count_tokens(routed_context)
# ۴. بازیابی کامل (بیس‌لاین)
full_context = simulate_full_retrieval(query, indices, semantic_text)
tokens_full = count_tokens(full_context)
results["EMMA"].append(tokens_routed)
results["EMMA_FULL"].append(tokens_full)
# ۵. محاسبه آمار و ارقام برای مقاله
avg_emma = np.mean(results["EMMA"])
avg_full = np.mean(results["EMMA_FULL"])
reduction_pct = ((avg_full - avg_emma) / avg_full) * 100 if avg_full > 0 else 0
print("\n" + "="*40)
print(" TOKEN EFFICIENCY ANALYSIS RESULTS ")
print("="*40)
print(f"Total Queries Evaluated: {len(test_queries)}")
print(f"Average Tokens Retrieved (EMMA-FULL): {avg_full:.2f}")
print(f"Average Tokens Retrieved (EMMA Routed): {avg_emma:.2f}")
print(f"Token Reduction (R_token): {reduction_pct:.2f}%")
print("="*40)
if __name__ == "__main__":
# مجموعه‌ای از کوئری‌های تستی برای ارزیابی
sample_queries = [
"What did we talk about regarding my job stress last week?", # Expected: episodic
"Can you remind me what my core values are?", # Expected: semantic
"I'm feeling very overwhelmed today, just like last time.", # Expected: semantic-episodic
"Hi, how are you?" # Expected: unknown
]
run_benchmark(sample_queries)