19-LCEL问答链:构建流式AI对话系统

22 阅读1分钟

LCEL问答链:构建流式AI对话系统

前言

LCEL(LangChain Expression Language)是LangChain的核心,让构建AI链变得简单优雅。

适合读者: AI工程师、后端开发者


一、LCEL基础

from langchain.prompts import PromptTemplate
from langchain_community.llms import Ollama
from langchain.schema.output_parser import StrOutputParser

# 1. 创建组件
prompt = PromptTemplate.from_template("请用{language}回答:{question}")
llm = Ollama(model="qwen2.5:7b")
output_parser = StrOutputParser()

# 2. 组装链(使用管道操作符)
chain = prompt | llm | output_parser

# 3. 执行
result = chain.invoke({"language": "中文", "question": "什么是RAG?"})

二、RAG链

from langchain.schema.runnable import RunnablePassthrough

# 创建RAG链
rag_chain = (
    {
        "context": vectorstore.as_retriever() | format_docs,
        "question": RunnablePassthrough()
    }
    | prompt
    | llm
    | StrOutputParser()
)

def format_docs(docs):
    return "\n\n".join([doc.page_content for doc in docs])

# 使用
answer = rag_chain.invoke("如何重置密码?")

三、流式执行

# 同步流式
for chunk in rag_chain.stream("如何重置密码?"):
    print(chunk, end="", flush=True)

# 异步流式
async for chunk in rag_chain.astream("如何重置密码?"):
    print(chunk, end="", flush=True)

四、批量执行

questions = [
    "如何重置密码?",
    "如何修改邮箱?",
    "如何注销账号?"
]

# 批量执行
answers = rag_chain.batch(questions)

五、完整示例

from fastapi import FastAPI
from fastapi.responses import StreamingResponse

app = FastAPI()

@app.post("/chat/stream")
async def chat_stream(question: str):
    async def event_generator():
        async for chunk in rag_chain.astream(question):
            yield f"data: {chunk}\n\n"
    
    return StreamingResponse(
        event_generator(),
        media_type="text/event-stream"
    )

下一篇预告: 《Docker容器化:一键部署完整AI系统》