1. Streamlit

Streamlit 是一个开源框架,用于快速构建和部署数据应用程序。它特别适用于数据科学家和机器学习工程师,无需前端开发经验就可以创建交互式应用。以下是 Streamlit 的一些关键特点和功能:

1. 特点
  1. 简单易用
  • 代码简洁:使用 Python 编写应用程序,Streamlit 让用户通过简单的 Python 代码创建丰富的用户界面。
  • 即时预览:每次保存代码后,应用程序会自动重新加载,帮助用户快速查看更改效果。
  1. 快速构建
  • 内置组件:提供各种内置的 UI 组件,如滑块、按钮、图表等,简化了前端设计和交互实现。
  • 与数据科学工具集成:无缝集成 Pandas、NumPy、Matplotlib 和其他数据科学库,方便处理和可视化数据。
  1. 交互式
  • 小部件:支持交互式小部件(如输入框、下拉菜单),允许用户动态修改应用程序的参数。
  • 实时更新:用户输入会实时反映在应用程序中,无需刷新页面。
  1. 部署和分享
  • 轻松部署:可以在本地服务器上运行,也可以通过 Streamlit Sharing 或其他云服务轻松部署和分享应用。
  1. 开源社区
  • 社区支持:作为开源项目,Streamlit 拥有活跃的社区和丰富的插件生态,用户可以扩展功能或获取支持。
2. 典型用例
  • 数据可视化:快速创建数据仪表盘和可视化工具,以直观的方式展示数据。
  • 机器学习模型展示:将训练好的模型与用户进行交互,测试模型性能或展示预测结果。
  • 数据探索和分析:构建交互式分析工具,让用户能够探索数据集的不同方面。

Streamlit 是一个用于快速创建数据应用程序的开源 Python 库。它的设计目标是让数据科学家能够轻松地将数据分析和机器学习模型转化为具有交互性的 Web 应用程序,而无需深入了解 Web 开发。和常规 Web 框架,如 Flask/Django 的不同之处在于,它不需要你去编写任何客户端代码(HTML/CSS/JS),只需要编写普通的 Python 模块,就可以在很短的时间内创建美观并具备高度交互性的界面,从而快速生成数据分析或者机器学习的结果;另一方面,和那些只能通过拖拽生成的工具也不同的是,你仍然具有对代码的完整控制权。

Streamlit 提供了一组简单而强大的基础模块,用于构建数据应用程序:

  • st.write():这是最基本的模块之一,用于在应用程序中呈现文本、图像、表格等内容。
  • st.title()、st.header()、st.subheader():这些模块用于添加标题、子标题和分组标题,以组织应用程序的布局。
  • st.text()、st.markdown():用于添加文本内容,支持 Markdown 语法。
  • st.image():用于添加图像到应用程序中。
  • st.dataframe():用于呈现 Pandas 数据框。
  • st.table():用于呈现简单的数据表格。
  • st.pyplot()、st.altair_chart()、st.plotly_chart():用于呈现 Matplotlib、Altair 或 Plotly 绘制的图表。
  • st.selectbox()、st.multiselect()、st.slider()、st.text_input():用于添加交互式小部件,允许用户在应用程序中进行选择、输入或滑动操作。
  • st.button()、st.checkbox()、st.radio():用于添加按钮、复选框和单选按钮,以触发特定的操作。

2. 构建应用程序

相关智谱AI代码和讲解请参考:

大模型入门到精通——使用Embedding API及搭建本地知识库(一)

大模型入门到精通——使用Embedding API及搭建本地知识库(二)

大模型从入门到精通——基于智谱AI和LangChain实现RAG应用(一)

1. 导入必要的库

代码首先导入了一些必要的库和模块,包括 streamlitoslangchainsys 等。这些库在整个应用中起着至关重要的作用:

  • streamlit 用于创建 Web 界面。
  • os 用于处理环境变量。
  • langchain 中的模块用于自然语言处理任务。
  • sys 用于将其他目录添加到 Python 的搜索路径中,以便导入自定义模块。
