Streamlit简介

https://docs.streamlit.io/
Streamlit 是一个开源的 Python 库,专门用于快速构建和部署数据科学和机器学习相关的交互式 Web 应用。它的核心目标是让开发者无需前端知识(如 HTML、CSS、JavaScript),仅用 Python 就能创建功能丰富、可视化的 Web 应用。

核心特点

(1)极简开发
  • 用纯 Python 编写,无需学习前端框架。
  • 通过简单的函数调用(如 st.write()st.slider())即可生成 UI 组件。

  • 自动实时更新:修改代码后保存,页面会即时刷新。
(2)丰富的内置组件
  • 基础组件

    文本、按钮、输入框、滑块、文件上传等。

  • 数据展示

    表格、图表(支持 Matplotlib、Plotly、Altair 等)。

  • 布局控制

    侧边栏、分栏、多页应用。

  • 多媒体支持

    图片、音频、视频嵌入。

(3)无缝集成生态
  • 与主流数据科学库(Pandas、NumPy、Scikit-learn)兼容。
  • 支持机器学习框架(TensorFlow、PyTorch)。
  • 可结合 LangChain、OpenAI 等构建 AI 应用(如聊天机器人、文档问答)。
(4)一键部署
  • 支持快速部署到 Streamlit Community Cloud、Hugging Face Spaces 或私有服务器。

使用Streamlit结合Langchain的基础使用

https://docs.streamlit.io/develop/tutorials/chat-and-llm-apps/llm-quickstart

streamlit安装

pip install streamlit langchain-openai

编辑代码

新建一个「streamlit_app.py」文件

import streamlit as st
from langchain_openai.chat_models import ChatOpenAI

st.title("🦜🔗 Quickstart App")

openai_api_key = st.sidebar.text_input("OpenAI API Key", type="password")


def generate_response(input_text):
    model = ChatOpenAI(temperature=0.7, api_key=openai_api_key)
    st.info(model.invoke(input_text))


with st.form("my_form"):
    text = st.text_area(
        "Enter text:",
        "What are the three key pieces of advice for learning how to code?",
    )
    submitted = st.form_submit_button("Submit")
    if not openai_api_key.startswith("sk-"):
        st.warning("Please enter your OpenAI API key!", icon="⚠")
    if submitted and openai_api_key.startswith("sk-"):
        generate_response(text)

为了方便直接使用公司提供的key
修改部分代码

openai_api_key = st.sidebar.text_input("OpenAI API Key", type="password")  
model_name = st.sidebar.text_input("model_name", value="gpt-4o")  
base_url = st.sidebar.text_input("base_url", value="https://oneapi.qunhequnhe.com/v1")  


def generate_response(input_text):  
    model = ChatOpenAI(model=model_name, temperature=0.7, api_key=openai_api_key, base_url=base_url)  
    st.info(model.invoke(input_text))

整体代码很简单
1、侧边栏增加几个输入框,输入大模型的相关信息
2、使用Langchain编写一个大模型调用方法
3、监听表单的操作,发起请求且配置正确则调用大模型的对话方法
4、将结果展示到页面中

运行

streamlit run streamlit_app.py
运行
运行

使用Streamlit结合Langchain的编写一个基础的RAG

安装

pip install langchain langchain_community langchain_chroma langchain_text_splitters

编写代码

新建一个「txt_search.py」

import os  
import tempfile  

import streamlit as st  
from langchain.memory import ConversationBufferMemory  
from langchain_community.chat_message_histories import StreamlitChatMessageHistory  
from langchain_community.document_loaders import TextLoader  
from langchain_openai import OpenAIEmbeddings  
from langchain_chroma import Chroma  
from langchain_core.prompts import PromptTemplate  
from langchain_text_splitters import RecursiveCharacterTextSplitter  
from langchain.agents import create_react_agent, AgentExecutor  
from langchain_community.callbacks.streamlit import StreamlitCallbackHandler  
from langchain_openai import ChatOpenAI  

model = "gpt-4o"  
api_key = "sk-"  
base_url = "https://oneapi.qunhequnhe.com/v1"  

# 设置Streamlit应用的页面标题和布局  
st.set_page_config(page_title="Rag Agent", layout="wide")  
# 设置应用的标题  
st.title("Rag Agent")  

# 上传txt文件,允许上传多个文件  
uploaded_files = st.sidebar.file_uploader(  
    label="上传txt文件", type=["txt"], accept_multiple_files=True  
)  
# 如果没有上传文件,提示用户上传文件并停止运行  
if not uploaded_files:  
    st.info("请先上传按TXT文档。")  
    st.stop()  


