大家好,我是你们的技术伙伴。👋
在2026年的今天,大模型(LLM)已经渗透到我们生活的方方面面。但在实际业务中,我们经常面临一个痛点:如何让通用的大模型精准地理解特定领域的"黑话"? 比如,在电商卖衣服时,客户问"我170高,140斤穿什么码?",模型如果不懂你的库存尺码表,回答就是胡扯。
今天,我将基于Python 和LangChain 框架,带你从零构建一套 "智能衣答系统" 。我们将利用RAG(检索增强生成) 技术,让模型在没有经过专业微调的情况下,也能具备顶级服装销售专家的分析能力。
核心内容概览:
- RAG核心架构:索引、检索、生成,三步走通本地知识库。
- 智能尺码推荐:基于本地文档的精准匹配,不再是瞎猜。
- 对话记忆维护:让AI记住你的喜好,实现连贯对话。
- Streamlit可视化:快速构建Web界面,让Demo跑起来。
🧠 第一部分:RAG架构------给大模型一本"参考书"
很多初学者觉得大模型"不好用",其实是因为它在"裸奔"------只有预训练时的知识,没有你当下的业务数据。RAG(检索增强生成) 就是解决这个问题的银弹。
工作流程:
- 索引(Indexing) :把你的衣服属性文档(TXT/PDF)切分成小块,转化为向量,存入向量数据库。
- 检索(Retrieval) :当用户提问时,把问题也转化为向量,在数据库里找最相似的Top-K个片段。
- 生成(Generation) :把检索到的片段作为上下文,拼接到Prompt里,喂给大模型生成答案。
代码实现:构建向量数据库
ini
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, encoding='utf-8')
docs = loader.load()
# 2. 文本切分 (chunk_size: 块大小, chunk_overlap: 重叠字符数)
text_splitter = CharacterTextSplitter(separator='\n', chunk_size=150, chunk_overlap=30)
split_texts = text_splitter.split_documents(docs)
# 3. 存入向量数据库
vectorDB = Chroma.from_documents(
documents=split_texts,
embedding=embedding,
persist_directory=persist_directory
)
return vectorDB.as_retriever(search_kwargs={'k': 2}) # 返回检索器,k=2表示返回2个最相关文档
👕 第二部分:智能衣答系统核心逻辑------精准推荐尺码
这是本项目的最核心部分。我们需要让模型根据用户提供的身高体重,去检索本地知识库中的尺码规则。
附件中的核心数据逻辑(模拟衣服属性.txt):
- 身高160-170cm,体重90-115斤 -> M码
- 身高165-175cm,体重115-135斤 -> L码
- 身高170-178cm,体重130-150斤 -> XL码
- ... (以此类推)
代码实现:问答链 (qa_chain.py)
这里我们使用LCEL (LangChain Expression Language) 语法,这是目前最优雅的写法。
ini
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(
context=itemgetter("question") | retriever, # 检索相关文档
chat_history=itemgetter("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 列表,每次问答后都追加进去。
python
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.py
python
import 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很关键,太小了丢失上下文,太大了检索不准。 - 拥抱LCEL:LangChain的新语法LCEL是未来的标准,写起来更简洁,逻辑更清晰。
如果你觉得这篇文章对你有帮助,希望点赞、收藏、关注!你的支持是我持续输出硬核内容的最大动力!