LangChain1.0实战之多模态RAG系统(一)——多模态RAG系统核心架构及智能问答功能开发

前言

上篇分享 《LangChain1.0速通指南(三)------LangChain1.0 create_agent API 高阶功能》 中,笔者深入解析了 LangChain 1.0 的 create_agent API,重点介绍了 MCP 协议工具集成、结构化输出、记忆管理和中间步中间件机制四大核心能力。通过高德地图 MCP 接入、动态模型选择等实战案例,展示了如何构建具备外部工具调用、记忆保持与流程可控的智能体应用。

掌握了基础知识后,要想检验自己对 LangChain 1.0 的理解,并进一步提升开发能力,最好的方式莫过于通过实际项目来锤炼技能。从本期开始,笔者将推出一个完整的实战系列------ 《LangChain1.0 搭建多模态 RAG 知识库》 ,覆盖从前端到后端的全流程开发。在本系列中笔者将分享:

  • LangChain1.0 多模态智能体的基本开发流程
  • LangChain1.0 文档处理与向量库构建技巧
  • 基于 FastAPI 的后端服务开发
  • 使用 React 构建现代化前端界面

作为系列的第一篇,本文将从整体架构出发,系统介绍多模态 RAG 系统的核心组成与技术栈选择。后续文章将逐步拆解 LangChain + FastAPI 后端的关键模块,带领大家从零搭建完整的系统。

本系列内容适合所有对 LangChain 感兴趣的学习者,无论之前是否接触过 LangChain。当然,如果大家已经学习过我的专栏《深入浅出LangChain&LangGraph AI Agent 智能体开发》,相信可以更快上手。该专栏基于笔者在实际项目中的深度使用经验,系统讲解了使用LangChain/LangGraph如何开发智能体,目前已更新 26 讲,并持续补充实战与拓展内容。欢迎感兴趣的同学关注笔者的掘金账号与专栏,也可关注笔者的同名微信公众号 大模型真好玩 ,每期分享涉及的代码均可在公众号私信: LangChain智能体开发免费获取。

一、多模态RAG系统核心架构与技术栈

首先介绍本系列项目的核心架构,本项目构建的是一个多模态RAG智能对话系统 ,支持文本、图像、音频、PDF等多种格式的输入,具备智能问答图片分析音频转写PDF解析 四大核心功能。为体现企业级智能体系统的开发标准,本项目采用前后端分离的现代化架构,帮助大家理解真实场景中的系统设计与开发流程。整体架构如下所示:

在基于 LangChain 1.0 的后端开发中,笔者将实现四个功能独立的智能体模块,分别对应不同的多模态输入处理任务:

尽管本项目离真正的生产级别系统仍有差异,但通过实现多模态输入的基本处理流程、系统架构的设计规划、LangChain 1.0 核心特性的应用,以及项目的整体架构与部署实践,相信大家能够系统掌握构建现代多模态 RAG 系统的关键技能,为开发更复杂的应用打下基础。

二、核心功能讲解方式

由于篇幅限制,笔者无法逐行解析所有代码细节,但将通过以下方式确保大家的学习效果:

  • 提供完整源码:所有代码将完整开放,供大家随时查阅和运行
  • 重点剖析架构:着重讲解各智能体的功能设计与构建方法
  • 掌握核心逻辑:帮助大家深入理解项目架构与关键技术实现

具体分享安排如下:

  1. 智能体开发循序渐进
    从最基础的智能问答智能体入手,逐步扩展到图片解析、音频处理、PDF解析等复杂场景,并同步讲解如何通过 FastAPI 对智能体功能进行服务化封装。
  2. 前端开发与交互原理
    解析现代化前端组件的开发流程,重点介绍大模型智能问答场景下前端与后端的核心交互机制。
  3. 项目部署实战
    带领大家完成前后端应用的本地部署,确保项目能够完整运行。

接下来,笔者就从最基础的智能问答智能体开始,深入讲解其实现原理与开发过程。

