Har du en hjemmeside hvor folk ofte stille spørgsmål, kunne en chatbot måske være løsningen, det kan du nemt lave i Python.
Det kræver at du har en vidensbase i en eller anden form, i dette eksempel bruger vi nogle PDF filer.
Du kan prøve min version online her: Speakerbot
Jeg bruger LLM Longchain, som har en masse loaders udover PDF, Bla CSV mm Læs mere her Loaders.
Først skal vi indlæse alle modulerne:
import os
import glob
from PyPDF2 import PdfReader
from dotenv import load_dotenv
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
Vi have en API til CHATGPT / OPENAI, den kan du lave her: API KEY OPENAI
Den læser vi i vores Python program her:
load_dotenv()
os.environ[‘OPENAI_API_KEY’] = ‘DIN_API_KEY_SKRIVES HER’
llm = OpenAI()
chain = load_qa_chain(llm)
Vi skal have delt teksten op i chunken der kan søges i :
raw_text = ”
for pdf_file in glob.glob(os.path.join(pdf_folder, ‘*.pdf’)):
reader = PdfReader(pdf_file)
for i, page in enumerate(reader.pages):
text = page.extract_text()
if text:
raw_text += text
text_splitter = CharacterTextSplitter(
separator=”\n”,
chunk_size=700,
chunk_overlap=200,
length_function=len,
)
texts = text_splitter.split_text(raw_text)
embeddings = OpenAIEmbeddings()
Vi bruger FAISS Modulet til at lave en Søgning.
docsearch = FAISS.from_texts(texts, embeddings)
Vi skal have OPEN AI til at lave et svar udfra vores Pdf’er
def query_index(prompt, template_prompt):
modified_prompt = “Du er en hjælpsom chatrobot hos bekent.dk, der kan svare på spørgsmål. Du skal kun svare faktuelt og rigtigt . Du svarer på dansk og må gerne linke til videoer, artikler og produkter.” + prompt
docs = docsearch.similarity_search(modified_prompt)
response = chain.run(question=modified_prompt, input_documents=docs)
return response
Dette er hele vores chatbot program. Men vi skal også have lavet en et online interface, det har jeg valgt at gøre i streamlit.
Program 2 Bruger interface.
Igen starter vi med at læse modulerne ind.
import streamlit as st
from googledoc1 import query_index
import time
import datetime
Jeg logger alle spørgsmål i en tekst fil
def log_question_and_answer(question, answer, log_file=”log.txt”):
timestamp = datetime.datetime.now().strftime(“%Y-%m-%d %H:%M:%S”)
with open(log_file, “a”, encoding=”utf-8″) as f:
f.write(f”{timestamp}\n”)
f.write(f”Spørgsmål: {question}\n”)
f.write(f”Svar: {answer}\n\n”)
og tilsidst kommer spørgsmål – svar funktionen:
st.set_page_config(page_title=”Stil et spørgsmål til Bekent’s robot leksikon”, page_icon=”🔈”, layout=”centered”)
st.title(“SpeakerBOT”)
template_prompt = “””
Du er en hjælpsom chatrobot hos bekent.dk som er en dansk webshop der sælger højttaler og lydudstyr, der kan svare på spørgsmål udfra denne viden.
Du skal kun svare faktuelt og rigtigt . Du svarer på dansk og må gerne linke til videoer, artikler og produkter.
Hvis du ikke synes du kan svare korrekt skal du svare at: Jeg har ikke informationer til at svarer på dit spørgsmål, du er velkommen til at skrive til vores Kundeservice på kontakt@bekent.dk”.
“””
user_input = st.text_area(
“NY MEDARBEJDER ! Jeg er under oplæring, håber du vil prøve mig af og være forstående overfor jeg kan svare forkert. Jeg svarer bedst hvis du beskriver dit spørgsmål godt og grundigt. Skriv dit spørgsmål her:”,
height=50 # Juster højden efter behov
)
if st.button(“Spørg SpeakerBOT”):
if user_input:
with st.spinner(“Vent et øjeblik…”):
response = query_index(user_input, template_prompt)
time.sleep(2) # Tilpas ventetiden efter behov
# Log spørgsmål og svar
log_question_and_answer(user_input, response)
st.write(f”**Svar:** {response}”)
else:
st.warning(“Indtast venligst et spørgsmål.”)
Dette var min version af en chatbot der kan svarer udfra PDF filer…
Nu kan du starte din Chatbot ved at skrive streamlit run ogditfilnavn.py – rigtig god fornøjelse med din nye medarbejder.