import streamlit as st
import os
from langchain_core.output_parsers import StrOutputParser
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
import sys
sys.path.append("data_base/vector_db/chroma") # 将父目录放入系统路径中
from langchain.vectorstores.chroma import Chroma
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from zhipuai_llm import ZhipuAILLM,ZhipuAIEmbeddings
from dotenv import load_dotenv, find_dotenv
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
2. 加载环境变量

load_dotenv() 函数用于加载 .env 文件中的环境变量。通过调用 find_dotenv(),代码可以自动找到并加载项目根目录中的 .env 文件。

_ = load_dotenv(find_dotenv())    # 读取本地 .env 文件
  • 1.
3. 定义功能函数
3.1 生成响应

generate_response 函数使用 ZhipuAILLM 模型生成对话的响应。它接受用户输入的文本和 API 密钥,调用模型的 invoke 方法生成回复,并使用 StrOutputParser 对输出进行解析。

def generate_response(input_text, openai_api_key):
    llm = ZhipuAILLM(temperature=0.7, api_key=openai_api_key)
    output = llm.invoke(input_text)
    output_parser = StrOutputParser()
    output = output_parser.invoke(output)
    return output
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
3.2 获取向量数据库

get_vectordb 函数创建一个向量数据库实例。它使用 ZhipuAIEmbeddings 生成嵌入向量,并通过 Chroma 模块加载或创建持久化的向量数据库。

def get_vectordb():
    embedding = ZhipuAIEmbeddings()
    persist_directory = './data_base/vector_db/chroma'
    vectordb = Chroma(
        persist_directory=persist_directory, 
        embedding_function=embedding
    )
    return vectordb
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
3.3 带历史记录的问答链

get_chat_qa_chain 函数生成一个带有对话历史记录的问答链。它利用 ConversationBufferMemory 模块记录对话历史,并使用 ConversationalRetrievalChain 将问答逻辑与向量数据库连接起来。

def get_chat_qa_chain(question:str,openai_api_key:str):
    vectordb = get_vectordb()
    llm = ZhipuAILLM(temperature = 0,api_key = openai_api_key)
    memory = ConversationBufferMemory(
        memory_key="chat_history",
        return_messages=True
    )
    retriever=vectordb.as_retriever()
    qa = ConversationalRetrievalChain.from_llm(
        llm,
        retriever=retriever,
        memory=memory
    )
    result = qa({"question": question})
    return result['answer']
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
3.4 不带历史记录的问答链

get_qa_chain 函数创建了一个不带历史记录的问答链。它使用 PromptTemplate 自定义提示模板,并通过 RetrievalQA 模块创建问答逻辑,结合向量数据库进行答案生成。

def get_qa_chain(question:str,openai_api_key:str):
    vectordb = get_vectordb()
    llm = ZhipuAILLM(temperature = 0,api_key = openai_api_key)
    template = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答案。最多使用三句话。尽量使答案简明扼要。总是在回答的最后说“谢谢你的提问!”。
        {context}
        问题: {question}
        """
    QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"], template=template)
    qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectordb.as_retriever(), return_source_documents=True, chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})
    result = qa_chain({"query": question})
    return result["result"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
4. Streamlit 应用界面

main 函数中,Streamlit 的 UI 组件被用于构建交互界面。用户可以通过侧边栏输入 API 密钥,并选择不同的问答模式(带历史记录或不带历史记录)。应用会根据用户的输入进行响应并显示对话历史。

def main():
    st.title('🦜🔗 动手学大模型应用开发')
    openai_api_key = st.sidebar.text_input('OpenAI API Key', type='password')
    selected_method = st.radio(
        "你想选择哪种模式进行对话?",
        ["None", "qa_chain", "chat_qa_chain"]
    )

    if 'messages' not in st.session_state:
        st.session_state.messages = []

    messages = st.container(height=300)
    if prompt := st.chat_input("Say something"):
        st.session_state.messages.append({"role": "user", "text": prompt})

        if selected_method == "None":
            answer = generate_response(prompt, openai_api_key)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

大模型从入门到精通——基于智谱AI和LangChain实现RAG应用(二)_langchain

参考

 https://datawhalechina.github.io/llm-universe/#/C4/3.部署知识库助手