深度解密LangChain与RAG:从零构建智能衣答系统,掌握大模型本地知识库的终极奥义

大家好,我是你们的技术伙伴。👋

在2026年的今天,大模型(LLM)已经渗透到我们生活的方方面面。但在实际业务中,我们经常面临一个痛点:如何让通用的大模型精准地理解特定领域的"黑话"? 比如,在电商卖衣服时,客户问"我170高,140斤穿什么码?",模型如果不懂你的库存尺码表,回答就是胡扯。

今天,我将基于PythonLangChain 框架,带你从零构建一套 "智能衣答系统" 。我们将利用RAG(检索增强生成) 技术,让模型在没有经过专业微调的情况下,也能具备顶级服装销售专家的分析能力。

核心内容概览:

  1. RAG核心架构:索引、检索、生成,三步走通本地知识库。
  2. 智能尺码推荐:基于本地文档的精准匹配,不再是瞎猜。
  3. 对话记忆维护:让AI记住你的喜好,实现连贯对话。
  4. Streamlit可视化:快速构建Web界面,让Demo跑起来。

🧠 第一部分:RAG架构------给大模型一本"参考书"

很多初学者觉得大模型"不好用",其实是因为它在"裸奔"------只有预训练时的知识,没有你当下的业务数据。RAG(检索增强生成) 就是解决这个问题的银弹。

工作流程:

  1. 索引(Indexing) :把你的衣服属性文档(TXT/PDF)切分成小块,转化为向量,存入向量数据库。
  2. 检索(Retrieval) :当用户提问时,把问题也转化为向量,在数据库里找最相似的Top-K个片段。
  3. 生成(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 EngineeringRAGLangChain,就让大模型具备了专业的服装销售能力。

给读者的建议:

  1. 数据是核心:RAG的效果70%取决于你的本地文档质量。把尺码表、材质说明整理好。
  2. 多试切分参数chunk_sizechunk_overlap 很关键,太小了丢失上下文,太大了检索不准。
  3. 拥抱LCEL:LangChain的新语法LCEL是未来的标准,写起来更简洁,逻辑更清晰。

如果你觉得这篇文章对你有帮助,希望点赞、收藏、关注!你的支持是我持续输出硬核内容的最大动力!

相关推荐
黄忠17 小时前
大模型之LangGraph技术体系
python·llm
不好听61317 小时前
Tool:让大模型长出手脚
llm·agent
Lei活在当下1 天前
【AI手记系列-2026/6/18】iSparto & Harness,Caveman 以及AI时代的生存指南
人工智能·llm·openai
冬奇Lab1 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
得物技术2 天前
从埋点需求到规则资产:Hermes Agent 重构得物数仓工作流
大数据·llm·ai编程
柒和远方2 天前
LangGraph 深度解析:从增强型 LLM 到生产级 Agent
langchain·llm·agent
AINative软件工程2 天前
AI Agent 的 Tool Schema 设计工程实践:函数签名写差了,调用成功率能差 30%
llm
冬奇Lab2 天前
Agent 系列(21):Harness 测试工程——45 个测试怎么设计,以及它发现了什么 bug
人工智能·llm·agent
harykali3 天前
Hello-ROCm:Gemma4微调 #Datawhale #AMDev
人工智能·llm
DigitalOcean3 天前
砍掉 60% AI 推理成本:深度解构 DigitalOcean 推理路由器的 MoE 门控与智能分流机制
llm·aigc·agent