Spaces:
Runtime error
Runtime error
direct links
Browse files
app.py
CHANGED
@@ -24,9 +24,11 @@ class Bot():
|
|
24 |
self.df = None
|
25 |
self.available_car_models = None
|
26 |
self.set_prompts()
|
|
|
|
|
27 |
|
28 |
def set_prompts(self):
|
29 |
-
self.eng_system_prompt = f"""You are a virtual car salesman salesman assistant for an online car dealership. You only recommend cars that are currently in your inventory.
|
30 |
To access your inventory return dataframe query method like this:
|
31 |
|
32 |
```
|
@@ -34,29 +36,31 @@ df.query("brand.str.contains('ford')")
|
|
34 |
```
|
35 |
|
36 |
The dataframe has the following columns: ["brand", "model", "category", "kilometer", "price"], with all values in lowercase.
|
37 |
-
The available car categories are: limousine, offroad, estatecar, smallcar, othercar, and carbo.
|
|
|
38 |
To search for specific car information, use the contains() method instead of equals().
|
39 |
|
40 |
-
Do not say that any models in your inventory or that any models are available
|
41 |
-
Do not ask the user if you need to check the inventory
|
42 |
-
|
43 |
-
If you need to check the inventory to answer the user's question, only show
|
44 |
-
|
45 |
-
self.ger_system_prompt = f"""Sie sind ein virtueller Autoverkäufer-Assistent für eine Online-Autohandelsfirma. Sie empfehlen nur Autos, die sich derzeit in Ihrem Inventar befinden.
|
46 |
-
Um auf Ihr Inventar zuzugreifen, geben Sie die Datenrahmenabfrage-Methode wie folgt zurück:
|
47 |
|
|
|
|
|
|
|
48 |
```
|
49 |
-
df.query("
|
50 |
```
|
51 |
|
52 |
-
|
53 |
-
Die verfügbaren
|
54 |
-
|
|
|
55 |
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
Wenn
|
60 |
|
61 |
def change_language(self, lang, history):
|
62 |
self.lang = lang if lang in ["English", "German"] else "English"
|
@@ -95,7 +99,8 @@ Wenn Sie das Inventar überprüfen müssen, um die Frage des Benutzers zu beantw
|
|
95 |
df = pd.read_csv(filename)
|
96 |
# drop all rows with at least one NaN value
|
97 |
# only use columns marke modell kategorie kilomeret preis
|
98 |
-
df = df[
|
|
|
99 |
df = df.rename(columns={"modell2": "modell"})
|
100 |
df = df.dropna()
|
101 |
# convert price and kilometer to int
|
@@ -126,6 +131,18 @@ Wenn Sie das Inventar überprüfen müssen, um die Frage des Benutzers zu beantw
|
|
126 |
history = []
|
127 |
return history
|
128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
def check_requirements(self, query, history):
|
130 |
if query.startswith("sk-"):
|
131 |
self.api_key = query.strip("\n").strip()
|
@@ -215,11 +232,14 @@ Wenn Sie das Inventar überprüfen müssen, um die Frage des Benutzers zu beantw
|
|
215 |
messages.insert(-1, {"role": "system",
|
216 |
"content": "Sie sind ein virtueller Autohändler-Assistent in einem Online-Autohaus. Keine Ergebnisse für diese Abfrage. Benutzer bei der Anpassung ihrer Präferenzen oder Empfehlung anderer Marken unterstützen"})
|
217 |
else:
|
218 |
-
# take only 50 random rows
|
219 |
-
if len(result) > 50:
|
220 |
-
result = result.sample(n=10)
|
221 |
# check if result is a dataframe
|
222 |
if isinstance(result, pd.DataFrame):
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
result = result.to_string(index=False).replace("<br>", "")
|
224 |
elif isinstance(result, pd.Series):
|
225 |
result = result.to_string(index=False).replace("<br>", "")
|
@@ -231,11 +251,11 @@ Wenn Sie das Inventar überprüfen müssen, um die Frage des Benutzers zu beantw
|
|
231 |
# add message to history 1 before last
|
232 |
if self.lang == "English":
|
233 |
messages.insert(-1, {"role": "system",
|
234 |
-
"content": f"You are a virtual car salesman salesman assistant for an online car dealership. You only recommend cars that are currently in stock. Advice cars from this list that are currently in stock:\n\n{result}\n\n" + "Include links to cars in your recommendation
|
235 |
else:
|
236 |
messages.insert(-1,
|
237 |
{"role": "system",
|
238 |
-
"content": f"Sie sind ein virtueller Autohändler-Assistent in einem Online-Autohaus. Sie empfehlen nur Autos, die derzeit auf Lager sind. Beraten Sie Autos aus dieser Liste, die derzeit auf Lager sind:\n\n{result}\n\n" + "Fügen Sie
|
239 |
|
240 |
response = openai.ChatCompletion.create(
|
241 |
model="gpt-3.5-turbo",
|
|
|
24 |
self.df = None
|
25 |
self.available_car_models = None
|
26 |
self.set_prompts()
|
27 |
+
self.columns_in_response = ["marke", "modell", "kategorie", "kilometer", "preis", "grundfarbe"]
|
28 |
+
self.columns_in_response_eng = ["brand", "model", "category", "kilometer", "price", "color"]
|
29 |
|
30 |
def set_prompts(self):
|
31 |
+
self.eng_system_prompt = f"""You are a virtual car salesman salesman assistant for an online German car dealership. You only recommend cars that are currently in your inventory.
|
32 |
To access your inventory return dataframe query method like this:
|
33 |
|
34 |
```
|
|
|
36 |
```
|
37 |
|
38 |
The dataframe has the following columns: ["brand", "model", "category", "kilometer", "price"], with all values in lowercase.
|
39 |
+
The available car categories are: limousine, offroad, estatecar, smallcar, othercar, and carbo.
|
40 |
+
The available car brands are: {self.available_car_models}.
|
41 |
To search for specific car information, use the contains() method instead of equals().
|
42 |
|
43 |
+
Do not say that any models in your inventory or that any models are available, show the query instead.
|
44 |
+
Do not ask the user if you need to check the inventory, show them how to query the dataframe.
|
45 |
+
Users should not know that you are using a dataframe. They should think that you are using a database.
|
46 |
+
If you need to check the inventory to answer the user's question, only show the query and nothing else."""
|
|
|
|
|
|
|
47 |
|
48 |
+
self.ger_system_prompt = f"""Du bist ein virtueller Autoverkäufer für einen deutschen Online-Autohändler. Du empfiehlst nur Autos, die derzeit in deinem Inventar sind.
|
49 |
+
Um auf dein Inventar zuzugreifen, gibst du die Datenbankabfrage-Methode wie folgt ein:
|
50 |
+
|
51 |
```
|
52 |
+
df.query("marke.str.contains('ford')")
|
53 |
```
|
54 |
|
55 |
+
Die Datenbank hat die folgenden Spalten: ["marke", "modell", "kategorie", "kilometer", "preis"], mit allen Werten in Kleinbuchstaben.
|
56 |
+
Die verfügbaren Autokategorien sind: limousine, offroad, estatecar, smallcar, othercar und carbo.
|
57 |
+
Die verfügbaren Automarken sind: {self.available_car_models}.
|
58 |
+
Um nach bestimmten Fahrzeuginformationen zu suchen, verwende die contains() -Methode anstelle der equals() -Methode.
|
59 |
|
60 |
+
Sage nicht, dass irgendeine Modelle in deinem Inventar sind oder dass irgendeine Modelle verfügbar sind, zeige die Abfrage an.
|
61 |
+
Frag den Benutzer nicht, ob du das Inventar überprüfen musst, zeige ihm, wie du die Datenbankabfrage durchführst.
|
62 |
+
Benutzer sollten nicht wissen, dass du eine Datenbank verwendest. Sie sollten denken, dass du eine Datenbank verwendest.
|
63 |
+
Wenn du das Inventar überprüfen musst, um die Frage des Benutzers zu beantworten, zeige nur die Abfrage und nichts anderes an."""
|
64 |
|
65 |
def change_language(self, lang, history):
|
66 |
self.lang = lang if lang in ["English", "German"] else "English"
|
|
|
99 |
df = pd.read_csv(filename)
|
100 |
# drop all rows with at least one NaN value
|
101 |
# only use columns marke modell kategorie kilomeret preis
|
102 |
+
df = df[self.columns_in_response + ["interne_nummer", "Modellbasis"]]
|
103 |
+
df = self._construct_urls(df)
|
104 |
df = df.rename(columns={"modell2": "modell"})
|
105 |
df = df.dropna()
|
106 |
# convert price and kilometer to int
|
|
|
131 |
history = []
|
132 |
return history
|
133 |
|
134 |
+
def _construct_urls(self, df):
|
135 |
+
for index, row in df.iterrows():
|
136 |
+
# check if all values are not na
|
137 |
+
if row.isna().any():
|
138 |
+
continue
|
139 |
+
marke = row['marke']
|
140 |
+
modellbasis = row['Modellbasis']
|
141 |
+
interne_nummer = row['interne_nummer']
|
142 |
+
base_url = f"https://www.hugopfohe.de/gebrauchtwagen/details/"
|
143 |
+
df.at[index, 'url'] = f"{base_url}{marke}_{modellbasis}_{interne_nummer}/"
|
144 |
+
return df
|
145 |
+
|
146 |
def check_requirements(self, query, history):
|
147 |
if query.startswith("sk-"):
|
148 |
self.api_key = query.strip("\n").strip()
|
|
|
232 |
messages.insert(-1, {"role": "system",
|
233 |
"content": "Sie sind ein virtueller Autohändler-Assistent in einem Online-Autohaus. Keine Ergebnisse für diese Abfrage. Benutzer bei der Anpassung ihrer Präferenzen oder Empfehlung anderer Marken unterstützen"})
|
234 |
else:
|
|
|
|
|
|
|
235 |
# check if result is a dataframe
|
236 |
if isinstance(result, pd.DataFrame):
|
237 |
+
if len(result) > 5:
|
238 |
+
result = result.sample(n=5)
|
239 |
+
if self.lang == "English":
|
240 |
+
result = result[self.columns_in_response_eng + ['url']]
|
241 |
+
else:
|
242 |
+
result = result[self.columns_in_response + ['url']]
|
243 |
result = result.to_string(index=False).replace("<br>", "")
|
244 |
elif isinstance(result, pd.Series):
|
245 |
result = result.to_string(index=False).replace("<br>", "")
|
|
|
251 |
# add message to history 1 before last
|
252 |
if self.lang == "English":
|
253 |
messages.insert(-1, {"role": "system",
|
254 |
+
"content": f"You are a virtual car salesman salesman assistant for an online car dealership. You only recommend cars that are currently in stock. Advice cars from this list that are currently in stock:\n\n{result}\n\n" + "Include links to cars in your recommendation from the url column."})
|
255 |
else:
|
256 |
messages.insert(-1,
|
257 |
{"role": "system",
|
258 |
+
"content": f"Sie sind ein virtueller Autohändler-Assistent in einem Online-Autohaus. Sie empfehlen nur Autos, die derzeit auf Lager sind. Beraten Sie Autos aus dieser Liste, die derzeit auf Lager sind:\n\n{result}\n\n" + "Fügen Sie Links zu Autos in Ihrer Empfehlung aus der Spalte url hinzu."})
|
259 |
|
260 |
response = openai.ChatCompletion.create(
|
261 |
model="gpt-3.5-turbo",
|