小模型构建Agent系统

0 阅读7分钟

小模型构建Agent系统

从零搭建一套完全本地化的智能客服 Agent 系统,基于通义千问 Qwen3-8B 大模型与 Nomic-Embed 文本嵌入模型,结合 Function Calling 与 RAG 检索增强技术,实现了支持多轮对话、工具调用、政策检索的完整客服能力,全程无需调用任何云端 API,真正做到零成本、高隐私、快响应。


一、技术选型:选什么模型本地部署?

在方案设计阶段,基于3060 12G显存,核心考量如下:

组件选型核心优势
对话大模型Qwen3-8B通义千问最新小模型,原生支持 Function Calling,中文理解能力极强,现有的硬件可流畅运行,8B 参数即可媲美更大模型的工具调用能力
嵌入模型Nomic-Embed-Text轻量开源嵌入模型,768 维向量,本地部署无成本,RAG 检索效果优异,完美适配本地知识库场景
部署框架Ollama一键式本地模型部署工具,API 兼容 OpenAI 标准,无需复杂的环境配置,一行命令即可拉取并运行模型
Agent 框架LangChain成熟的大模型应用开发框架,完美支持工具定义、多轮对话管理、RAG 流水线构建
可观测性LangSmith全链路追踪工具,记录 Agent 每一步的思考、工具调用、输入输出,帮助快速排查问题,实现工程化落地

二、系统架构:Agent 如何理解并处理用户请求?

整个系统的核心是一个 ReAct 模式的智能 Agent,它能够自主理解用户的意图,决策是否需要调用工具,并且能够结合多轮上下文生成精准的回答。

整个处理流程分为 5 个核心步骤:

  1. 意图识别:Agent 接收用户的输入,结合历史对话上下文,理解用户的真实需求

  2. 工具决策:判断当前需求是否需要调用外部工具,是查询订单状态,还是检索售后政策

  3. 工具执行

    1. 订单查询:调用业务系统的get_order_status接口,实时获取订单的最新状态
    2. 政策检索:通过 RAG 流水线,使用 Nomic-Embed 对用户问题向量化,从售后手册知识库中检索最相关的政策内容
  4. 结果整合:Agent 将工具返回的结果,结合历史对话信息,整合成自然语言

  5. 流式回复:将整理后的结果以流式的方式返回给用户,提升交互体验


三、实战案例:从 Trace 看 Agent 的完整工作流

为了更直观的展示系统的能力,我们以一个真实的售后咨询场景为例,结合 LangSmith 的全链路 Trace,拆解 Agent 的每一步工作。

3.1 实际交互效果

首先来看用户与智能助手的实际对话界面:

屏幕截图 2026-03-21 144548.png

整个对话分为三轮,Agent 完美处理了订单查询、缺失参数反问、退货政策咨询三个典型的客服场景。

3.2 全链路 Trace 拆解

通过 LangSmith 的 Trace 记录,我们可以清晰的看到 Agent 在每一步的决策过程:

屏幕截图 2026-03-21 150717.png

第一轮:订单状态查询

用户输入:ORD1001,ord1003

  • Agent 识别到用户的需求是查询订单状态
  • 自动调用get_order_status工具,传入解析后的订单号参数
  • 工具返回结果:ORD1001 已发货,ORD1003 不存在
  • Agent 将结果整理成自然语言回复用户
第二轮:缺失参数主动反问

用户输入:我想退货怎么操作

  • Agent 识别到用户的需求是退货,但当前缺少必要的参数:具体的订单号
  • 小模型完美的处理了这种情况,没有乱回答,而是主动反问用户,要求提供订单号
  • 这体现了 Agent 的多轮对话与参数补全能力
第三轮:退货政策咨询

用户输入:ORD1001

  • Agent 结合上下文,理解到用户是要查询 ORD1001 这个已发货订单的退货政策
  • 自动调用search_policy工具,触发 RAG 检索流程
  • RAG 从售后手册中检索到了已发货订单的退货规则:签收 7 天内、包装完好、非质量问题买家承担运费
  • Agent 结合之前获取的订单状态(已发货),生成了针对性的回复,告诉用户具体的操作条件和方式

整个过程中,Agent 完全自主的完成了意图理解、工具调用、多轮交互,没有任何人工干预,而这一切,都是在本地的 8B 小模型上完成的。


四、部署与实现:5 步搭建你的本地 Agent

整个系统的部署非常简单,全程只需要几分钟即可完成:

步骤 1:安装 Ollama 并拉取模型