# 实现检索器  
@st.cache_resource(ttl="1h")  
def configure_retriever(uploaded_files):  
    # 读取上传的文档,并写入一个临时目录  
    docs = []  
    temp_dir = tempfile.TemporaryDirectory(dir='.')  
    for file in uploaded_files:  
        temp_filepath = os.path.join(temp_dir.name, file.name)  
        with open(temp_filepath, "wb") as f:  
            f.write(file.getvalue())  
        # 使用TextLoader加载文本文件  
        loader = TextLoader(temp_filepath, encoding="utf-8")  
        docs.extend(loader.load())  

    # 进行文档分割  
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)  
    splits = text_splitter.split_documents(docs)  

    # 使用OpenAI的向量模型生成文档的向量表示  
    embeddings = OpenAIEmbeddings(openai_api_key=api_key, openai_api_base=base_url)  
    vectordb = Chroma.from_documents(splits, embeddings)  

    # 创建文档检索器  
    retriever = vectordb.as_retriever()  

    return retriever  


# 配置检索器  
retriever = configure_retriever(uploaded_files)  

# 如果session_state中没有消息记录或用户点击了清空聊天记录按钮,则初始化消息记录  
if "messages" not in st.session_state or st.sidebar.button("清空聊天记录"):  
    st.session_state["messages"] = [{"role": "assistant", "content": "您好,我是AI助手,我可以查询文档"}]  

# 加载历史聊天记录  
for msg in st.session_state.messages:  
    st.chat_message(msg["role"]).write(msg["content"])  

# 创建检索工具  
from langchain.tools.retriever import create_retriever_tool  

# 创建用于文档检索的工具  
tool = create_retriever_tool(  
    retriever,  
    "文档检索",  
    "用于检索用户提出的问题,并基于检索到的文档内容进行回复.",  
)  
tools = [tool]  

# 创建聊天消息历史记录  
msgs = StreamlitChatMessageHistory()  
# 创建对话缓冲区内存  
memory = ConversationBufferMemory(  
    chat_memory=msgs, return_messages=True, memory_key="chat_history", output_key="output"  
)  

# 指令模板  
instructions = """您是一个设计用于查询文档来回答问题的代理。  
您可以使用文档检索工具,并基于检索内容来回答问题  
您可能不查询文档就知道答案,但是您仍然应该查询文档来获得答案。  
如果您从文档中找不到任何信息用于回答问题,则只需返回“抱歉,这个问题我还不知道。”作为答案。  
"""  

# 基础提示模板  
base_prompt_template = """  
{instructions}  

TOOLS:  
------  

You have access to the following tools:  

{tools}  

To use a tool, please use the following format:  

‍```  
Thought: Do I need to use a tool? Yes  
Action: the action to take, should be one of [{tool_names}]  
Action Input: {input}  
Observation: the result of the action  
‍```  

When you have a response to say to the Human, or if you do not need to use a tool, you MUST use the format:  

‍```  
Thought: Do I need to use a tool? No Final Answer: [your response here]  
‍```  

Begin!  

Previous conversation history:  
{chat_history}  

New input: {input}  
{agent_scratchpad}"""  

# 创建基础提示模板  
base_prompt = PromptTemplate.from_template(base_prompt_template)  

# 创建部分填充的提示模板  
prompt = base_prompt.partial(instructions=instructions)  

# 创建llm  
llm = ChatOpenAI(base_url=base_url, api_key=api_key, model=model)  

# 创建react Agent  
agent = create_react_agent(llm, tools, prompt)  

# 创建Agent执行器  
agent_executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True)  

# 创建聊天输入框  
user_query = st.chat_input(placeholder="请开始提问吧!")  

# 如果有用户输入的查询  
if user_query:  
    # 添加用户消息到session_state  
    st.session_state.messages.append({"role": "user", "content": user_query})  
    # 显示用户消息  
    st.chat_message("user").write(user_query)  

    with st.chat_message("assistant"):  
        # 创建Streamlit回调处理器  
        st_cb = StreamlitCallbackHandler(st.container())  
        # agent执行过程日志回调显示在Streamlit Container (如思考、选择工具、执行查询、观察结果等)  
        config = {"callbacks": [st_cb]}  
        # 执行Agent并获取响应  
        response = agent_executor.invoke({"input": user_query}, config=config)  
        # 添加助手消息到session_state  
        st.session_state.messages.append({"role": "assistant", "content": response["output"]})  
        # 显示助手响应  
        st.write(response["output"])

运行代码

streamlit run txt_search.py
image.png
image.png
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