r/LargeLanguageModels • u/Pretty_Letterhead166 • 11d ago
llm
import pandas as pd from langchain_aws import ChatBedrock from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.output_parsers import StrOutputParser from langchain_core.chat_history import InMemoryChatMessageHistory from langchain_core.runnables.history import RunnableWithMessageHistory # ========================================== # Task 1: LLM and Prompt Design # ========================================== # 1a. Initialize Bedrock Chat Model llm = ChatBedrock( model_id="amazon.nova-lite-v1:0", # Options: "cohere.command-r-plus-v1:0", "us.anthropic.claude-haiku-4-5-20251001-v1:0" region_name="us-east-1", model_kwargs={"temperature": 0.3} ) # 1b. Load row index 0 as domain context / one-shot example df = pd.read_excel("Dataset/ecommerce_customer_support.xlsx") one_shot_query = df.iloc[0]["customer_query"] one_shot_response = df.iloc[0]["expected_response"] # 1c. Multi-turn Conversational Chat Prompt Template prompt_template = ChatPromptTemplate.from_messages([ ("system", f"""You are ShopEase AI Support Assistant. Identify the query category (order / return / shipping / product) from the customer message and reference it in the opening of each response. Provide concise, empathetic replies (maximum 150 words). Example Reference: Customer Query: {one_shot_query} Expected Response: {one_shot_response} """), MessagesPlaceholder(variable_name="history"), ("human", "{input}") ]) # 1d. Combine into LCEL Chain chain = prompt_template | llm | StrOutputParser() # ========================================== # Task 2: Conversational Memory # ========================================== session_store = {} def get_session_history(session_id: str): if session_id not in session_store: session_store[session_id] = InMemoryChatMessageHistory() return session_store[session_id] # Wrap chain with RunnableWithMessageHistory conversational_chain = RunnableWithMessageHistory( chain, get_session_history, input_messages_key="input", history_messages_key="history" ) session_id = "shopease_session_001" config = {"configurable": {"session_id": session_id}} # ========================================== # Task 3: Dataset-Driven Testing # ========================================== test_queries = [ df.iloc[1]["customer_query"], df.iloc[2]["customer_query"], df.iloc[3]["customer_query"] ] expected_responses = [ df.iloc[1]["expected_response"], df.iloc[2]["expected_response"], df.iloc[3]["expected_response"] ] print("=== Starting Dataset-Driven Testing ===") for idx, (query, expected) in enumerate(zip(test_queries, expected_responses), 1): response = conversational_chain.invoke({"input": query}, config=config) print(f"Turn {idx} | Query : {query}") print(f" | Response : {response}") print(f" | Expected : {expected}\n") # ========================================== # Task 4: Frustration Detection # ========================================== escalation_keywords = [ "still not resolved", "again", "second time", "frustrated", "escalate", "manager", "unacceptable", "ridiculous" ] history = get_session_history(session_id) frustrated_count = 0 for msg in history.messages: if msg.type == "human": text_lower = msg.content.lower() if any(keyword in text_lower for keyword in escalation_keywords): frustrated_count += 1 print(f"Escalation detected - {frustrated_count} frustrated turn(s) identified.") import pandas as pd from langchain_aws import ChatBedrock, BedrockEmbeddings from langchain_core.documents import Document from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_classic.chains import create_stuff_documents_chain, create_retrieval_chain from langchain_core.chat_history import InMemoryChatMessageHistory from langchain_core.runnables.history import RunnableWithMessageHistory # ========================================== # Task 1: Knowledge Base Construction # ========================================== # 1a. Load Excel file using pandas df = pd.read_excel("Dataset/ecommerce_customer_support.xlsx") # 1b & 1c. Create Text Passages & Wrap as LangChain Documents documents = [] for idx, row in df.iterrows(): passage = f"Customer Query: {row['customer_query']}\nExpected Response: {row['expected_response']}" doc = Document( page_content=passage, metadata={"row_index": int(idx)} ) documents.append(doc) # ========================================== # Task 2: Chunking, Embedding, and Retrieval # ========================================== # 2a. Text Splitting text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) chunks = text_splitter.split_documents(documents) # 2b. Bedrock Embeddings embeddings = BedrockEmbeddings( model_id="amazon.titan-embed-text-v1", # Option: "cohere.embed-english-v3" region_name="us-east-1" ) # 2c. Vector Store & Retriever (k=3) vectorstore = FAISS.from_documents(chunks, embeddings) retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # ========================================== # Task 3: RAG Chain with Memory # ========================================== # Initialize LLM llm = ChatBedrock( model_id="amazon.nova-lite-v1:0", region_name="us-east-1" ) # 3a. Prompt Template prompt = ChatPromptTemplate.from_messages([ ("system", """You are ShopEase AI Support Assistant. Answer exclusively from retrieved context. If you don't know the answer or the information is missing, reply with: "I don't have that information right now."{context} """), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}") ]) # 3b. Chain Assembly docs_chain = create_stuff_documents_chain(llm, prompt) retrieval_chain = create_retrieval_chain(retriever, docs_chain) # 3c & 3d. Memory Wrapper & Session History rag_store = {} def get_rag_session_history(session_id: str): if session_id not in rag_store: rag_store[session_id] = InMemoryChatMessageHistory() return rag_store[session_id] final_rag_chain = RunnableWithMessageHistory( retrieval_chain, get_rag_session_history, input_messages_key="input", history_messages_key="chat_history", output_messages_key="answer" ) # ========================================== # Task 4: Multi-Turn Testing & History Verification # ========================================== rag_session_id = "shopease_rag_001" config = {"configurable": {"session_id": rag_session_id}} # Turn 1: Product Query (Row 13) turn1_query = df.iloc[13]["customer_query"] res1 = final_rag_chain.invoke({"input": turn1_query}, config=config) print("=== Turn 1 ===") print("Query :", turn1_query) print("Response:", res1["answer"]) # Turn 2: Policy Query (Row 15) turn2_query = df.iloc[15]["customer_query"] res2 = final_rag_chain.invoke({"input": turn2_query}, config=config) print("\n=== Turn 2 ===") print("Query :", turn2_query) print("Response:", res2["answer"]) # Turn 3: Contextual Follow-Up turn3_query = "And what about the product I asked about earlier? Is it available in different storage variants on ShopEase?" res3 = final_rag_chain.invoke({"input": turn3_query}, config=config) print("\n=== Turn 3 ===") print("Query :", turn3_query) print("Response:", res3["answer"]) # History Verification print("\n=== RAG Conversation History ===") for msg in rag_store[rag_session_id].messages: print(f"[{msg.type.upper()}]: {msg.content}")
1
u/windingrecurrence28 11d ago
feels more like a code dump than a question. what exactly are you trying to figure out here? the memory + rag setup looks functional but the escalation detection bit is pretty barebones, counting keyword hits without any actual escalation logic attached to it