三、智能问答智能体搭建

作为多模态RAG系统的核心基础,智能问答功能是处理文本、图像、音频和PDF等各类输入的通用能力。本节将从零开始构建智能问答智能体。

3.1 智能问答智能体后端搭建

1. 环境配置与依赖引入

首先引入必要的依赖包,确保具备LangChain、FastAPI等核心库的支持。

python 复制代码
import json
import uvicorn

from typing import List, Dict, Any, AsyncGenerator
from datetime import datetime
from pydantic import BaseModel, Field

from fastapi import HTTPException, FastAPI
from fastapi.responses import StreamingResponse
from fastapi.middleware.cors import CORSMiddleware

from langchain.chat_models import init_chat_model
from langchain.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.messages import BaseMessage

2. 多模态模型初始化

为处理多模态数据,笔者选用阿里巴巴通义千问于2025年9月发布的全模态模型Qwen3-Omni-30B-A3B-Instruct ,通过硅基流动提供的API接口进行接入。langchain接入硅基流动大模型的方法同样使用init_chat_model api, 不熟悉的读者可以看笔者文章: 深入浅出LangChain AI Agent智能体开发教程(二)---LangChain接入大模型

python 复制代码
def get_chat_model():
    try:
        model = init_chat_model(
            model="Qwen/Qwen3-Omni-30B-A3B-Instruct",  
            model_provider="openai",  
            base_url="https://api.siliconflow.cn/v1/",  
            api_key="你注册的硅基流动api key",  
        )
        return model
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"模型初始化失败: {str(e)}")

3. 数据结构定义

使用Pydantic严格定义请求和响应的数据格式,确保类型安全:对于pydantic使用不熟悉的读者可参考笔者的文章:深入浅出LangGraph AI Agent智能体开发教程(六)---LangGraph 底层API入门。这里通过ContentBlock统一封装多模态数据,使用type字段区分数据类型,为后续扩展预留接口。

python 复制代码
class ContentBlock(BaseModel):
    type: str = Field(description="内容类型: text, image, audio")
    content: str = Field(description="内容数据")


class MessageRequest(BaseModel):
    content_blocks: List[ContentBlock] = Field(default=[], description="内容块")
    history: List[Dict[str, Any]] = Field(default=[], description="对话历史")


class MessageResponse(BaseModel):
    content: str
    timestamp: str
    role: str

4. 多模态消息构建

将前端请求转换为LangChain可识别的消息格式:

python 复制代码
def create_multimodal_message(request: MessageRequest) -> HumanMessage:
    """创建多模态消息"""
    message_content = []

    # 处理内容块
    for i, block in enumerate(request.content_blocks):
        if block.type == "text":
            message_content.append({
                "type": "text",
                "text": block.content
            })

    return HumanMessage(content=message_content[0]["text"])

5. 对话历史管理

维护完整的对话上下文,确保智能体具备记忆能力:

python 复制代码
def convert_history_to_messages(history: List[Dict[str, Any]]) -> List[BaseMessage]:
    """将历史记录转换为 LangChain 消息格式,支持多模态内容"""
    messages = []

    # 添加系统消息
    system_prompt = """
    你是一个专业的多模态 RAG 助手,具备与用户对话的能力, 请以专业、准确、友好的方式回答用户所提问题。
    """

    messages.append(SystemMessage(content=system_prompt))

    # 转换历史消息
    for i, msg in enumerate(history):
        content = msg.get("content", "")
        content_blocks = msg.get("content_blocks", [])
        message_content = []
        if msg["role"] == "user":
            for block in content_blocks:
                if block.get("type") == "text":
                    message_content.append({
                        "type": "text",
                        "text": block.get("content", "")
                    })
            messages.append(HumanMessage(content=message_content))
        elif msg["role"] == "assistant":
            messages.append(AIMessage(content=content))

    return messages

6. 流式响应生成

