导入
将聊天机器人与 Streamlit 界面集成
学习如何将 Streamlit 聊天界面与大语言模型(LLM)集成。
聊天元素简介
理解编码过程
1import streamlit as st 2import pandas as pd 3 4from chatbot import generate_answer 5 6# 设置主页面的通用配置 7st.set_page_config( 8 page_title="聊天机器人", 9 page_icon="🧊", 10 layout="wide", 11 initial_sidebar_state="expanded" 12) 13 14# 设置标题 15st.title(":rainbow[LLM 聊天机器人]") 16 17# 初始化聊天历史 18if "messages" not in st.session_state: 19 st.session_state.messages = [] 20 21# 在应用重新运行时,从历史记录中显示聊天消息 22for message in st.session_state.messages: 23 with st.chat_message(message["role"]): 24 st.markdown(message["content"]) 25 26# 接收用户输入 27if prompt := st.chat_input("今天我可以如何帮助您?"): 28 # 将用户消息添加到聊天历史 29 st.session_state.messages.append({"role": "user", "content": prompt}) 30 # 在聊天消息容器中显示用户消息 31 with st.chat_message("user"): 32 st.markdown(prompt) 33 34 # 在聊天消息容器中显示助手回复 35 response = generate_answer(prompt) 36 st.session_state.messages.append({"role": "assistant", "content": response})
1import streamlit as st 2from langchain_groq import ChatGroq 3from langchain_core.prompts import ChatPromptTemplate 4from langchain_core.runnables import RunnablePassthrough, RunnableParallel 5from langchain_core.output_parsers import StrOutputParser 6# 屏蔽警告 7import warnings 8warnings.filterwarnings("ignore", category=UserWarning) 9warnings.filterwarnings("ignore", category=FutureWarning) 10import os 11os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 12# 禁用并行处理 13os.environ["TOKENIZERS_PARALLELISM"] = "false" 14# 设置 Groq API 密钥 15groq_api_key = os.environ["GROQ_API_KEY"] 16 17 18def generate_answer(query): 19 20 # 请谨慎使用 API 密钥 21 model_name = "llama3-8b-8192" 22 llm = ChatGroq(temperature=0.5, groq_api_key=groq_api_key, model_name=model_name) 23 24 # 定义聊天历史 25 history = "\n".join([f"{message['role']}: {message['content']}" for message in st.session_state.messages]) 26 27 # 使用“逐步回溯提问”技术定义提示词和提示模板 28 template = """ 29 - 扮演一个友好的聊天机器人角色。 30 ----------------------------------------------------------------------------------------------------- 31 问题: {question} 32 ----------------------------------------------------------------------------------------------------- 33 历史: {history} 34 ----------------------------------------------------------------------------------------------------- 35 回答: 36 ----------------------------------------------------------------------------------------------------- 37 """ 38 prompt = ChatPromptTemplate.from_template(template) 39 40 # 定义链式调用构造器 41 chain = (RunnableParallel( 42 {"question": RunnablePassthrough(), 43 "history": RunnablePassthrough() 44 }) 45 | prompt 46 | llm 47 | StrOutputParser() 48 ) 49 50 # 使用链式调用定义输出生成器 51 with st.chat_message('assistant'): 52 message_placeholder = st.empty() 53 all_results = '' 54 for res in chain.stream({"question": query, "history": history}): 55 all_results += res 56 message_placeholder.markdown(all_results) 57 58 return all_results
实践练习
(已移除外部嵌入内容)