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: ************** .. image:: img/chatbot.png :scale: 50% ([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. .. code-block:: Python 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. .. code-block:: Python 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. .. code-block:: Python 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. .. code-block:: Python 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. .. code-block:: Python 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: .. code-block:: bash 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:** .. [Abb.1] : Quelle: https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPrzOWhklRKmz_35yt0y2IYzv8h5KoD4tK9ev08ogSUQ&s