Ollama 是本地模型部署的最佳工具,一行命令即可完成安装和模型拉取:

# 安装Ollama(官网一键安装)
curl https://ollama.ai/install.sh | sh

# 拉取Qwen3-8B对话模型
ollama pull qwen3:8b

# 拉取Nomic-Embed嵌入模型
ollama pull nomic-embed-text

步骤 2:定义 Agent 工具

我们通过 LangChain 定义 Agent 可以调用的工具,这里我们定义了两个核心工具:

@tool
def get_order_status(order_ids: str) -> str:
    """查询订单状态。支持逗号分隔多个订单号。"""
    print(f"\n [后端系统执行] 正在批量查询订单: {order_ids}\n")
    mock_db = {"ORD1001": "已发货,顺丰单号 SF12345", "ORD1002": "缺货中"}

    id_list = [i.strip().upper() for i in order_ids.split(",")]
    results = []
    for oid in id_list:
        status = mock_db.get(oid, "订单不存在,请检查订单号是否正确")
        results.append(f"- **{oid}**:{status}")

    return "\n".join(results)
    
embeddings = OllamaEmbeddings(model="nomic-embed-text")

# 加载本地 FAISS 索引
vector_db = FAISS.load_local(
    "faiss_index", embeddings, allow_dangerous_deserialization=True
)    

@tool
def search_policy(query: str) -> str:
    """当用户询问售后政策、退款规则等规定时调用此工具。"""
    print(f"\n[RAG 检索中]: 正在翻阅政策手册 -> {query}\n")
    try:
        docs = vector_db.similarity_search(query, k=2)
        if not docs:
            # 如果什么都没搜到,告诉大模型没搜到,别让它瞎编
            return "知识库中没有找到与该问题相关的政策,请告诉用户暂无相关规定,或建议联系人工客服。"

        context = "\n---\n".join([doc.page_content for doc in docs])
        return f"从《售后手册》中查到的权威规定如下:\n{context}"

    except Exception as e:
        # 即使 FAISS 崩溃了,也只把错误抛给大模型,保护主程序
        print(f" 检索失败: {e}")
        return "系统知识库暂时无响应,请向用户致歉,并告知稍后重试。"


步骤 3:构建 RAG 检索流水线

针对售后政策的检索,我们构建了本地的 RAG 流水线:

# 1. 准备数据
raw_text = """
《售后政策 2026版》
1. 退款规则:未发货订单可随时申请全额退款。
2. 已发货规则:已发货订单需在签收后 7 天内,保持包装完好,联系客服申请退货。
3. 快递费用:非质量问题退货,由买家承担运费。
4. 特殊商品:定制化订单不支持 7 天无理由退换。
"""
documents = [Document(page_content=raw_text)]

# 2. 切片
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
chunks = text_splitter.split_documents(documents)

# 3. 嵌入模型配置 (Ollama)
embeddings = OllamaEmbeddings(model="nomic-embed-text")

# 4. 存入 FAISS 并保存到本地
print("正在构建向量数据库...")
vector_db = FAISS.from_documents(documents=chunks, embedding=embeddings)
vector_db.save_local("faiss_index")  

步骤 4:初始化 Agent

最后,我们初始化 LangChain 的 Agent,将模型、工具、提示词整合起来:

llm = ChatOpenAI(
    model="qwen3:8b",
    base_url="http://localhost:11434/v1",
    api_key="ollama",
    streaming=True,
)

system_prompt = """你是专业的企业客服。严禁捏造不存在的信息,必须基于工具返回的信息。如果工具返回的信息不足以回答用户的问题,请告知用户暂无相关规定,或建议联系人工客服。
排版要求:
1. 严禁使用 `#` 等大号 Markdown 标题语法。
2. 多个订单请直接使用无序列表 `-` 排版,并在订单号上加粗。"""

agent = create_react_agent(
    model=llm,
    tools=[get_order_status, search_policy],
    prompt=system_prompt,
    checkpointer=memory,
)

步骤 5:接入 LangSmith 监控

最后,我们接入 LangSmith 来实现全链路的监控,只需要配置环境变量即可:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=api_key
export LANGCHAIN_PROJECT=CustomerServiceAgent

这样,所有的 Agent 调用、工具执行、输入输出都会被自动记录,就像我们之前看到的 Trace 一样,帮助你快速排查问题。


六、总结

总的来看,用 Qwen3-8B + Nomic-Embed + Ollama 的技术栈,搭建出来的这个Agent还是可圈可点的,在准确性方面感觉不输云端api。尤其是在个人开发阶段,非常有性价比。