实现实时响应的流式输出机制,注意流式响应需要用到python的生成器yield机制,大家不熟悉可学习廖雪峰老师相关课程 liaoxuefeng.com/books/pytho...

python 复制代码
async def generate_streaming_response(
        messages: List[BaseMessage]
) -> AsyncGenerator[str, None]:
    """生成流式响应"""
    try:
        model = get_chat_model()
        # 创建流式响应
        full_response = ""

        chunk_count = 0
        async for chunk in model.astream(messages):
            chunk_count += 1
            if hasattr(chunk, 'content') and chunk.content:
                content = chunk.content
                full_response += content

                # 直接发送每个chunk的内容,避免重复
                data = {
                    "type": "content_delta",
                    "content": content,
                    "timestamp": datetime.now().isoformat()
                }
                yield f"data: {json.dumps(data, ensure_ascii=False)}\n\n"

        # 发送完成信号
        final_data = {
            "type": "message_complete",
            "full_content": full_response,
            "timestamp": datetime.now().isoformat(),
        }
        yield f"data: {json.dumps(final_data, ensure_ascii=False)}\n\n"
    except Exception as e:
        error_data = {
            "type": "error",
            "error": str(e),
            "timestamp": datetime.now().isoformat()
        }
        yield f"data: {json.dumps(error_data, ensure_ascii=False)}\n\n"

7. 流式聊天接口

提供实时交互的流式API端点:

