Spaces:
Runtime error
Runtime error
Bug fixes, improvements
Browse files
app.py
CHANGED
@@ -6,6 +6,9 @@ from openai.error import AuthenticationError
|
|
6 |
|
7 |
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
|
8 |
|
|
|
|
|
|
|
9 |
|
10 |
class Bot():
|
11 |
def __init__(self):
|
@@ -22,7 +25,7 @@ class Bot():
|
|
22 |
|
23 |
def set_prompts(self):
|
24 |
self.eng_system_prompt = f"""You are a salesman in a car dealership. You only recommend cars that are currently in stock.
|
25 |
-
To access the cars in stock use the padnas dataframe query method like this:
|
26 |
|
27 |
```
|
28 |
df.query("brand.str.contains('ford')")
|
@@ -31,22 +34,27 @@ df.query("brand.str.contains('ford')")
|
|
31 |
The dataframe has the following columns: ["brand", "model", "category", "kilometer", "price"]. All values are lowercased.
|
32 |
Category can contain the following values: ["limousine", "offroad", "estatecar", "smallcar", "othercar", "carbo"]
|
33 |
Available car brands: {self.available_car_models}
|
|
|
|
|
34 |
|
35 |
Note that the code snippet above is illustrative and not meant to be executed by the user. It demonstrates how you internally interact with the car inventory to know which cars are in stock.
|
36 |
-
If you are going to search for cars output only the query and no other text.
|
|
|
37 |
self.ger_system_prompt = f"""Sie sind ein Verkäufer in einem Autohaus. Sie empfehlen nur Autos, die derzeit auf Lager sind.
|
38 |
-
|
39 |
|
40 |
```
|
41 |
-
df.query("
|
42 |
```
|
43 |
|
44 |
-
Der Dataframe hat die folgenden Spalten: ["marke", "
|
45 |
Kategorie kann die folgenden Werte enthalten: ["limousine", "offroad", "estatecar", "smallcar", "othercar", "carbo"]
|
46 |
-
Verfügbare
|
|
|
|
|
47 |
|
48 |
-
Beachten Sie, dass der
|
49 |
-
Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text aus.
|
50 |
|
51 |
def change_language(self, lang, history):
|
52 |
self.lang = lang if lang in ["English", "German"] else "English"
|
@@ -81,7 +89,8 @@ Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text au
|
|
81 |
df = pd.read_csv(file.name)
|
82 |
# drop all rows with at least one NaN value
|
83 |
# only use columns marke modell kategorie kilomeret preis
|
84 |
-
df = df[["marke", "
|
|
|
85 |
df = df.dropna()
|
86 |
# convert price and kilometer to int
|
87 |
df["preis"] = df["preis"].astype(int)
|
@@ -89,13 +98,14 @@ Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text au
|
|
89 |
# make marke modell kategorie lowercase
|
90 |
df["marke"] = df["marke"].str.lower().str.strip()
|
91 |
df["modell"] = df["modell"].str.lower().str.strip()
|
|
|
92 |
df["kategorie"] = df["kategorie"].str.lower().str.replace("car.", "").str.strip()
|
93 |
# remove duplicates
|
94 |
df = df.drop_duplicates()
|
95 |
self.available_car_models = df["marke"].unique()
|
96 |
print(self.available_car_models)
|
97 |
if self.lang == "English":
|
98 |
-
df = df.rename(columns={"marke": "brand", "modell": "model", "kategorie": "category", "kilometer": "kilometer", "preis": "price"})
|
99 |
|
100 |
df = df.loc[:, ~df.columns.duplicated()]
|
101 |
|
@@ -122,9 +132,9 @@ Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text au
|
|
122 |
|
123 |
if self.df is None:
|
124 |
if self.lang == "English":
|
125 |
-
history.append((None, "Please upload a csv file"))
|
126 |
else:
|
127 |
-
history.append((None, "Bitte laden Sie eine csv-Datei hoch"))
|
128 |
return history, False
|
129 |
return history, True
|
130 |
|
@@ -174,6 +184,9 @@ Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text au
|
|
174 |
return history
|
175 |
|
176 |
def query_db(self, response, messages):
|
|
|
|
|
|
|
177 |
# extract line that contains the query
|
178 |
for line in response.split("\n"):
|
179 |
if "df.query" in line:
|
@@ -183,23 +196,20 @@ Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text au
|
|
183 |
print(query_line)
|
184 |
if result.empty:
|
185 |
if self.lang == "English":
|
186 |
-
messages.insert(-1, {"role": "system", "content": "No results for this query"})
|
187 |
else:
|
188 |
-
messages.insert(-1, {"role": "system", "content": "
|
189 |
else:
|
190 |
-
print(result)
|
191 |
# take only 50 random rows
|
192 |
if len(result) > 50:
|
193 |
result = result.sample(n=50)
|
194 |
result = result.to_string(index=False)
|
|
|
195 |
# add message to history 1 before last
|
196 |
if self.lang == "English":
|
197 |
messages.insert(-1, {"role": "system", "content": f"Advice cars from this list:\n\n{result}"})
|
198 |
else:
|
199 |
-
messages.insert(-1, {"role": "system", "content": f"
|
200 |
-
|
201 |
-
# remove first before last message
|
202 |
-
messages.pop(-2)
|
203 |
|
204 |
response = openai.ChatCompletion.create(
|
205 |
model="gpt-3.5-turbo",
|
@@ -207,6 +217,7 @@ Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text au
|
|
207 |
temperature=0.3,
|
208 |
)['choices'][0]['message']['content']
|
209 |
print(response)
|
|
|
210 |
return response
|
211 |
|
212 |
def _count_tokens(self, messages):
|
|
|
6 |
|
7 |
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
|
8 |
|
9 |
+
pd.set_option('display.max_columns', None) # Display all columns
|
10 |
+
pd.set_option('display.width', None) # Automatically adjust the width to fit the content
|
11 |
+
|
12 |
|
13 |
class Bot():
|
14 |
def __init__(self):
|
|
|
25 |
|
26 |
def set_prompts(self):
|
27 |
self.eng_system_prompt = f"""You are a salesman in a car dealership. You only recommend cars that are currently in stock.
|
28 |
+
To access the cars in stock (inventory) in your dealership use the padnas dataframe query method like this:
|
29 |
|
30 |
```
|
31 |
df.query("brand.str.contains('ford')")
|
|
|
34 |
The dataframe has the following columns: ["brand", "model", "category", "kilometer", "price"]. All values are lowercased.
|
35 |
Category can contain the following values: ["limousine", "offroad", "estatecar", "smallcar", "othercar", "carbo"]
|
36 |
Available car brands: {self.available_car_models}
|
37 |
+
Do not mention any other specific details about the car and do not recommend it until you query the dataframe.
|
38 |
+
Use contains() instead of equals() to search brands, models and categories.
|
39 |
|
40 |
Note that the code snippet above is illustrative and not meant to be executed by the user. It demonstrates how you internally interact with the car inventory to know which cars are in stock.
|
41 |
+
If you are going to search for cars output only the query and no other text."""
|
42 |
+
|
43 |
self.ger_system_prompt = f"""Sie sind ein Verkäufer in einem Autohaus. Sie empfehlen nur Autos, die derzeit auf Lager sind.
|
44 |
+
Um auf die im Autohaus vorhandenen Autos (Inventar) zuzugreifen, verwenden Sie die padnas-Dataframe-Abfrage-Methode wie folgt:
|
45 |
|
46 |
```
|
47 |
+
df.query("brand.str.contains('ford')")
|
48 |
```
|
49 |
|
50 |
+
Der Dataframe hat die folgenden Spalten: ["marke", "modell2", "kategorie", "kilometer", "preis", "grundfarbe"]. Alle Werte sind kleingeschrieben.
|
51 |
Kategorie kann die folgenden Werte enthalten: ["limousine", "offroad", "estatecar", "smallcar", "othercar", "carbo"]
|
52 |
+
Verfügbare Auto-Marken: {self.available_car_models}
|
53 |
+
Nennen Sie keine anderen spezifischen Details zum Auto und empfehlen Sie es nicht, bis Sie den Dataframe abgefragt haben.
|
54 |
+
Verwenden Sie contains (), anstatt equals (), um Marken, Modelle und Kategorien zu suchen.
|
55 |
|
56 |
+
Beachten Sie, dass der Code-Schnipsel oben nur zur Illustration gedacht ist und nicht vom Benutzer ausgeführt werden soll. Er zeigt, wie Sie intern mit dem Autoinventar interagieren, um zu wissen, welche Autos auf Lager sind.
|
57 |
+
Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text aus."""
|
58 |
|
59 |
def change_language(self, lang, history):
|
60 |
self.lang = lang if lang in ["English", "German"] else "English"
|
|
|
89 |
df = pd.read_csv(file.name)
|
90 |
# drop all rows with at least one NaN value
|
91 |
# only use columns marke modell kategorie kilomeret preis
|
92 |
+
df = df[["marke", "modell2", "kategorie", "kilometer", "preis", "grundfarbe"]]
|
93 |
+
df = df.rename(columns={"modell2": "modell"})
|
94 |
df = df.dropna()
|
95 |
# convert price and kilometer to int
|
96 |
df["preis"] = df["preis"].astype(int)
|
|
|
98 |
# make marke modell kategorie lowercase
|
99 |
df["marke"] = df["marke"].str.lower().str.strip()
|
100 |
df["modell"] = df["modell"].str.lower().str.strip()
|
101 |
+
df["grundfarbe"] = df["grundfarbe"].str.lower().str.strip()
|
102 |
df["kategorie"] = df["kategorie"].str.lower().str.replace("car.", "").str.strip()
|
103 |
# remove duplicates
|
104 |
df = df.drop_duplicates()
|
105 |
self.available_car_models = df["marke"].unique()
|
106 |
print(self.available_car_models)
|
107 |
if self.lang == "English":
|
108 |
+
df = df.rename(columns={"marke": "brand", "modell": "model", "kategorie": "category", "kilometer": "kilometer", "preis": "price", "grundfarbe": "color"})
|
109 |
|
110 |
df = df.loc[:, ~df.columns.duplicated()]
|
111 |
|
|
|
132 |
|
133 |
if self.df is None:
|
134 |
if self.lang == "English":
|
135 |
+
history.append((None, "Please upload a csv file. (This might take a few minutes)"))
|
136 |
else:
|
137 |
+
history.append((None, "Bitte laden Sie eine csv-Datei hoch. (Dies kann einige Minuten dauern)"))
|
138 |
return history, False
|
139 |
return history, True
|
140 |
|
|
|
184 |
return history
|
185 |
|
186 |
def query_db(self, response, messages):
|
187 |
+
# remove first before last message (previous system prompt)
|
188 |
+
messages.pop(-2)
|
189 |
+
|
190 |
# extract line that contains the query
|
191 |
for line in response.split("\n"):
|
192 |
if "df.query" in line:
|
|
|
196 |
print(query_line)
|
197 |
if result.empty:
|
198 |
if self.lang == "English":
|
199 |
+
messages.insert(-1, {"role": "system", "content": "No results for this query. Help user narrow their preferences."})
|
200 |
else:
|
201 |
+
messages.insert(-1, {"role": "system", "content": "Für diese Abfrage gibt es keine Ergebnisse. Helfen Sie dem Benutzer, seine Präferenzen einzugrenzen."})
|
202 |
else:
|
|
|
203 |
# take only 50 random rows
|
204 |
if len(result) > 50:
|
205 |
result = result.sample(n=50)
|
206 |
result = result.to_string(index=False)
|
207 |
+
print(result)
|
208 |
# add message to history 1 before last
|
209 |
if self.lang == "English":
|
210 |
messages.insert(-1, {"role": "system", "content": f"Advice cars from this list:\n\n{result}"})
|
211 |
else:
|
212 |
+
messages.insert(-1, {"role": "system", "content": f"Empfehlung von Autos aus dieser Liste:\n\n{result}"})
|
|
|
|
|
|
|
213 |
|
214 |
response = openai.ChatCompletion.create(
|
215 |
model="gpt-3.5-turbo",
|
|
|
217 |
temperature=0.3,
|
218 |
)['choices'][0]['message']['content']
|
219 |
print(response)
|
220 |
+
# remove
|
221 |
return response
|
222 |
|
223 |
def _count_tokens(self, messages):
|