LangChain + RAG 实战(三):构建第一个 RAG Chain

创作者: Yardon | GitHub: github.com/YardonYan | 版本: v1.0 |



LCEL:LangChain 的链式语法

LCEL(LangChain Expression Language)让链式调用变得像搭积木:

python 复制代码
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser

prompt = ChatPromptTemplate.from_template("用{language}写一个{task}的函数")
chain = prompt | llm | StrOutputParser()

result = chain.invoke({
    "language": "Python",
    "task": "计算 Fibonacci 数列"
})

检索增强生成 (RAG) Chain

python 复制代码
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

# RAG prompt
prompt = ChatPromptTemplate.from_template("""
基于以下上下文回答用户的问题。如果上下文中没有相关信息,请如实说不知道。

上下文:\n{context}\n

问题:{input}

回答:
""")

doc_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, doc_chain)

result = rag_chain.invoke({"input": "useEffect 的依赖数组是什么意思?"})
print(result["answer"])

带来源引用的 RAG

python 复制代码
result = rag_chain.invoke({"input": "React Hooks 的类型"})

print(result["answer"])
print("\n--- 参考来源 ---")
for i, doc in enumerate(result["context"], 1):
    print(f"[{i}] {doc.metadata.get('source', '未知来源')}")

Streamlit 快速搭一个 RAG 界面

python 复制代码
import streamlit as st

# 加载向量数据库(缓存避免每次刷新重建)
@st.cache_resource
def get_vectordb():
    return Chroma(persist_directory="./chroma_db", embedding_function=embeddings)

# 构建 RAG
st.title("📚 企业知识库问答")
question = st.text_input("输入你的问题...")
if question:
    with st.spinner("搜索中..."):
        result = rag_chain.invoke({"input": question})
    st.markdown(f"**答案:** {result['answer']}")
    st.write("---")
    for i, doc in enumerate(result["context"], 1):
        st.caption(f"[{i}] 来源: {doc.metadata.get('source', '?')}")

本章小结

概念 要点
LCEL `
create_retrieval_chain 检索+生成的完整 RAG 管道
Streamlit 15 分钟搭一个 RAG UI

📌 创作者: Yardon | 🏠 个人网站: GlimmerAI.top

📖 本章是「LangChain + RAG 实战」系列的第 3 章。

🌟 欢迎大家来观看!