LazyLLM 创新实践:LLM 与工具协同,构建智能客服问答与知识库检索助手
摘要
随着大语言模型(LLM)的普及,智能客服系统也迎来了新的发展机遇。然而,纯粹依赖 LLM 的通用知识往往难以满足用户对特定领域或企业内部信息的精确需求。本文将深入探讨如何利用 LazyLLM 框架,巧妙地结合 LLM 的强大推理能力和外部工具的精确检索能力,构建一个智能客服问答与知识库检索助手。我们将以万象模型开发平台(SenseCore)的 Qwen3-Coder 模型为例,展示如何实现 LLM 的智能决策(何时回答、何时检索),为你的智能应用增添更强的实用性。
1. 项目简介:LLM 与知识库的完美融合
传统的智能客服系统或基于 LLM 的问答系统,常常面临两个挑战:一是 LLM 的知识可能不是最新的,二是它无法访问企业内部的私有数据。为了解决这些问题,结合外部知识库进行检索增强生成(RAG)成为主流方案。
本项目旨在构建的智能客服问答与知识库检索助手,正是这一理念的实践。它具备以下核心优势:
- 智能判断: LLM 能够根据用户问题的性质,智能判断是直接回答(通用知识)还是调用工具检索(特定知识)。
- 精确检索: 通过模拟的知识库检索工具,获取特定、准确的信息。
- 综合回答: 将 LLM 的理解能力与检索到的信息相结合,生成更全面、更专业的答案。
- 快速部署: 借助 LazyLLM 的
WebModule,快速搭建用户交互界面。 - 技术栈: Python、LazyLLM 框架、万象模型开发平台(SenseCore)
Qwen3-Coder模型。
2. 实现步骤
2.1 环境准备与 LazyLLM 安装
- Python 环境: 确保你的系统已安装 Python (推荐 3.10-3.12)、pip 和 Git。
- 创建项目目录并进入:
mkdir LazyLLM_CustomerService cd LazyLLM_CustomerService - 创建并激活虚拟环境:
python3 -m venv lazyllm-venv .\lazyllm-venv\Scripts\activate # Windows 用户 # source lazyllm-venv/bin/activate # macOS/Linux 用户 - 安装 LazyLLM 框架:
pip install lazyllm -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 获取万象模型平台 (SenseCore) API Key
本项目使用万象模型开发平台(SenseCore)的 Qwen3-Coder 模型。请登录 SenseCore 平台,在 "API 管理" 或 "服务管理" 中获取你的 API Key。
注意: 请将获取到的 Key 用于代码中的 SENSENOVA_API_KEY 变量。同时,确保你已在 SenseCore 平台开通并拥有 Qwen3-Coder 模型的使用权限。
2.3 核心代码编写 (customer_service_agent.py)
本项目的核心在于定义一个知识库检索工具,并设计一个 Prompt 来引导 LLM 智能地使用这个工具。
创建一个名为 customer_service_agent.py 的文件,并将以下代码复制粘贴进去:
# customer_service_agent.py
import json
from lazyllm import ReactAgent, fc_register, LOG, OnlineChatModule, WebModule
import requests.exceptions # 用于捕获网络请求异常
from typing import Dict, Any, List # 导入类型提示## --- 你的 SenseCore API Key ---
# 请替换为你在万象模型开发平台(SenseCore)获取到的真实 Key
SENSENOVA_API_KEY = 'sk-slRSvgQnavS9uwC35ACWcJyNofqUMKDy' # 替换为你的真实 Key
# ------------------------------------------------
# 你的 SenseCore 模型名称
SENSENOVA_MODEL_NAME = 'Qwen3-Coder' # 替换为你在平台开通的准确模型名称# 模拟知识库数据
# 在实际应用中,这会是一个数据库查询、文件读取或外部 API 调用
KNOWLEDGE_BASE = {"产品A": {"名称": "智能家居控制中心A","功能": "支持语音控制、远程APP控制,兼容多种智能设备(如灯泡、插座、传感器)。","价格": "999元","保修": "一年质保,三年内免费维修(非人为损坏)。","安装": "需专业人员上门安装,预约后3个工作日内完成。"},"产品B": {"名称": "便携式智能空气净化器B","功能": "HEPA滤网,PM2.5去除率99.9%,内置电池可续航8小时,适用于卧室、办公室。","价格": "499元","保修": "六个月质保,支持七天无理由退换货。","安装": "无需安装,即插即用。"},"售后服务": {"退换货政策": "购买商品7天内可无理由退换货,15天内可换货(需保持商品完好)。","维修流程": "请联系在线客服或拨打400-XXXX-XXXX报修,提供订单号和故障描述。","工作时间": "在线客服工作时间:周一至周五 9:00-18:00。"}
}# 使用 @fc_register("tool") 装饰器注册工具函数
@fc_register("tool")
def retrieve_knowledge(query: str) -> str:"""从模拟知识库中检索相关信息。当用户的问题涉及特定产品或售后服务时,LLM 应调用此工具。Args:query (str): 用户查询的关键词,例如“产品A”、“售后服务”、“退换货政策”等。LLM 应从用户问题中提取最相关的关键词。Returns:str: 从知识库中检索到的相关信息(JSON字符串),如果未找到则返回提示信息。"""LOG.info(f"Knowledge retrieval tool called with query: {query}")# 尝试精确匹配if query in KNOWLEDGE_BASE:return json.dumps(KNOWLEDGE_BASE[query], ensure_ascii=False)# 尝试模糊匹配或关键词匹配found_info = {}for key, value in KNOWLEDGE_BASE.items():if query.lower() in key.lower():found_info[key] = valueelif isinstance(value, dict):for sub_key, sub_value in value.items():if query.lower() in sub_key.lower() or query.lower() in str(sub_value).lower():found_info[key] = value # 返回整个产品/服务信息break # 找到一个匹配就跳出内层循环if found_info:return json.dumps(found_info, ensure_ascii=False)else:return f"知识库中未找到与 '{query}' 相关的信息,请尝试更具体的关键词。"# 定义 Agent 的角色和要求
prompt = f"""
【角色】
你是一个专业的智能客服助手,能够回答用户关于产品和售后服务的问题。【要求】
1. **理解用户意图:** 准确理解用户的问题。
2. **智能决策:**- 如果问题是通用性问题(例如“你好”、“什么是人工智能”),直接使用你自身的知识进行回答。- 如果问题涉及具体的产品信息(如“产品A的功能”、“产品B的价格”)或售后服务(如“退换货政策”、“维修流程”),你必须调用 `retrieve_knowledge` 工具从知识库中获取信息。
3. **提取关键词:** 调用工具时,从用户问题中提取最相关的关键词作为 `query` 参数。
4. **结合信息:** 将 `retrieve_knowledge` 工具返回的信息与你的通用知识结合,给出全面、准确、友好的回答。
5. **提示不足:** 如果知识库中未找到相关信息,请礼貌地告知用户,并建议他们尝试其他关键词或联系人工客服。
6. **语言:** 使用中文进行回复。**示例交互流程:**
用户:产品A有什么功能?
助手:思考:用户询问产品A的功能,需要调用知识库。调用 `retrieve_knowledge(query='产品A')`。
工具返回:{{"名称": "智能家居控制中心A", "功能": "支持语音控制、远程APP控制,兼容多种智能设备(如灯泡、插座、传感器)。", ...}}
助手:好的,产品A是智能家居控制中心A,它支持语音控制和远程APP控制,并且兼容多种智能设备,如灯泡、插座和传感器。用户:你们的退换货政策是什么?
助手:思考:用户询问退换货政策,需要调用知识库。调用 `retrieve_knowledge(query='退换货政策')`。
工具返回:{{"退换货政策": "购买商品7天内可无理由退换货,15天内可换货(需保持商品完好)。", ...}}
助手:您好,我们的退换货政策是:购买商品7天内可无理由退换货,15天内可换货,但需保持商品完好。
"""# 初始化 LazyLLM 的 OnlineChatModule,连接 SenseCore 平台
llm_module = OnlineChatModule(source='sensenova',model=SENSENOVA_MODEL_NAME, # 使用你在 SenseCore 平台开通的准确模型名称api_key=SENSENOVA_API_KEY, # 直接传入 API Keystream=False
)# 初始化 LazyLLM 的 ReactAgent
# 传入知识库检索工具
agent = ReactAgent(llm=llm_module,tools=['retrieve_knowledge'], # 注册知识库检索工具prompt=prompt,stream=False
)# 启动 WebModule 提供交互界面
w = WebModule(agent, port=8846, title="智能客服问答与知识库检索助手")if __name__ == "__main__":# 在启动 WebModule 前进行一次简单的模型调用测试,确保 API 连接正常print("--- 启动前进行一次基础模型调用测试 ---")try:test_query = "你好,请问什么是大语言模型?"test_res = llm_module.forward(test_query)print(f"Test query: {test_query}")print(f"Test answer: {test_res}")except requests.exceptions.ConnectTimeout as e:print(f"Error calling SenseCore API (Connection Timeout): {e}")print("请检查你的 SENSENOVA_API_KEY 是否正确,模型是否已开通,以及网络连接是否正常。")exit()except requests.exceptions.RequestException as e:print(f"Error calling SenseCore API: {e}")print("请检查你的 SENSENOVA_API_KEY 是否正确,模型是否已开通。")exit()except Exception as e:print(f"An unexpected error occurred during basic chat test: {e}")exit()print("--- 基础模型调用成功,启动智能客服问答与知识库检索助手 Web 界面 ---")print(f"WebModule 正在启动,请访问 http://127.0.0.1:{w.port}")w.start().wait()3. 核心代码解释
SENSENOVA_API_KEY和SENSENOVA_MODEL_NAME: 连接万象模型开发平台的凭证。请替换为你的真实 Key 和模型名称Qwen3-Coder。KNOWLEDGE_BASE: 一个 Python 字典,模拟了我们的内部知识库。它包含了产品 A、产品 B 和售后服务的详细信息。在实际应用中,这里会替换为连接到真实的数据库、文档存储或外部知识库 API。@fc_register("tool") def retrieve_knowledge(query: str) -> str:: 这是本项目的核心工具。@fc_register("tool")装饰器将其注册为 LazyLLM Agent 可调用的工具。- Docstring 严格格式: 遵循 LazyLLM 要求的详细 docstring 格式,包括函数描述、
Args:和Returns:部分,确保每个参数都有清晰的类型提示和描述。 - 检索逻辑: 函数内部实现了简单的精确匹配和模糊匹配逻辑,从
KNOWLEDGE_BASE中查找与query相关的条目。 - 返回 JSON: 检索到的信息以 JSON 字符串形式返回,方便 LLM 解析和理解。
prompt变量: 这是 Agent 的“大脑”。它详细定义了助手的角色(智能客服助手)和要求。这些要求至关重要,它们指导 LLM:- 何时直接回答(通用问题)。
- 何时调用
retrieve_knowledge工具(特定产品/服务问题)。 - 如何从用户问题中提取关键词作为工具的
query参数。 - 如何结合工具返回的信息和自身知识来生成最终回答。
- 还包含了示例交互流程,这对于 LLM 理解工具的使用场景和期望的输出格式非常有帮助。
OnlineChatModule: LazyLLM 用于连接在线 LLM 的模块,配置了 SenseCore 平台和你的模型。ReactAgent: LazyLLM 的核心 Agent。它实现了 ReAct (Reasoning and Acting) 范式,能够根据prompt智能地进行思考(Reasoning)和行动(Acting),这里的行动就包括调用retrieve_knowledge工具。llm=llm_module:指定 Agent 使用的 LLM 模块。tools=['retrieve_knowledge']:告诉 Agent 它可以使用哪些工具。prompt=prompt:传入定义 Agent 行为的提示词。
WebModule: LazyLLM 提供的快速构建 Web 交互界面的模块。它将agent封装起来,提供一个用户友好的输入框和输出展示区域。- 错误处理: 在
if __name__ == "__main__":块中,保留了对网络连接和 API 调用的错误捕获,确保在服务启动前能够验证 LLM 的可用性。
4. 效果展示
运行 python customer_service_agent.py 后,终端会显示 WebModule 的访问地址。在浏览器中打开 http://127.0.0.1:8846。
以下是几种典型的交互场景及其预期输出:
4.1 示例 1:通用知识问题(LLM 直接回答)
用户输入: 你好,什么是人工智能?
助手输出示例: (LLM 直接利用其通用知识进行回答)

5. 总结与展望
通过 LazyLLM 框架,我们成功地构建了一个能够智能决策、结合知识库检索的客服助手。这个项目充分展示了 LazyLLM 在 LLM 与外部工具协同方面的强大能力,使得开发者能够以相对简洁的代码,实现复杂的智能应用逻辑。
未来展望:
- 接入真实数据库/API: 将模拟知识库替换为企业真实的数据库或知识管理系统。
- 支持多模态输入: 允许用户通过语音或图片提问。
- 上下文感知: 优化 LLM 对多轮对话上下文的理解,提供更连贯的服务。
- 用户反馈机制: 收集用户对回答的满意度,持续优化模型和知识库。
- 部署到生产环境: 优化性能、安全性和可扩展性,为企业提供稳定可靠的智能客服解决方案。
希望这个案例能为你提供一个有价值的参考,并激发你在 LazyLLM 和 LLM 应用领域的更多创新,祝你项目顺利!
