惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
量子位
博客园 - 聂微东
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
GbyAI
GbyAI
MyScale Blog
MyScale Blog
IT之家
IT之家
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
The Register - Security
The Register - Security
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
雷峰网
雷峰网
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 叶小钗
D
DataBreaches.Net
B
Blog
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
腾讯CDC
T
Threat Research - Cisco Blogs
SecWiki News
SecWiki News
Martin Fowler
Martin Fowler
D
Docker
Cisco Talos Blog
Cisco Talos Blog
T
Tenable Blog
Webroot Blog
Webroot Blog
宝玉的分享
宝玉的分享

博客园 - 哥本哈士奇(aspnetx)

Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建 SQL Server RAG 笔记1:图数据库构建 Neo4j 笔记(四):一篇文章如何入库的 数据仓库笔记 第六篇:PSA 层 SCD2 处理方式 数据仓库笔记 第五篇:Data Mart 层(数据集市) 数据仓库笔记 第四篇:Star Schema 层(维度建模) 数据仓库笔记 第三篇:常用缓慢变化维处理方式介绍 数据仓库笔记 第二篇:PSA 层(持久化暂存区)详解 数据仓库笔记 第一篇:数据仓库的定义、历史与意义 Neo4j 笔记(三):数据建模与程序连接实战 Neo4j 基础教程(二):Cypher CRUD 完全指南 Neo4j 基础教程(一):安装与快速入门 Power BI学习笔记第20篇:面试题汇总 · 第三篇:高级应用与最佳实践篇 Power BI学习笔记第19篇:面试题汇总 · 第二篇:数据建模与 DAX 篇 Power BI学习笔记第18篇:面试题汇总 · 第一篇:基础概念篇 Power BI学习笔记第15篇:企业级报表开发与最佳实践 Power BI学习笔记第13篇:高级可视化与自定义图表 Power BI学习笔记第14篇:Power Query 高级数据处理 Power BI学习笔记第12篇:DAX 高级计算与性能优化 Power BI学习笔记第11篇:高级数据建模与关系设计 Power BI学习笔记第10篇:实战案例 — 销售数据分析仪表板 Power BI学习笔记第08篇:报表交互与筛选器 Power BI学习笔记第09篇:Power BI Service 发布与共享 Power BI学习笔记第07篇:可视化图表设计与最佳实践 Power BI学习笔记第06篇:DAX 进阶:时间智能与复杂计算 Power BI学习笔记第05篇:DAX 基础:计算列与度量值 Power BI学习笔记第04篇:数据建模与关系管理 Power BI学习笔记第03篇:Power Query 数据清洗与转换 Power BI学习笔记第02篇:数据获取与连接数据源 Power BI学习笔记第01篇:Power BI 简介与环境搭建 Power BI Dashboard 常用布局方案推荐 Power BI 示例一览 OpenClaw 核心八大 MD 文件 Microsoft Agent Framework 智能体调用工具 Microsoft Agent Framework 创建智能体 一个简单案例理解OpenClaw的做梦过程 SQLAlchemy 学习笔记 LangChain RAG索引与查询 - 学习笔记 LangChain使用deep agent并且加载SKILL 本地系统对接大模型智能体的若干尝试 财务分析报告 - 常用Power BI DAX公式详解 用SKILL实现请假流程信息收集 使用小龙虾来操作猿编程的遥控车 使用OpenClaw的Skills对接本地系统 OpenClaw必装Skill全指南 Dify Agentic RAG 笔记 # 简单的神经网络计算过程 - 正负判断 使用Gradio构建AI前端 - RAG的QA模块 使用Gradio构建AI前端 - RAG召回测试 利用AI Agent,辅助销售团队制定培训和考试内容 实现AI和BI整合的初步思路和探索-Part3 实现AI和BI整合的初步思路和探索-Part2 实现AI和BI整合的初步思路和探索 以《出师表》作为例子,对比通用分块和父子分块的区别 LangChain RAG 学习笔记:从文档加载到问答服务 记录无法修改OneDrive文件的解决方法 Power BI制作指标达成跟踪器 Power BI学习笔记-周报销售数据分析
Streamlit + LangChain 1.0 简单实现智能问答前后端
哥本哈士奇(aspnet · 2025-12-18 · via 博客园 - 哥本哈士奇(aspnetx)

Streamlit + LangChain 1.0 简单实现智能问答前后端

概述

Streamlit 是一款专为数据科学家和机器学习工程师设计的 Python 库,可快速将数据脚本转换为交互式 Web 应用,无需前端开发经验,所以最近研究了一下,结合LangChain 1.0 实现了简单的智能问答前后端应用,大模型使用DeepSeek。

依赖库

  • streamlit:用于构建Web交互界面
  • langchain 及相关组件:处理LLM交互逻辑
  • python-dotenv:加载环境变量,比如加载存储在配置文件中的API KEY。

Highlight code

1. 初始化配置

# 加载环境变量
load_dotenv()

# 配置页面
st.set_page_config(
    page_title="DeepSeek 问答应用",
    page_icon="🤖",
    layout="wide",
    initial_sidebar_state="expanded"
)
  • 使用 load_dotenv() 加载 .env 文件中的环境变量
  • st.set_page_config() 配置页面基本属性,包括标题、图标和布局

2. 页面UI构建

# 设置页面标题和说明
st.title("🤖 DeepSeek 智能问答应用")
st.markdown("使用 LangChain 1.0 和 Streamlit 构建的对话系统")
  • 通过 st.title()st.markdown() 设置页面标题和说明文字

3. 侧边栏配置

with st.sidebar:
    st.header("配置选项")
    # API 密钥配置
    deepseek_api_key = st.text_input(
        "DeepSeek API Key",
        value=os.getenv("DEEPSEEK_API_KEY", ""),
        type="password",
        help="请输入您的 DeepSeek API Key"
    )
    # 清除对话历史按钮
    if st.button("清除对话历史", type="secondary"):
        st.session_state["messages"] = []
        st.rerun()
  • 使用 st.sidebar 创建侧边栏配置区域
  • 提供API密钥输入框(密码类型),默认从环境变量获取
  • 实现清除对话历史功能,通过操作 st.session_state 实现

4. 对话历史管理

# 初始化对话历史
if "messages" not in st.session_state:
    st.session_state["messages"] = []

# 显示对话历史
for message in st.session_state["messages"]:
    if isinstance(message, HumanMessage):
        with st.chat_message("user"):
            st.markdown(message.content)
    elif isinstance(message, AIMessage):
        with st.chat_message("assistant"):
            st.markdown(message.content)
  • 使用 st.session_state 存储对话历史,实现页面刷新后数据保留
  • 区分用户消息(HumanMessage)和助手消息(AIMessage)并分别显示

5. 用户输入处理

user_input = st.chat_input("请输入您的问题...")

if user_input:
    # 验证API密钥
    if not deepseek_api_key:
        st.error("请在侧边栏配置您的 DeepSeek API Key")
        st.stop()
    
    # 添加用户消息到会话历史
    st.session_state["messages"].append(HumanMessage(content=user_input))
    
    # 显示用户消息
    with st.chat_message("user"):
        st.markdown(user_input)
  • 使用 st.chat_input() 获取用户输入
  • 进行API密钥验证,确保调用模型前密钥已配置
  • 将用户消息添加到历史记录并显示

6. AI响应生成

# 显示助手思考中状态
with st.chat_message("assistant"):
    with st.spinner("正在思考..."):
        chat_model=init_chat_model(model="deepseek:deepseek-chat")
        
        # 创建提示模板
        prompt = ChatPromptTemplate.from_messages([
            ("system", "你是一个智能助手,使用中文回答用户问题,保持友好和专业。"),
            *st.session_state["messages"]
        ])
        
        # 创建链
        chain = prompt | chat_model | StrOutputParser()
        
        try:
            # 生成回答
            response = chain.invoke({})
            
            # 显示回答
            st.markdown(response)
            
            # 添加助手消息到会话历史
            st.session_state["messages"].append(AIMessage(content=response))
            
        except Exception as e:
            st.error(f"请求失败: {str(e)}")
            st.error("请检查您的API密钥或网络连接")
  • 使用 st.spinner() 显示加载状态,提升用户体验
  • 通过 init_chat_model() 初始化DeepSeek模型
  • 使用LangChain 1.0的链(Chain)语法:prompt | chat_model | StrOutputParser()
  • 异常处理确保错误时能友好提示用户

关键技术点

  1. Streamlit 会话状态:利用 st.session_state 保存对话历史,实现状态管理
  2. LangChain 1.0 链语法:采用新的管道运算符 | 构建处理流程
  3. 消息类型区分:使用 HumanMessageAIMessage 区分不同角色的消息
  4. API 密钥管理:支持环境变量和手动输入两种方式配置API密钥
  5. 错误处理:完善的异常捕获和用户提示

运行

streamlit run LC_RAG_07a_Streamlit.py

run后面替换成自己的文件名就可以启动运行。
完整版本的代码可以在如下位置找到:
https://github.com/microsoftbi/Langchain_DEMO/blob/main/RAG/LC_RAG_07a_Streamlit.py

后记

相对Vue,steamlit的学习成本更低一些。适合独立的开发和学习。但是在生产中主流还是更推荐Vue等前端框架,尤其在细节的前端定制化开发中。
后续可以扩充下比如streamlit如何响应langchain的middleware等功能,比如HITL。