-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtelegram_bot.py
87 lines (58 loc) · 2.45 KB
/
telegram_bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import os
from dotenv import load_dotenv
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, ContextTypes, filters
load_dotenv()
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
USER_AGENT = os.environ.get('USER_AGENT')
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores.faiss import FAISS
from langchain.chains import create_retrieval_chain
def get_documents_from_web(url):
loader = WebBaseLoader(url)
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=200,
chunk_overlap=20
)
splitDocs = splitter.split_documents(docs)
return splitDocs
def create_db(docs):
embedding = OpenAIEmbeddings()
vectorStore = FAISS.from_documents(docs, embedding=embedding)
return vectorStore
def create_chain(vectorStore):
model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.4)
prompt = ChatPromptTemplate.from_template("""
Answer the user's question:
Context: {context}
Question: {input}
""")
chain = create_stuff_documents_chain(llm=model, prompt=prompt)
retriever = vectorStore.as_retriever()
retriever_chain = create_retrieval_chain(retriever, chain)
return retriever_chain
docs = get_documents_from_web("https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=GKM69DUUYKQWKWX7")
vectorStore = create_db(docs)
chain = create_chain(vectorStore)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text(
"Hi! I can help you with questions about the Amazon return policy."
" How can I help you today?")
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
user_query = update.message.text
response = chain.invoke({
"input": user_query
})
await update.message.reply_text(response["answer"])
def main() -> None:
application = Application.builder().token(TELEGRAM_TOKEN).build()
application.add_handler(CommandHandler("start", start))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
application.run_polling()
if __name__ == '__main__':
main()