Chatbot Projekt 02.05¶
1. Einleitung¶
Ein Chatbot ist eine Anwendung, die dazu entwickelt wurde, mit menschlichen Benutzern über natürliche Sprache zu kommunizieren. Diese Bots können in verschiedenen Anwendungen eingesetzt werden, von Kundenbetreuung bis hin zu Unterhaltungszwecken. Dieser Bericht präsentiert die Entwicklung und Implementierung eines einfachen Chatbots unter Verwendung von Python.
2. Grundlagen:¶
([Abb.1]): Chatbot Logo
Die Grundlage eines Chatbots besteht aus der Fähigkeit, menschenähnliche Interaktionen durchzuführen, indem er Eingaben des Benutzers analysiert und entsprechende Antworten generiert. Typischerweise werden Chatbots mithilfe von künstlicher Intelligenz, maschinellem Lernen und natürlicher Sprachverarbeitung erstellt. Der hier implementierte Chatbot basiert auf einem festen Wissensschatz, der durch den Benutzer erweitert werden kann.
3. Versuchsdurchführung¶
Der Chatbot wurde in Python erstellt und nutzt verschiedene Bibliotheken wie json, requests und re. Der Bot verfügt über folgende Hauptfunktionen:
Laden und Speichern von Wissensbasen: Der Chatbot kann eine Wissensbasis aus einer JSON-Datei laden und Änderungen daran speichern.
def load_knowledge_base(file_path: str) -> dict:
with open(file_path, 'r') as file:
data: dict = json.load(file)
return data
def save_knowledge_base(file_path: str, data: dict):
with open(file_path, 'w') as file:
json.dump(data, file, indent=2)
Erkennung der besten Übereinstimmung: Der Bot analysiert die Benutzereingabe und findet die beste Übereinstimmung mit den vorhandenen Fragen in der Wissensbasis.
def find_best_match(user_input: str, questions: list[str]) -> str | None:
best_match = None
for question in questions:
if user_input.lower() in question.lower():
best_match = question
break
return best_match
Abruf von Antworten: Basierend auf der erkannten Frage gibt der Chatbot die entsprechende Antwort aus der Wissensbasis zurück.
def get_answer_for_question(question: str, knowledge_base: dict) -> str | None:
for category in knowledge_base["categories"]:
for qa_pair in category["questions"]:
if qa_pair["question"].lower() == question.lower():
if(category["name"].lower() == "weather"):
answer = get_weather_api_request(qa_pair["answer"], qa_pair["city"], qa_pair["weather_data"])
return answer
else:
return qa_pair["answer"]
return None
Wissensbasis erweitern: Wenn der Chatbot eine Frage nicht beantworten kann, bietet er dem Benutzer die Möglichkeit, eine neue Antwort hinzuzufügen. Der Benutzer kann die Kategorie auswählen und die Frage mit der entsprechenden Antwort eingeben.
def chat_bot():
knowledge_base: dict = load_knowledge_base('knowledge_base.json')
while True:
user_input: str = input('You: ')
if user_input.lower() == "quit":
break
best_match: str | None = find_best_match(user_input, [qa_pair["question"] for category in knowledge_base["categories"] for qa_pair in category["questions"]])
if best_match:
answer: str = get_answer_for_question(best_match, knowledge_base)
print(f'Bot: {answer}')
else:
print('Bot: I don\'t know the answer. Can you teach me?')
category_name: str = input('Type the category or "skip" to skip: ')
if(category_name.lower() == 'skip'):
continue
if(category_name.lower() == 'weather'):
print("You chose the weather category! You need to add additional info to your answer. Type in the weather data that should later be replaced by the API like this: the temperature is *temp_c")
print("Weather data: *temp_c, *wind_kph, *wind_degree, *humidity, *feelslike_c, *pressure_mb, *precip_mm, *cloud, *uv")
if category_name.lower() != 'skip':
new_answer = input('Enter the answer: ')
for category in knowledge_base["categories"]:
if category["name"].lower() == category_name.lower():
if(category_name.lower() == "weather"):
weather_category(user_input, new_answer, category, knowledge_base)
break
category["questions"].append({"question": user_input, "answer": new_answer})
save_knowledge_base('knowledge_base.json', knowledge_base)
print('Bot: Thank you! I learned a new response for the', category_name, 'category!')
break
else:
print('Bot: Category not found. Response not added.')
Wenn die Kategorie „Weather“ eingegeben wurde müssen zusätzlich noch Wetterdaten und die Stadt eingebenen werden. Diese können dann in die Antwort mit „*“ als präfix einbezogen werden. Die weather api aus dem letzten Versuch tauscht dann diese felder mit den aktuellen Wetterdaten aus.
def get_answer_for_question(question: str, knowledge_base: dict) -> str | None:
for category in knowledge_base["categories"]:
for qa_pair in category["questions"]:
if qa_pair["question"].lower() == question.lower():
if(category["name"].lower() == "weather"):
answer = get_weather_api_request(qa_pair["answer"], qa_pair["city"], qa_pair["weather_data"])
return answer
else:
return qa_pair["answer"]
return None
def weather_category(question: str, answer: str, category, knowledge_base: dict):
city_input: str = input("City: ")
weather_data_array: list[str] = extract_words_starting_with(answer)
category["questions"].append({"question": question, "answer": answer, "city": city_input, "weather_data" : weather_data_array})
save_knowledge_base('knowledge_base.json', knowledge_base)
print('Bot: Thank you! I learned a new response for the weather category!')
return
So startet man den Chatbot:
python3 main.py
4. Fazit¶
Wir haben erfolgreich einen simplen Chatbot geschrieben der Fragen beantworten kann und außerdem auf bedarf seinen Wissenstand erweitern kann. Außerdem haben wir diesen Chatbot mit unserer alten Wetter API erweitert, sodass es nun auch das Wetter einer beliebigen Stadt darstellen kann.
Abbildungen: