主题
实战案例:智能聊天机器人
从零搭建一个基于 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 仓库,部署