深度解密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是未来的标准,写起来更简洁,逻辑更清晰。

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

相关推荐
文歌子2 小时前
MCP 协议:AI 地学工具链的通用胶水
llm·mcp
lhxcc_fly2 小时前
3.LangChain组件--消息
langchain·llm·messages
虾..3 小时前
大模型认识
人工智能·llm·rag
千桐科技18 小时前
qKnow 智能体构建平台开源版 2.1.1 正式发布!优化非结构化抽取、知识库召回,全面升级系统稳定性与交互体验
大模型·llm·工作流·qknow·智能体构建平台
还有多久拿退休金19 小时前
LLM应用开发二:让AI学会"翻书"——RAG检索增强从踩坑到跑通
前端·llm
Aiden_SHU21 小时前
Agent knowledge-base & Code-base
llm·knowledge base·code base
OpenBayes贝式计算21 小时前
教程上新丨单卡即可爆改,面壁智能等开源MiniCPM-V-4.6,1.3B端侧模型支持图像理解/视频理解/OCR/多轮多模态对话
人工智能·深度学习·llm
codefan※21 小时前
一键部署私人 LLM:Ollama + Docker 极简指南
运维·docker·容器·大模型·llm·本地部署·ollama
龙骑士baby1 天前
重建 AI 认知第 3 篇:Prompt Engineering——怎么让 AI 听懂你的话
ai·大模型·llm·prompt