We use cookies to enhance your experience on the site
CodeWorlds

Chatbots - Conversational AI

Let's build a Safari chatbot! 🦁💬

Simple Chatbot

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 = """You are Darwin - a friendly Safari guide.
11You respond enthusiastically, sharing fun facts about animals.
12You always prioritize tourist safety."""
13
14prompt = ChatPromptTemplate.from_messages([
15    ("system", system),
16    MessagesPlaceholder(variable_name="history"),
17    ("human", "{input}")
18])
19
20chain = prompt | llm
21
22# Memory
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 with memory
31chatbot = RunnableWithMessageHistory(
32    chain,
33    get_session_history,
34    input_messages_key="input",
35    history_messages_key="history"
36)
37
38# Conversation
39config = {"configurable": {"session_id": "user_123"}}
40
41response = chatbot.invoke({"input": "Hello! I'm on a Safari!"}, config=config)
42print(f"Darwin: {response.content}")
43
44response = chatbot.invoke({"input": "What animals live here?"}, config=config)
45print(f"Darwin: {response.content}")

CLI Chatbot

1def run_chatbot():
2    print("🦁 Safari Chatbot - type 'quit' to exit")
3    print("-" * 50)
4
5    session_id = "cli_session"
6    config = {"configurable": {"session_id": session_id}}
7
8    while True:
9        user_input = input("\nYou: ").strip()
10
11        if user_input.lower() in ['quit', 'exit', 'q']:
12            print("\n👋 See you on 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()

Chatbot with Document Context

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# Load Safari documents
8loader = TextLoader("safari_guide.txt")
9documents = loader.load()
10
11# Split into chunks
12splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
13chunks = splitter.split_documents(documents)
14
15# Create 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# Query
27result = qa_chain.invoke({"query": "How to safely observe lions?"})
28print(result["result"])

FastAPI Chatbot

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)
Go to CodeWorlds