创作者: 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 章。
🌟 欢迎大家来观看!