Budujemy chatbota Safari! 🦁💬
1from langchain_openai import ChatOpenAI
2from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
3from langchain_community.chat_message_histories import ChatMessageHistory
4from langchain_core.runnables.history import RunnableWithMessageHistory
5
6# Model
7llm = ChatOpenAI(model="gpt-5", temperature=0.7)
8
9# System prompt
10system = """Jesteś Darwin - przyjaznym przewodnikiem Safari.
11Odpowiadasz entuzjastycznie, dzielisz się ciekawostkami o zwierzętach.
12Zawsze dbasz o bezpieczeństwo turystów."""
13
14prompt = ChatPromptTemplate.from_messages([
15 ("system", system),
16 MessagesPlaceholder(variable_name="history"),
17 ("human", "{input}")
18])
19
20chain = prompt | llm
21
22# Pamięć
23store = {}
24
25def get_session_history(session_id: str):
26 if session_id not in store:
27 store[session_id] = ChatMessageHistory()
28 return store[session_id]
29
30# Chatbot z pamięcią
31chatbot = RunnableWithMessageHistory(
32 chain,
33 get_session_history,
34 input_messages_key="input",
35 history_messages_key="history"
36)
37
38# Rozmowa
39config = {"configurable": {"session_id": "user_123"}}
40
41response = chatbot.invoke({"input": "Cześć! Jestem na Safari!"}, config=config)
42print(f"Darwin: {response.content}")
43
44response = chatbot.invoke({"input": "Jakie zwierzęta tu żyją?"}, config=config)
45print(f"Darwin: {response.content}")1def run_chatbot():
2 print("🦁 Safari Chatbot - wpisz 'quit' aby zakończyć")
3 print("-" * 50)
4
5 session_id = "cli_session"
6 config = {"configurable": {"session_id": session_id}}
7
8 while True:
9 user_input = input("\nTy: ").strip()
10
11 if user_input.lower() in ['quit', 'exit', 'q']:
12 print("\n👋 Do zobaczenia na Safari!")
13 break
14
15 if not user_input:
16 continue
17
18 response = chatbot.invoke({"input": user_input}, config=config)
19 print(f"\nDarwin: {response.content}")
20
21if __name__ == "__main__":
22 run_chatbot()1from langchain_community.document_loaders import TextLoader
2from langchain.text_splitter import RecursiveCharacterTextSplitter
3from langchain_openai import OpenAIEmbeddings
4from langchain_community.vectorstores import FAISS
5from langchain.chains import RetrievalQA
6
7# Załaduj dokumenty o Safari
8loader = TextLoader("safari_guide.txt")
9documents = loader.load()
10
11# Podziel na chunki
12splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
13chunks = splitter.split_documents(documents)
14
15# Stwórz vector store
16embeddings = OpenAIEmbeddings()
17vectorstore = FAISS.from_documents(chunks, embeddings)
18
19# RAG chain
20qa_chain = RetrievalQA.from_chain_type(
21 llm=llm,
22 chain_type="stuff",
23 retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
24)
25
26# Pytanie
27result = qa_chain.invoke({"query": "Jak bezpiecznie obserwować lwy?"})
28print(result["result"])1from fastapi import FastAPI, HTTPException
2from pydantic import BaseModel
3import uvicorn
4
5app = FastAPI()
6
7class ChatRequest(BaseModel):
8 message: str
9 session_id: str
10
11class ChatResponse(BaseModel):
12 response: str
13
14@app.post("/chat", response_model=ChatResponse)
15async def chat(request: ChatRequest):
16 config = {"configurable": {"session_id": request.session_id}}
17
18 try:
19 response = chatbot.invoke(
20 {"input": request.message},
21 config=config
22 )
23 return ChatResponse(response=response.content)
24 except Exception as e:
25 raise HTTPException(status_code=500, detail=str(e))
26
27if __name__ == "__main__":
28 uvicorn.run(app, host="0.0.0.0", port=8000)