LazyLLM项目实战:构建支持流式输出的智能对话机器人
【免费下载链接】LazyLLM 项目地址: https://gitcode.com/gh_mirrors/la/LazyLLM
本文将详细介绍如何在LazyLLM框架中构建支持流式输出的智能对话机器人,包括基础对话功能和函数调用(FunctionCall)功能的实现。
流式输出技术概述
流式输出(Streaming Output)是一种逐步显示模型生成内容的技术,与传统的一次性返回完整响应不同,流式输出能够实时显示模型生成的内容,带来更自然的交互体验。在LazyLLM中,我们可以轻松实现这一功能。
基础流式对话机器人实现
带前端界面的实现
import lazyllm
# 创建支持流式输出的模型实例
llm = lazyllm.TrainableModule("internlm2-chat-20b", stream=True)
# 或使用在线聊天模块:llm = lazyllm.OnlineChatModule(stream=True)
# 创建Web服务
lazyllm.WebModule(llm, port=23333, stream=True).start().wait()
这段代码展示了最简单的流式对话机器人实现方式。关键点在于:
- 初始化模型时设置
stream=True参数 - WebModule同样需要设置
stream=True来启用前端流式显示
不带前端界面的实现
import lazyllm
from functools import partial
llm = lazyllm.TrainableModule("internlm2-chat-20b", stream=True).start()
query = "What skills do you have?"
with lazyllm.ThreadPoolExecutor(1) as executor:
future = executor.submit(partial(llm, llm_chat_history=[]), query)
while True:
if value := lazyllm.FileSystemQueue().dequeue():
print(f"output: {''.join(value)}")
elif future.done():
break
print(f"ret: {future.result()}")
注意事项:
- 必须使用LazyLLM提供的ThreadPoolExecutor而非Python原生线程池
- 通过FileSystemQueue获取流式输出内容
- 需要处理线程同步问题
支持流式输出的FunctionCall机器人
工具函数定义
首先定义两个天气查询工具函数:
@fc_register("tool")
def get_current_weather(location: str, unit: Literal["fahrenheit", "celsius"]='fahrenheit'):
"""获取指定位置的当前天气"""
# 实现代码...
@fc_register("tool")
def get_n_day_weather_forecast(location: str, num_days: int, unit: Literal["celsius", "fahrenheit"]='fahrenheit'):
"""获取N天天气预报"""
# 实现代码...
关键点:
- 使用
fc_register装饰器注册工具 - 必须包含详细的函数文档字符串
- 定义清晰的参数类型
完整实现代码
import json
import lazyllm
from lazyllm import fc_register, FunctionCallAgent
from typing import Literal
# 工具函数定义...
# 创建支持流式的模型
llm = lazyllm.TrainableModule("internlm2-chat-20b", stream=True).start()
# 创建FunctionCall代理
tools = ["get_current_weather", "get_n_day_weather_forecast"]
agent = FunctionCallAgent(llm, tools)
# 启动Web服务
lazyllm.WebModule(agent, port=23333, stream=True).start().wait()
显示中间处理过程
如果需要查看FunctionCall的中间处理过程,可以设置return_trace=True:
llm = lazyllm.TrainableModule("internlm2-chat-20b", stream=True, return_trace=True).start()
agent = FunctionCallAgent(llm, tools, return_trace=True)
这样可以在界面左下角的"处理日志"中看到详细的中间处理过程。
技术要点总结
-
流式输出控制:
- TrainableModule默认stream=False,需要显式设置
- OnlineChatModule默认stream=True
-
线程安全:
- 必须使用LazyLLM提供的ThreadPoolExecutor
- 通过FileSystemQueue实现线程间通信
-
FunctionCall集成:
- 工具函数需要规范注册和文档
- 可以灵活控制是否显示中间过程
-
Web界面:
- WebModule提供一站式解决方案
- 用户可以选择开启/关闭流式输出
最佳实践建议
- 对于简单对话场景,直接使用OnlineChatModule更为便捷
- 需要自定义模型时,使用TrainableModule并指定stream=True
- 工具函数定义要尽可能详细和规范
- 生产环境建议开启return_trace以便调试
- 注意线程安全问题,使用框架提供的线程管理工具
通过LazyLLM框架,开发者可以轻松构建功能强大且用户体验良好的流式对话应用,大大降低了开发复杂度和技术门槛。
【免费下载链接】LazyLLM 项目地址: https://gitcode.com/gh_mirrors/la/LazyLLM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