python 复制代码
async def chat_stream(request: MessageRequest):
    """流式聊天接口(支持多模态)"""
    try:
        # 转换消息历史
        messages = convert_history_to_messages(request.history)

        # 添加当前用户消息(支持多模态)
        current_message = create_multimodal_message(request)
        messages.append(current_message)

        # 返回流式响应
        return StreamingResponse(
            generate_streaming_response(messages),
            media_type="text/plain",
            headers={
                "Cache-Control": "no-cache",
                "Connection": "keep-alive",
                "Content-Type": "text/event-stream",
            }
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

8. 同步聊天接口

为简单场景提供一次性响应的同步接口:

python 复制代码
async def chat_sync(request: MessageRequest):
    """同步聊天接口(支持多模态)"""
    try:
        # 转换消息历史
        messages = convert_history_to_messages(request.history)

        # 添加当前用户消息(支持多模态)
        current_message = create_multimodal_message(request)
        messages.append(current_message)

        # 获取模型响应
        model = get_chat_model()
        response = await model.ainvoke(messages)

        return MessageResponse(
            content=response.content,
            role="assistant",
            timestamp=datetime.now().isoformat(),
        )

    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

3.2 FastAPI后端服务封装

FastAPI是基于Python标准类型提示的现代Web框架,以其卓越的性能和开发效率著称。FastAPI底层基于 Starlette (用于 Web 微服务)和 Pydantic (用于数据验证),它的名字就揭示了其核心特点:Fast (快速)和 API。下面笔者将智能体功能封装为完整的API服务:

1. 应用初始化与CORS配置

python 复制代码
app = FastAPI(
    title="多模态 RAG 工作台 API",
    description="基于 LangChain 1.0 的智能对话 API",
    version="1.0.0"
)

# 配置跨域访问
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

2. API路由注册

@app.get@app.post是FastAPI的路径操作装饰器,它们告诉 FastAPI 下面的函数处理哪个路径和哪种 HTTP 方法。我们需要将chat_streamchat_sync方法使用路径操作装饰器包装,使得可以访问api接口得到结果:

python 复制代码
@app.post("/api/chat/stream")
async def chat_stream(request: MessageRequest):


@app.post("/api/chat")
async def chat_sync(request: MessageRequest):

3. 创建应用

python 复制代码
if __name__ == "__main__":
    uvicorn.run(
        app,
        host="localhost",
        port=8000
    )

至此,笔者完成了智能问答智能体的核心后端搭建。在后续章节中,将基于此基础逐步扩展图片解析、音频处理等更多模态的智能体能力。

四、使用 Postman 测试接口正确性

为确保智能问答智能体功能正常运行,笔者使用 Postman 对 API 接口进行完整测试。

4.1 测试单轮对话

1. 首先运行主程序启动服务端:

python main.py运行代码文件,服务正常启动后,显示如下结果

2. 配置 Postman 请求

  1. 创建新请求

    • 方法:POST
    • URL:http://localhost:8000/api/chat/stream
  2. 设置请求头

    • 添加 Content-Typeapplication/json
  1. 在 Body 中填入测试数据,验证基础问答功能,点击 Send 发送请求后,Postman 将展示流式响应效果:
json 复制代码
{
  "content_blocks": [
    {
      "type": "text",
      "content": "什么是人工智能?"
    }
  ],
  "history": []
}
  1. 响应说明 :流式接口会实时返回多个数据块(content_delta),最终会返回完整响应内容(message_complete),此结果证明智能问答接口运行正常

4.2 多轮对话测试

验证对话历史记忆功能,使用包含上下文的测试数据:

json 复制代码
{
  "content_blocks": [
    {
      "type": "text",
      "content": "你好我叫什么名字?"
    }
  ],
  "history": [
    {
      "role": "user",
      "content_blocks": [
        {
          "type": "text",
          "content": "你好,我是苍进空"
        }
      ]
    },
    {
      "role": "assistant",
      "content": "你好!我是多模态 RAG 助手,很高兴为您服务。"
    }
  ]
}

测试结果如下,可以看到多模态大模型完全记着笔者刚才的提问,准确说出了名字:苍进空!

以上就是我们今天要分享的全部内容啦!

五、总结

本文系统介绍了基于LangChain 1.0开发多模态RAG系统的核心架构,通过前后端分离架构,构建支持文本、图像、音频和PDF处理的四大功能模块。同时编写完成智能问答基础模块的开发工作,实现了对话历史管理和流式响应,并使用Postman完成接口测试验证。本实战项目为后续扩展更复杂的多模态应用奠定了坚实基础。下一期笔者将分享如何实现图片分析和语音转写相关工作,大家敬请期待~

《深入浅出LangChain&LangGraph AI Agent 智能体开发》专栏内容源自笔者在实际学习和工作中对 LangChain 与 LangGraph 的深度使用经验,旨在帮助大家系统性地、高效地掌握 AI Agent 的开发方法,在各大技术平台获得了不少关注与支持。目前已更新27讲,正在更新实战篇和LangChain1.0实战项目多模态RAG系统开发,并随时补充笔者在实际工作中总结的拓展知识点。如果大家感兴趣,欢迎关注笔者的掘金账号与专栏,也可关注笔者的同名微信公众号 大模型真好玩 ,每期分享涉及的代码均可在公众号私信: LangChain智能体开发免费获取。

相关推荐
聚梦小课堂2 小时前
2025.11.16 AI快讯
人工智能·安全·语言模型
Mintopia3 小时前
🚀 Trae 国际版 Max 模型升级:算力与智能的共舞
前端·人工智能·trae
Mintopia3 小时前
🌍 WebAIGC的高算力消耗:技术优化与绿色计算路径
前端·人工智能·trae
kupeThinkPoem3 小时前
代码生成工具GitHub Copilot介绍
人工智能
aneasystone本尊3 小时前
重温 Java 21 之结构化并发
人工智能
咚咚王者3 小时前
人工智能之数据分析 numpy:第四章 数组属性和数据类型
人工智能·数据分析·numpy
bubiyoushang8883 小时前
基于MATLAB的马尔科夫链蒙特卡洛(MCMC)模拟实现方法
人工智能·算法·matlab
HillVue3 小时前
重估百度,也是在重估 AI 的未来
大数据·人工智能·sqlite
是Dream呀4 小时前
一个账号调用N个AI模型!从LLM到视频生成的丝滑解决方案
人工智能·大模型·aigc·音视频·deepseek