大模型开发入门v3.0
🤖第 4 章/基于 Python 构建聊天机器人

4.5 项目前后端联调实现聊天机器人

📑 本页目录

4.5 项目前后端联调实现聊天机器人#

一、抽取Ollama调用模型工具类#

文件名: ollama_utils.py 代码内容如下:

    # 1.导包
    # 注意: 必须提前安装ollama: pip install ollama
    import ollama
    
    # 2.ollama调用本地大模型
    # 老版本ollama默认直接访问: http://127.0.0.1:11434/
    # 新版本需要创建客户端对象
    new_ollama = ollama.Client(host="http://127.0.0.1:11434")
    
    
    def get_chat_result(messages):
        # 发送请求获取响应
        result = new_ollama.chat(
            model="qwen2.5:7b",
            messages=messages
        )
        # 解析响应结果
        return result.message.content
    
    
    if __name__ == '__main__':
        messages = [{"role": "user", "content": "给我讲一个笑话"}]
        res_data = get_chat_result(messages)
        print(res_data)
        print('=====================================================')
        messages = [{"role": "user", "content": "给我讲一个故事"}]
        res_data = get_chat_result(messages)
        print(res_data)
    

二、Streamlit编写程序主入口#

文件名: streamlit_app.py 代码内容如下:

    # 1.导包
    import streamlit as st
    from ollama_utils import get_chat_result
    
    # 2.添加标题
    st.title("黑马智聊机器人")
    # 3.添加分割线
    st.divider()
    # TODO 5.添加历史聊天记录messages列表到streamlit的session_state中
    if "messages" not in st.session_state:
        # 首次一定没有历史记录列表,那就创建一个空列表
        st.session_state['messages'] = []
        # 把AI的欢迎语,添加到messages列表中
        st.session_state['messages'].append({"role": "assistant", "content": "你好,我是黑马智聊机器人,有什么可以帮助您的吗!"})
    # 4.构建ai和用户的聊天窗口
    # 4.1 TODO 遍历messages列表,首次只有AI的欢迎语,后续就是用户和AI的问答历史所有记录
    for message in st.session_state['messages']:
        st.chat_message(message["role"]).write(message["content"])
    # 4.2 获取用户输入
    prompt = st.chat_input("请输入您的问题:")
    # TODO 如果用户有输入,再进行问答(解决了一开始是None的问题)
    if prompt:
        st.chat_message("user").write(prompt)
        # TODO 把用户的问题,添加到messages列表中
        st.session_state['messages'].append({"role": "user", "content": prompt})
        # 4.3 获取AI的回复
        # todo 注意: 此处要根据用户的问题去调用大模型获取答案
        with st.spinner("思考中..."):
            # messages = [{"role": "user", "content": prompt},{},{},{},{},{},{},{},...]
            result = get_chat_result(st.session_state['messages'][-10:])  # TODO 为了避免messages太长,建议获取最近10条历史记录
        st.chat_message("assistant").write(result)
        # TODO 把AI的回复,添加到messages列表中
        st.session_state['messages'].append({"role": "assistant", "content": result})
    

三、最终运行效果#

image-20251016201939435