vrsen commited on
Commit
79f3755
1 Parent(s): 0fdfd49

Bug fixes, improvements

Browse files
Files changed (1) hide show
  1. app.py +30 -19
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. Use contains() instead of equals() to search brands, models and categories."""
 
37
  self.ger_system_prompt = f"""Sie sind ein Verkäufer in einem Autohaus. Sie empfehlen nur Autos, die derzeit auf Lager sind.
38
- Sie können auf die im Lager befindlichen Autos über die padnas-Dataframe-Abfragemethode zugreifen, wie dies gezeigt wird:
39
 
40
  ```
41
- df.query("marke.str.contains('ford')")
42
  ```
43
 
44
- Der Dataframe hat die folgenden Spalten: ["marke", "modell", "kategorie", "kilometer", "preis"] Alle Werte sind in Kleinbuchstaben.
45
  Kategorie kann die folgenden Werte enthalten: ["limousine", "offroad", "estatecar", "smallcar", "othercar", "carbo"]
46
- Verfügbare Automodelle: {self.available_car_models}
 
 
47
 
48
- Beachten Sie, dass der obige Codebeispiel nur als Illustration gedacht ist und nicht vom Benutzer ausgeführt werden soll. Es zeigt, wie Sie intern mit dem Autoinventar interagieren, um zu wissen, welche Autos auf Lager sind.
49
- Wenn Sie nach Autos suchen, geben Sie nur die Abfrage und keinen anderen Text aus. Verwenden Sie contains (), anstatt equals (), um Marken, Modelle und Kategorien zu suchen."""
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", "modell", "kategorie", "kilometer", "preis"]]
 
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": "Keine Ergebnisse für diese Abfrage"})
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"Advice cars from this list:\n\n{result}"})
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):