Skip to content

实战案例:智能聊天机器人

从零搭建一个基于 RAG 的智能聊天机器人,能够回答关于你项目的问题。

功能目标

  • 用户提问 → 机器人回答
  • 回答基于项目文档(不瞎编)
  • 支持多轮对话(有上下文记忆)
  • Web 界面

技术栈

前端:Streamlit(快速原型)
后端:LangChain + RAG
LLM:GPT-4o(或本地 Ollama)
向量数据库:Chroma(本地)或 Pinecone(云端)
Embedding:OpenAI text-embedding-3

实现步骤

第 1 步:准备知识库

python
# 1. 加载项目文档
from langchain.document_loaders import DirectoryLoader

loader = DirectoryLoader("docs/", glob="**/*.md")
documents = loader.load()

# 2. 切片
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
docs = splitter.split_documents(documents)

print(f"共 {len(docs)} 个文档片段")

第 2 步:构建向量库

python
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

vectorstore = Chroma.from_documents(
    docs,
    OpenAIEmbeddings(),
    persist_directory="./chroma_db"
)

# 持久化(下次直接加载,不用重新构建)
vectorstore.persist()

第 3 步:创建 RAG Chain

python
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    return_source_documents=True
)

# 测试
result = qa_chain("项目的部署方式有哪些?")
print(result["result"])
print(result["source_documents"])  # 查看引用来源

第 4 步:添加多轮对话记忆

python
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

chat_chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=vectorstore.as_retriever(),
    memory=memory
)

# 多轮对话
chat_chain({"question": "项目用什么框架?"})
chat_chain({"question": "它的版本是多少?"})  # 能理解"它"指框架

第 5 步:Web 界面(Streamlit)

python
# app.py
import streamlit as st
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# 加载向量库
vectorstore = Chroma(
    persist_directory="./chroma_db",
    embedding_function=OpenAIEmbeddings()
)

# 初始化 Chain
if "chain" not in st.session_state:
    memory = ConversationBufferMemory(
        memory_key="chat_history",
        return_messages=True
    )
    st.session_state.chain = ConversationalRetrievalChain.from_llm(
        ChatOpenAI(),
        vectorstore.as_retriever(),
        memory=memory
    )

st.title("📚 项目文档助手")

user_input = st.chat_input("问点什么...")
if user_input:
    response = st.session_state.chain({"question": user_input})
    st.write(response["answer"])

运行:

bash
streamlit run app.py

优化建议

1. 让回答更有引用

python
# 在 Prompt 中要求引用来源
prompt_template = """
根据以下资料回答问题。如果资料中没有答案,请说"不知道"。
回答时,注明信息来源(文件名)。

资料:
{context}

问题:{question}
"""

2. 处理"资料中没有"的情况

python
# 设置不相关文档的阈值
retriever = vectorstore.as_retriever(
    search_kwargs={"k": 5, "score_threshold": 0.7}
)

3. 添加 Feedback 机制

python
# 让用户点👍👎,收集数据用于优化
if st.button("👍"):
    save_feedback(user_input, response, "good")

部署

bash
# 本地运行
streamlit run app.py

# 部署到 Streamlit Cloud(免费)
# 1. 推代码到 GitHub
# 2. 访问 share.streamlit.io
# 3. 连接 GitHub 仓库,部署

相关资源