
大家好我是你们的技术伙伴。在2026年的今天大模型LLM已经渗透到我们生活的方方面面。但在实际业务中我们经常面临一个痛点如何让通用的大模型精准地理解特定领域的“黑话”比如在电商卖衣服时客户问“我170高140斤穿什么码”模型如果不懂你的库存尺码表回答就是胡扯。今天我将基于Python和LangChain框架带你从零构建一套“智能衣答系统”。我们将利用RAG检索增强生成技术让模型在没有经过专业微调的情况下也能具备顶级服装销售专家的分析能力。核心内容概览RAG核心架构索引、检索、生成三步走通本地知识库。智能尺码推荐基于本地文档的精准匹配不再是瞎猜。对话记忆维护让AI记住你的喜好实现连贯对话。Streamlit可视化快速构建Web界面让Demo跑起来。 第一部分RAG架构——给大模型一本“参考书”很多初学者觉得大模型“不好用”其实是因为它在“裸奔”——只有预训练时的知识没有你当下的业务数据。RAG检索增强生成就是解决这个问题的银弹。工作流程索引Indexing把你的衣服属性文档TXT/PDF切分成小块转化为向量存入向量数据库。检索Retrieval当用户提问时把问题也转化为向量在数据库里找最相似的Top-K个片段。生成Generation把检索到的片段作为上下文拼接到Prompt里喂给大模型生成答案。代码实现构建向量数据库from langchain_chroma import Chroma from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from model import embedding # 假设你已经配置好了嵌入模型 def create_db(file_path, persist_directory./chroma_data): # 1. 加载文档 loader TextLoader(file_path, encodingutf-8) docs loader.load() # 2. 文本切分 (chunk_size: 块大小, chunk_overlap: 重叠字符数) text_splitter CharacterTextSplitter(separator\n, chunk_size150, chunk_overlap30) split_texts text_splitter.split_documents(docs) # 3. 存入向量数据库 vectorDB Chroma.from_documents( documentssplit_texts, embeddingembedding, persist_directorypersist_directory ) return vectorDB.as_retriever(search_kwargs{k: 2}) # 返回检索器k2表示返回2个最相关文档 第二部分智能衣答系统核心逻辑——精准推荐尺码这是本项目的最核心部分。我们需要让模型根据用户提供的身高体重去检索本地知识库中的尺码规则。附件中的核心数据逻辑模拟衣服属性.txt身高160-170cm体重90-115斤 - M码身高165-175cm体重115-135斤 - L码身高170-178cm体重130-150斤 - XL码... (以此类推)代码实现问答链 (qa_chain.py)这里我们使用LCEL (LangChain Expression Language)语法这是目前最优雅的写法。from langchain_core.prompts import PromptTemplate from langchain_core.runnables import RunnablePassthrough, RunnableLambda from langchain_core.output_parsers import StrOutputParser from operator import itemgetter # 1. 获取检索器 (复用上面的逻辑) retriever create_db(../data/衣服属性.txt) # 2. 定义提示词模板 template_str 你是一个专业的服装销售专家。请根据以下检索到的尺码表和用户的对话历史回答用户的问题。 如果你在尺码表中找不到确切答案请根据常识推断但要说明是推断。 尺码表(参考): {context} 历史对话: {chat_history} 当前问题: {question} 回答: prompt PromptTemplate.from_template(template_str) # 3. 辅助函数格式化对话历史 def format_chat_history(history): if not history: return 无历史对话 return \n.join([f用户: {q}\n助手: {a} for q, a in history]) # 4. 构建LCEL链 qa_chain ( RunnablePassthrough.assign( contextitemgetter(question) | retriever, # 检索相关文档 chat_historyitemgetter(chat_history) | RunnableLambda(format_chat_history) # 格式化历史 ) | prompt | llm # 假设llm是你的大模型实例如ChatTongyi() | StrOutputParser() # 解析输出为字符串 ) # 5. 调用示例 chat_history [] question 我身高170体重140斤应该买什么码 response qa_chain.invoke({question: question, chat_history: chat_history}) print(response) # 输出预期: 根据您的身高170cm和体重140斤建议您购买XL码。 第三部分对话记忆——让AI“记得住”你普通的问答系统是“问一句答一句”没有记忆。我们要打造的是能记住用户偏好的智能体。核心技巧在调用链时维护一个chat_history列表每次问答后都追加进去。def qa(question, chat_history): 带记忆的问答函数 # 调用链 answer qa_chain.invoke({ question: question, chat_history: chat_history }) # 更新历史 (注意这里假设你的UI或逻辑需要维护这个列表) chat_history.append((question, answer)) # 限制历史长度防止Token过长 if len(chat_history) 10: chat_history chat_history[-10:] return answer, chat_history️ 第四部分Streamlit可视化——一键启动你的智能客服为了博取眼球一个漂亮的Web界面是必须的。我们使用Streamlit几行代码就能搞定。代码实现web_qa.pyimport streamlit as st from qa_chain import qa # 导入你的核心问答逻辑 # 页面配置 st.set_page_config(page_title智能衣答系统, page_icon) st.title( 智能衣答系统 - 你的专属AI穿搭顾问) # 初始化会话状态 (用于存储对话历史) if messages not in st.session_state: st.session_state.messages [] # 展示历史消息 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # 用户输入 if prompt : st.chat_input(请输入你的问题 (例如: 我170高140斤穿什么码?)): # 显示用户输入 with st.chat_message(user): st.markdown(prompt) # 调用问答逻辑 (这里简化了历史传递实际需处理st.session_state) with st.chat_message(assistant): message_placeholder st.empty() # 模拟流式输出或直接获取结果 response, updated_history qa(prompt, st.session_state.get(chat_history, [])) message_placeholder.markdown(response) # 更新全局历史 st.session_state.messages.append({role: user, content: prompt}) st.session_state.messages.append({role: assistant, content: response}) st.session_state.chat_history updated_history 结语通过上述四个部分的实战我们完成了一个工业级的智能问答系统原型。我们没有使用任何商业微调服务仅仅通过Prompt Engineering、RAG和LangChain就让大模型具备了专业的服装销售能力。给读者的建议数据是核心RAG的效果70%取决于你的本地文档质量。把尺码表、材质说明整理好。多试切分参数chunk_size和chunk_overlap很关键太小了丢失上下文太大了检索不准。拥抱LCELLangChain的新语法LCEL是未来的标准写起来更简洁逻辑更清晰。如果你觉得这篇文章对你有帮助希望点赞、收藏、关注你的支持是我持续输出硬核内容的最大动力