LangChain Intelligent Customer Service Bot
\\\\n\\\\nThis article integrates the knowledge learned previously to build a complete intelligent customer service bot. It can query the knowledge base, process orders, and transfer to human agents when necessary.
\\\\n\\\\n\\\\n\\\\n
Requirements Analysis
\\\\n\\\\n| Feature | Implementation |
|---|---|
| Knowledge Base Q&A | RAG retrieval + model response |
| Order Query | @tool function |
| Conversation Memory | SqliteSaver Checkpointer |
| Sensitive Content Filtering | @before_model Middleware |
| Human Handoff | HITL interrupt() |
\\\\n\\\\n
Complete Code
\\\\n\\\\nExample
\\\\n\\\\n# File path: customer_service_bot.py\\\\n\\\\n# pip install langchain langchain-deepseek langchain-chroma chromadb\\\\n\\\\nfrom dotenv import load_dotenv\\\\n\\\\nload_dotenv()\\\\n\\\\nfrom typing import Annotated\\\\n\\\\nfrom langchain.tools import tool\\\\nfrom langchain.agents import create_agent\\\\nfrom langchain.agents.middleware import before_model, after_model, wrap_tool_call\\\\nfrom langchain.chat_models import init_chat_model\\\\nfrom langchain.messages import HumanMessage\\\\nfrom langchain_openai import OpenAIEmbeddings\\\\nfrom langchain_chroma import Chroma\\\\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\\\\nfrom langgraph.checkpoint.sqlite import SqliteSaver\\\\nfrom langgraph.types import interrupt, Command\\\\n\\\\n# ========== 1. Prepare Knowledge Base ==========\\\\n\\\\nknowledge_base = [\\\\n " TUTORIAL Founded in 2013, it is a leading free programming learning platform in China.",\\\\n "The platform provides 300+ tutorials, covering Python, Java, HTML, CSS, JavaScript, etc..ใ",\\\\n "Python3 The basic tutorial has 30 chapters, with cumulative learners exceeding 500,000ใCourses are completely free.",\\\\n "VIP membership fee used for ยฅ99/Month๏ผยฅ799/Year๏ผIncludes video courses and one-on-one Q&A service.",\\\\n "Refund Policy: Full refund available within 7 days of purchase and within 3 lessons.",\\\\n "The platform supports an online programming environment, allowing you to write and run code without installing any software.",\\\\n "Customer Service Hours: Monday to Friday 9:00-18:00๏ผWeekend 10:00-16:00ใ",\\\\n]\\\\n\\\\nembeddings = OpenAIEmbeddings(model="text-embedding-3-small")\\\\nchunks = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=30\\\\n ).create_documents(knowledge_base)\\\\nvector_store = Chroma.from_documents(chunks, embeddings)\\\\nretriever = vector_store.as_retriever(search_kwargs={"k": 3})\\\\n\\\\n# ========== 2. Define Tools ==========\\\\n\\\\n@tool\\\\ndef search_kb(query: str) -> str:\\\\n """Search the knowledge base to get information about platform, courses, policies, etc..Official information.\\\\n Args:\\\\n query: Search questions or keywords\\\\n """\\\\n docs = retriever.invoke(query)\\\\n if not docs:\\\\n return "No relevant information found, recommend transferring to a human agent."\\\\n return "n".join(f"- {doc.page_content}" for doc in docs)\\\\n\\\\n# Simulated order database\\\\norders_db = {\\\\n "ORD-2024-001": {"user": "Xiaoming", "item": "VIP YearMembership Fee",\\\\n "amount": 799, "status": "Completed", "date": "2024-01-15"},\\\\n "ORD-2024-002": {"user": "Xiaoming", "item": "Python Hands-on Course",\\\\n "amount": 199, "status": "In Transit", "date": "2024-03-20"},\\\\n}\\\\n\\\\n@tool\\\\ndef query_order(order_id: str) -> str:\\\\n """According to OrderNo / Based on OrderNo.Query order status and details.\\\\n Args:\\\\n order_id: OrderNo.๏ผsuch as ORD-2024-001\\\\n """\\\\n order = orders_db.get(order_id.upper())\\\\n if not order:\\\\n return f"Order Not Found {order_id}ใPlease confirm OrderNo.Is this correct? / Is it correct."\\\\n return (f"Order {order_id}๏ผ{order['item']} | "\\\\n f"Amount ยฅ{order['amount']} | "\\\\n f"State {order['status']} | "\\\\n f"Date {order['date']}")\\\\n\\\\n@tool\\\\ndef transfer_to_human(reason: str) -> str:\\\\n """Transfer the user to human customer service.\\\\n Args:\\\\n reason: Transfer Reason\\\\n """\\\\n approval = interrupt({\\\\n "action": "transfer_to_human",\\\\n "reason": reason,\\\\n "message": f"User requests transfer to human agent, reason:{reason}ใTransfer?"\\\\n })\\\\n if approval.get("confirmed"):\\\\n return (f"already / has beenforYoutransfer to human customer service๏ผestimatedetc.pending / to be {approval.get('wait_time', 3)} Minutes."\\\\n f"Ticket No.๏ผTK-{approval.get('ticket_id', 'N/A')}")\\\\n return "transferalready / has beencancel๏ผIcontinueforYouservice."\\\\n\\\\n# ========== 3. Define Middleware ==========\\\\n\\\\n@before_model\\\\ndef content_guard(state, runtime):\\\\n """Filter inappropriate content in user input"""\\\\n last_msg = state if state.get("messages") else None\\\\n if not last_msg:\\\\n return None\\\\n content = str(getattr(last_msg, 'content', ''))\\\\n blocked = ["Huang X", "XBlog", "Illegal"]\\\\n for word in blocked:\\\\n if word in content:\\\\n return {\\\\n "jump_to": "end",\\\\n "messages": [HumanMessage(content="Sorry, I cannot process this request.")]\\\\n }\\\\n return None\\\\n\\\\n@after_model\\\\ndef auto_signature(state, runtime):\\\\n """Automatically append customer service signature."""\\\\n msgs = state.get("messages", [])\\\\n if not msgs:\\\\n return None\\\\n last = msgs\\\\n if last.type == "ai" and last.content and not (\\\\n hasattr(last, 'tool_calls') and last.tool_calls\\\\n ):\\\\n from langchain.messages import AIMessage\\\\n return {"messages": [AIMessage(\\\\n content=last.content\\\\n + "nn---n TUTORIAL Customer Service Center | Working hours 9:00-18:00"\\\\n )]}\\\\n return None\\\\n\\\\n# ========== 4. Create Agent ==========\\\\n\\\\ncheckpointer = SqliteSaver.from_conn_string("customer_service.db")\\\\n\\\\nmodel = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)\\\\n\\\\nagent = create_agent(\\\\n model=model,\\\\n tools=[search_kb, query_order, transfer_to_human],\\\\n middleware=[content_guard, auto_signature],\\\\n checkpointer=checkpointer,\\\\n system_prompt="""You are the intelligent customer service agent for TUTORIAL."Xiaocai"ใ\\\\n\\\\n## Your responsibilities\\\\n\\\\n1. Warmly welcome every user, use"You"Salutation\\\\n2. Regarding platform information, course content, policies, etc..issue, use / make / causeUse search_kb query\\\\n3. For Order inquiries, use the query_order tool\\\\n4. For unresolved issues, use transfer_to_human to transfer to a human agent\\\\n\\\\n## Behavioral Guidelines\\\\n\\\\n- Keep answers concise, 2-3 sentences each time.\\\\n- If you don't know, query the knowledge base; if not found, honestly admit it.\\\\n- Maintain a friendly and approachable tone."""\\\\n ,\\\\n)\\\\n\\\\n# ========== 5. Conversation Interface ==========\\\\n\\\\ndef chat(thread_id: str, message: str) -> str:\\\\n """Process user messages and return replies"""\\\\n config = {"configurable": {"thread_id": thread_id}}\\\\n \\\\n # Run Agent\\\\n result = agent.invoke(\\\\n {"messages": [HumanMessage(content=message)]},\\\\n config=config,\\\\n )\\\\n \\\\n # Check if human handoff is needed (HITL)\\\\n state = agent.get_state(config)\\\\n if state.tasks and state.tasks.interrupts:\\\\n interrupt_info = state.tasks.interrupts.value\\\\n return f" {interrupt_info.get('message', '')}"\\\\n \\\\n return result.content\\\\n\\\\n# ========== 6. Test ==========\\\\n\\\\nif __name__ == "__main__":\\\\n user_id = "user_xiaoming"\\\\n \\\\n print("=== Test 1: Knowledge Base Query ===")\\\\n print(chat(user_id, "Python3 How many chapters does the tutorial have?"))\\\\n print()\\\\n \\\\n print("=== Test 2: Order Query ===")\\\\n print(chat(user_id, "IofOrder ORD-2024-001 Stateis what๏ผ"))\\\\n print()\\\\n \\\\n print("=== Test 3: VIP Consultation ===")\\\\n print(chat(user_id, "VIP How much is the membership?"))\\\\n print()\\\\n \\\\n print("=== Test 4: Test Memory ===")\\\\n print(chat(user_id, "What questions did I just ask?"))\\\\n\\\\nExecution Results:
\\\\n\\\\n=== Test 1: Knowledge Base Query ===According to the knowledge base, Python3 Basic Tutorial has 30 chapters, with cumulative learners exceeding 500,000๏ผCourses are completely free.--- TUTORIAL Customer Service Center | Working hours 9:00-18:00=== Test 2: Order Query ===YouofOrder ORD-2024-001๏ผVIP YearMembership Fee๏ผAmount ยฅ799๏ผState Completed๏ผDate 2024-01-15ใ--- TUTORIAL Customer Service Center | Working hours 9:00-18:00=== Test 3: VIP Consultation === VIP membership fee used for ยฅ99/Monthor ยฅ799/Year๏ผIncludes video courses and one-on-one Q&A service.--- TUTORIAL Customer Service Center | Working hours 9:00-18:00=== Test 4: Test Memory ===YouJust now inquired about Python3 Tutorial chapter numbers, Order ORD-2024-001 status, and VIP membership prices. Is there anything else I can help you with?--- RUNOOB TUTORIAL Customer Service Center | Working hours 9:00-18:00\\\\n\\\\n\\\\n\\\\n
Project Summary
\\\\n\\\\nThis customer service bot integrates the following LangChain features:
\\\\n\\\\n| Feature | Usage in Project |
|---|---|
| RAG Retrieval | search_kb tool + Chroma vector storage |
| Tool Calling | query_order, transfer_to_human |
| Checkpointer | SqliteSaver persists conversations, enabling multi-turn memory |
| Middleware | before_model content filtering + after_model signature appending |
| HITL | interrupt() for human handoff approval |
YouTip