-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
138 lines (119 loc) · 4.63 KB
/
app.py
File metadata and controls
138 lines (119 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import os
import logging
import pandas as pd
from tqdm import tqdm
from pathlib import Path
import autosim
from autosim.agent import Agent, LongTermMemory, WorkingMemory
from autosim.base import Movie
from autosim.dataset.movie_lens import MovieLensDataset
from autosim.model_manager import ModelManager
from autosim.model_evaluator import ModelEvaluator
from pages import MovieWebsite
from prompts import LONG_TERM_MEMORY_PROMPT, USER_SYSTEM_PROMPT
from tools import DataStore, MovieSearchTool
from utils import format_user_profile
from actions import *
autosim.set_env()
os.makedirs("output", exist_ok=True)
logging.basicConfig(
filename="output/simulation.txt",
level=logging.INFO,
format="%(message)s",
encoding="latin-1",
)
DF_TASTE = pd.read_csv("data/user_taste.csv")
MOVIE_DATA_STORE = DataStore(data_dir="data")
def create_user(user_id, user_profile, user_taste, activity_trait):
fatigue_map = {"low": 20, "medium": 30, "high": 40}
max_fatigue = fatigue_map.get(activity_trait, fatigue_map["medium"])
user_system_prompt = USER_SYSTEM_PROMPT.format(
user_profile=user_profile, movie_taste=user_taste
)
long_term_memory = LongTermMemory(
system_prompt=LONG_TERM_MEMORY_PROMPT,
tools=[
MovieSearchTool(user_id=user_id, data_store=MOVIE_DATA_STORE),
],
)
working_memory = WorkingMemory(
system_prompt=user_system_prompt,
max_fatigue=max_fatigue,
)
return Agent(
name="User",
system_prompt=user_system_prompt,
long_term_memory=long_term_memory,
working_memory=working_memory,
actions=[
click_movie,
watch_and_rate_movie,
next_page,
previous_page,
back_action,
exit_action,
],
)
def create_movie_website(user, movie_ids, dataset, image_dir=None):
movies = []
for movie_id in movie_ids:
item_info = dataset.get_item_info(movie_id)
movie_data = item_info.copy()
movie_data.update(
{
"id": movie_id,
"rating": float(f"{item_info['rating'] / 2:.1f}"),
"genres": item_info["genres"].strip().split(","),
}
)
if image_dir is not None and "poster_path" in item_info:
movie_data["poster_path"] = str(Path(image_dir) / item_info["poster_path"])
else:
movie_data["poster_path"] = None
movies.append(Movie(**movie_data))
return MovieWebsite(user, movies=movies)
output_folder = "output"
manager = ModelManager(model_folder="models", output_folder=output_folder)
evaluator = ModelEvaluator(output_folder)
dataset = MovieLensDataset(data_dir="dataset/ml-1m")
user_activity_trait_df = pd.read_parquet("data/user_activity_trait.parquet")
IMAGE_DIR = "dataset/ml-1m/posters"
for user_id in tqdm(manager.get_user_ids(), desc="Running simulation"):
logging.info(f"User ID: {user_id}")
# 检查是否已处理过该用户
if all(
user_id in manager.get_processed_user_ids(model_name)
for model_name in manager.models
):
logging.info(f"User ID {user_id} already processed. Skipping.")
continue
try:
user_data = dataset.get_user_detail(user_id, 978133367)
user_profile = format_user_profile(user_data["user_info"])
user_taste = DF_TASTE[DF_TASTE["user_id"] == user_id]["user_taste"].values[0]
user_activity_trait = user_activity_trait_df.loc[user_id]["trait"]
except Exception as e:
logging.error(f"Error preparing user data for User ID {user_id}: {e}")
print(f"Error preparing user data for User ID {user_id}: {e}")
continue
for model_name, _ in manager:
try:
if user_id in manager.get_processed_user_ids(model_name):
logging.info(
f"User ID {user_id} already processed for model {model_name}. Skipping."
)
continue
logging.info(f"Model: {model_name}")
user = create_user(user_id, user_profile, user_taste, user_activity_trait)
user.print_system_message()
recommendations = manager.get_recommendations(model_name, user_id)
simulator = create_movie_website(user, recommendations, dataset, IMAGE_DIR)
simulator.run()
manager.log(model_name, user_id, simulator.logs)
except Exception as e:
logging.error(
f"Error processing User ID {user_id} with model {model_name}: {e}"
)
print(f"Error processing User ID {user_id} with model {model_name}: {e}")
continue
evaluator.evaluate()