llmware 快速上手:用小型专用模型构建多步 Agent 工作流
【免费下载链接】llmwareUnified framework for building enterprise RAG pipelines with small, specialized models项目地址: https://gitcode.com/GitHub_Trending/ll/llmware
本文基于仓库中 slim_agents 入门指南 展开,讲解如何在 llmware 中以“本地小型专用模型即工具”的方式搭建多步、多模型的 Agent 工作流:从环境安装、15 个可复制即跑的分步示例,到LLMfx编排类的源码级实现原理(工作队列、工具映射、置信度分析、自动报告聚合),最终帮助读者掌握在笔记本 CPU 上完成企业级流程自动化的完整实战方案。
一、环境准备与安装方式
llmware 的设计目标是让所有处理都在本地完成,因此对运行环境的要求是明确且友好的。入门指南给出的安装方式共有三条路径:
# 方式 1:标准安装 pip3 install llmware # 方式 2:含全部可选依赖的完整安装 pip3 install 'llmware[full]' # 方式 3:克隆仓库后运行一键依赖脚本 git clone git@github.com:llmware-ai/llmware.git # 然后执行仓库根目录下的初始化脚本: sh welcome_to_llmware.sh # macOS / Linux # 或(Windows) welcome_to_llmware_windows.sh仓库根目录下的 welcome_to_llmware.sh 与 welcome_to_llmware_windows.sh 脚本的作用正是“安装全部依赖”,克隆仓库方式额外的好处是可以直接获得仓库内上百个示例脚本。示例脚本中同样注明:如果缺失某个依赖,代码运行时会给出明确提示(如pip install transformers),按提示安装即可。
指南给出的平台与硬件前提如下:
| 项目 | 要求 |
|---|---|
| 操作系统 | Mac M1/M2/M3、Windows、Linux(推荐 Ubuntu 20 或 Ubuntu 22) |
| 内存 | 最低 16 GB(推荐 32 GB) |
| Python | 3.9、3.10、3.11、3.12 |
从仓库的目录结构也能印证这些前提:llmware/lib/下按darwin/arm64、linux/x86_64、linux/aarch64、windows/x86_64等平台分别预置了解析器原生库(libpdf_llmware.so、liboffice_llmware.so等),llmware/lib/gguf/下则按平台预置了 GGUF 推理引擎的动态库(如gguf_linux_cuda、gguf_win_cuda),这正是“开箱即用、本地运行”的底层支撑。
二、llmware 中的 “Agent” 是什么
指南对 Agent 的定义非常具体,区别于业界泛化的 Agent 概念:
- 多步、多模型工作流:Agent 是由多个“小型专用模型(SLIM 等 function-calling 模型)”叠加组合而成的多调用流程,每次调用完成一个单一职能(情感分析、实体识别、抽取、摘要等),再配合普通处理逻辑串联成完整流程;
- 完全本地 / 自托管:工作流实例化与运行均可在本机完成,数据不出局域网;
- 定位:从简单聊天机器人进化为企业流程自动化——“将 LLM 安全、可靠、低成本地嵌入私有企业工作流”。
这个定义与源码完全一致。llmware/agents.py 模块文档说明:
The agents module implements the two classes LLMfx and SQLTables, where LLMfx manages Structured Language Instruction Models (SLIMs), the agents and SQLTables handles creating and accessing external SQL data.
即LLMfx负责编排 SLIM 类工具模型执行多步工作流,SQLTables负责 Text2SQL 场景下的 SQL 数据访问。类注释还进一步解释:“A Structured Language Instruction Model, SLIM for short, is a small specialized multi-modal LLM for function calling and multi-step workflows.”
三、学习路线:15 个可复制即跑的分步示例
指南将 15 个示例按“由浅入深”编排。这些示例均可“copy-paste”直接运行,代码中内嵌了充分的注释与解释;每个示例相互独立,可按任意顺序挑选执行。在当前仓库中,这 15 个示例对应solutions/slim_agents/目录下的agents-N-*.py文件(指南原文称后续还有 100+ 示例位于 examples 目录,对应仓库现阶段的solutions/目录):
| 序号 | 示例主题 | 仓库对应文件 |
|---|---|---|
| 1 | Start here:几分钟内下载并运行问答与函数调用模型(入口示例) | agents-1-start_here.py |
| 2 | llmware_sampler_bling_dragon:上手 BLING / DRAGON 模型,获得高质量、基于事实的推理 | agents-2-llmware_model_sampler_bling_dragon.py |
| 3 | using-slim-extract:用函数调用小型专用模型从文档中抽取信息 | agents-3-using_slim_extract.py |
| 4 | using-slim-summary:用函数调用小型专用模型做摘要 | agents-4-using_slim_summary.py |
| 5 | agent-llmfx:构建第一个 Agent 流程并完全在本地运行 | agents-5-agent-llmfx-getting-started.py |
| 6 | agent-multistep-process:分析、分类、抽取复杂文档信息的多步 Agent 流程 | agents-6-agent-multistep-analysis.py |
| 7 | using-whisper:基于 whisper-cpp 的本地语音转文字 | agents-7-using-whisper-cpp-sample-files.py |
| 8 | using-phi-3-function-calls:基于 Phi-3 的各类函数调用流程 | agents-8-using-phi-3-function-calls.py |
| 9 | summarize_document:分块摘要大文档后再组装 | agents-9-document_summarizer.py |
| 10 | semantic similarity ranking:用语义重排器从大文档中筛选相关文本块 | agents-10-using_semantic_reranker_with_rag.py |
| 11 | gguf_streaming:使用 stream 接口流式输出大段生成 | agents-11-gguf_streaming.py |
| 12 | web_services:整合 Web 服务与三个函数调用模型生成研究简报 | agents-12-web_services_slim_fx.py |
| 13 | text-2-sql:自然语言转 SQL,从结构化数据库取数 | agents-13-text2sql-end-to-end-2.py |
| 14 | rag-instruct-benchmark-tester:构建 RAG 基准性能测试的脚本 | agents-14-rag_instruct_benchmark_tester.py |
| 15 | using-rag-benchmark-scores:按基准测试的排序准确率访问并筛选模型 | agents-15-get_model_benchmarks.py |
指南同时强调:完成这 15 个示例后,就具备了继续探索仓库中其他上百个示例(现位于solutions/目录下,如rag/、embeddings/、use_cases/、ui/等子目录)并构建更复杂 LLM 应用的基础。
四、核心示例实战
4.1 入口示例:两步入模 ModelCatalog(示例 1)
agents-1-start_here.py 展示了访问任何 llmware 模型的两步通用模式:
from llmware.models import ModelCatalog # 标准(Standard)模型:用 inference 做通用文本进、文本出 model = ModelCatalog().load_model("bling-answer-tool") response = model.inference("My son is 21 years old.\nHow old is my son?") # 可选参数可提升结果质量 model = ModelCatalog().load_model("bling-phi-3-gguf", temperature=0.0, sample=False, max_output=200) # 所有 llmware 模型都按“输入包含一段上下文 passage + 一个问题”的形态微调 text_passage = "The company's stock price increased by $3 after reporting positive earnings." response = model.inference("What was the increase in the stock price?", add_context=text_passage)该脚本的关键要点(代码注释原文即教材):
model_name以bling、dragon、slim开头的是 llmware 模型;目录中还包含 phi-3、qwen-2、llama-3、mistral 等第三方模型,且支持扩展 ollama、lm studio,以及 OpenAI、Anthropic、Cohere、Google 的 API 模型;- SLIM 模型是函数调用模型:执行单一专用任务,输出 Python 字典,通常无需复杂提示词,只需传入可选的
function与params; - 模型自带测试集,
ModelCatalog().tool_test_run("slim-topics-tool")即可对模型跑一遍内置评测,是学习模型行为的最快途径。
示例中对同一篇财报文本连续调用多个 slim 模型的方式值得直接复用:
text_passage = ("Here's what Costco reported for its fiscal second quarter of 2024 ...") # 抽取模型:以 'key' 为参数,在文本中寻找 'value' model = ModelCatalog().load_model("slim-extract-tool") response = model.function_call(text_passage, function="extract", params=["revenue"]) # topics 模型:生成 1-2 词的短语捕捉主题 model = ModelCatalog().load_model("slim-topics-tool") response = model.function_call(text_passage, function="classify", params=["topic"]) # boolean 模型:Yes/No 回答,加 "(explain)" 可要求附带解释 model = ModelCatalog().load_model("slim-boolean-tool") response = model.function_call(text_passage, params=["did earnings beat expectations? (explain)"])关于运行形态,示例末尾补充了重要事实:多数模型打包为 GGUF(模型名通常以-gguf或-tool结尾,对应GGUFGenerativeModel类),针对 CPU 笔记本(尤其 macOS)优化,速度最快;也可以用同模型的 PyTorch 版本,结果几乎一致但更慢。
4.2 构建第一个 Agent:LLMfx(示例 5)
agent-llmfx-getting-started.py 演示了用LLMfx类创建多步、多模型 Agent 工作流的完整范式:创建 agent、装载多个专用工具、执行一系列函数调用、自动生成按 key 聚合的字典报告:
from llmware.agents import LLMfx def create_multistep_report(customer_transcript): agent = LLMfx() # 1. 创建 agent agent.load_work(customer_transcript) agent.load_tool("sentiment") # 2. 逐个加载工具 agent.load_tool("ner") agent.load_tool_list(["emotions", "topics", "intent", "tags", "ratings", "answer"]) # 3. 依次/并发地执行函数调用 agent.sentiment() # 三个“软技能”初评(不同模型) agent.emotions() agent.intent() agent.exec_function_call("ratings") # 以字符串方式执行 agent.exec_multitool_function_call(["ner", "topics", "tags"]) # 一次并发多工具 # 'answer' 是量化问答模型,key 参数把输出归入报告字典 agent.answer("What is a short summary?", key="summary") response = agent.answer("What is the customer's account number and user name?", key="customer_info") # 4. 用完即卸载,释放内存 agent.unload_tool("ner") agent.unload_tool("topics") report = agent.show_report() # 5. 自动按 key 聚合的报告 activity_summary = agent.activity_summary() return {"report": report, "activity_summary": activity_summary, "journal": agent.journal}示例的输入是一段客户通话记录(投诉 Mixco 产品故障、提及账户号 93203、用户名 mjones、公司位于 Tampa),Agent 一次性产出情感、情绪、意图、评分、实体、主题、标签与问答信息,全部汇聚为结构化字典。
4.3 多步研究与 RAG 结合的 Agent(示例 6)
agents-6-agent-multistep-analysis.py 展示了 Agent 与 RAG 管线组合的进阶形态,示例注释列出了完整的七步流程:
- 用
Library构建研究资料库(示例加载Bill-Gates-Biography.pdf样本文档); - 用
Query查询资料库,定位感兴趣的主题; - 创建带 sentiment、emotions、topic、entities 工具的 Agent;
- 把查询结果交给 Agent 做多维分析;
- 对结果施加顶层过滤(按 sentiment);
- 对负面情感的段落跑追加分析;
- 组装为详细报告列表。
4.4 语音转文字:whisper-cpp(示例 7)
agents-7-using-whisper-cpp-sample-files.py 演示本地语音转文字。要点:
- 需先
pip install librosa; - 用
Setup().load_sample_voice_files从公开 S3 桶下载测试语音(famous_quotes、greatest_speeches、youtube_demos、earnings_calls四类,small_only=False时约 1.9 GB); - 关键参数通过
GGUFConfigs()设置,例如:
from llmware.gguf_configs import GGUFConfigs GGUFConfigs().set_config("whisper_cpp_verbose", "OFF") GGUFConfigs().set_config("whisper_cpp_realtime_display", True) GGUFConfigs().set_config("whisper_language", "en") # 默认英语,可改 'es' | 'fr' | 'de' | 'it' ... GGUFConfigs().set_config("whisper_remove_segment_markers", True)4.5 流式输出(示例 11)与 Web 服务(示例 12)
agents-11-gguf_streaming.py 演示 GGUF 模型的stream接口(自 llmware 0.2.13 起,适用于所有GGUFGenerativeModel类、即名字以 “gguf” 结尾的模型),并给出建议的聊天优化模型清单(phi-3-gguf、llama-2-7b-chat-gguf、llama-3-instruct-bartowski-gguf、zephyr-7b-gguf、tiny-llama-chat-gguf、qwen2-7B-instruct-gguf 等)。其要点是先通过GGUFConfigs().set_config("max_output_tokens", 1000)设置引擎级输出上限(默认 256),再在load_model时以max_output=500约束本次生成。
agents-12-web_services_slim_fx.py 演示“模型 + Web 服务”混合工作流:用slim-extract-tool、slim-summary-tool、bling-stablelm-3b-tool三个模型,配合YFinance(股票数据)与WikiParser(公司背景)两个 Web 服务,从一篇 NIKE 财报新闻出发,先抽取关键词(如股票代码)作为 Web 服务查询参数,再对二次来源做抽取、分析与摘要,最终产出约 30 个键值对的财务研究字典。运行前需pip3 install yfinance。
4.6 Text2SQL:自然语言查数据库(示例 13)
agents-13-text2sql-end-to-end-2.py 给出端到端配方:
- 加载
slim-sql-tool并跑初始测试确认安装; - 用随
slim-sql-tool安装包附带的示例 CSV(customer_table.csv)生成 SQL 表; - 以自然语言提问:查表结构 → 将表结构与问题组装 →
inference把文本转 SQL → 在内置的llmware-sqlite-experimental.db中执行 → 返回结果。
示例注释特别指出:SQLTables是实验性功能,该 sqlite 文件可随时安全删除;更通用的版本(支持 Postgres)见 agent_with_custom_tables.py。源码中 SQLTables 类 的文档同样说明:其仅支持 SQLite 本地文件数据库,功能上是 CustomTables 的子集,复杂场景推荐用CustomTables。
4.7 RAG 基准测试与模型筛选(示例 14、15)
agents-14-rag_instruct_benchmark_tester.py 演示对指定模型运行 RAG 基准测试并生成 JSON 报告:它从 llmware 的 Huggingface 仓库拉取标准的 200 问 RAG 基准数据集(datasets.load_dataset),逐条对模型执行直推,并记录耗时、保存报告文件。
agents-15-get_model_benchmarks.py 则演示如何“按成绩选模型”——使用 llmware/model_configs.py 中的model_benchmark_data与ModelCatalog的基准查询方法:
from llmware.model_configs import model_benchmark_data from llmware.models import ModelCatalog # 查看所有基准数据 for i, model in enumerate(model_benchmark_data): print("model: ", i, model) # 单模型成绩查询 score = ModelCatalog().get_benchmark_score("bling-phi-3-gguf") # 条件过滤:参数少于 7B 且准确率高于 95 condition = [{"parameters": "parameters < 7"}, {"accuracy_score": "accuracy_score > 95"}] accurate_small_models = ModelCatalog().get_benchmark_by_filter(condition) # 导出 jsonl 报告 ModelCatalog().save_benchmark_report()五、源码纵深:LLMfx 编排机制如何实现
指南的示例建立在 llmware/agents.py 中LLMfx类之上,源码给出了工作流“可靠、可观测、可聚合”的实现细节。
5.1 对象初始化与工作队列
从源码结构看,LLMfx的构造函数(agents.py#L71-L126)做了三件核心的事:
- 工具清单与映射:
self._supported_tools = _ModelRegistry().get_llm_fx_tools_list()、self._default_tool_map = _ModelRegistry().get_llm_fx_mapping(),并为每个工具预置<tool>_model = None属性槽位。这个工具到模型名的映射定义在 models.py#L122-L145:
| 工具类型 | 默认映射模型 | 工具类型 | 默认映射模型 |
|---|---|---|---|
| ner | slim-ner-tool | summary | slim-summary-tool |
| sentiment | slim-sentiment-tool | xsum | slim-xsum-tool |
| topics | slim-topics-tool | extract | slim-extract-tool |
| ratings | slim-ratings-tool | boolean | slim-boolean-tool |
| emotions | slim-emotions-tool | sa-ner | slim-sa-ner-tool |
| nli | slim-nli-tool | tags-3b | slim-tags-3b-tool |
| sql | slim-sql-tool | q_gen | slim-q-gen-tiny-tool |
| answer | bling-answer-tool | qa_gen | slim-qa-gen-tiny-tool |
| category | slim-category-tool | intent | slim-intent-tool |
| tags | slim-tags-tool | (其余) | — |
- 状态容器:
work_queue(待处理文本队列)、report(按工作项自动聚合的报告列表)、response_list(每次工具调用的响应记录)、journal(verbose 模式下打印到屏幕的过程日志)、inference_calls计数器等; - 首次使用自动初始化:若
LLMWareConfig.get_llmware_path()不存在,则自动调用LLMWareConfig.setup_llmware_workspace()建立工作区。
构造函数参数LLMfx(api_key=None, verbose=True, analyze_mode=True)中:verbose控制 journal 事件是否写屏幕;analyze_mode控制exec_function_call时是否抓取 logits 做置信度分析;此外还支持register_api_endpoint(...)切换到远程 API Agent 服务模式(默认http://127.0.0.1/8080)。
load_work方法(agents.py#L215)是灵活入口:传字符串则封装为{"text", "file_source", "page_num"}字典入队;传字典则校验并补齐缺失键后入队;传列表则逐条展开入队——这正是示例 6 能把 RAG 查询结果(带file_source/page_num元数据的块列表)直接灌给 Agent 的原因。
5.2 工具加载、调用与置信度分析
load_tool(tool_type, use_gpu=True, sample=False, get_logits=True, max_output=100, temperature=0.0)(agents.py#L433-L463)按映射表用ModelCatalog().load_model(...)装载默认模型;update_tool_map(tool_type, tool_name)支持运行中更换任意目录模型(先卸载旧模型、更新映射、再装载新模型);unload_tool调用model.unload_model()并gc.collect()释放内存,适合长时间运行的多阶段流程。
核心执行方法exec_function_call(tool_type, text=None, function="classify", params=None, get_logits=True)(agents.py#L525-L668)的完整链路是:
- 若直接传了
text,先load_work入队并top_of_work_queue()定位到队尾,否则取当前work_iteration对应的工作项文本; - 模型未加载则内联
load_tool,随后调用模型的function_call(text, function=..., params=..., get_logits=...); - 自动报告聚合:若响应的
usage.type为dict,直接把llm_response合并进当前工作项的report(summary工具的特殊 list 输出会被包装为{"summary": ...}后合并); - 置信度分析:
analyze_mode=True时,通过模型卡中的tokenizer名称调用ModelCatalog().logit_analysis(...),产出confidence_score、红黄绿(ryg)指示串与 token 候选 choices 并写入 journal,这是“小模型输出可被程序化信任”的关键机制; - 每次调用把
step、tool、llm_response、confidence_score、llm_usage、work_iteration及工作项元数据记入response_list,供follow_up_list(key, value)/analyze_responses(key, value)做条件筛选(示例 6 的“负面情感追加分析”即依赖此能力)。
exec_multitool_function_call(tool_type_list, ...)则是顺序遍历工具列表、逐个调用exec_function_call的便捷封装;show_report(iteration_num=None, add_source=True)支持查看单个工作项或全部报告,并可选附回源信息(file_source+page_num)。
5.3 BLING / DRAGON / SLIM 模型家族与替换策略
指南“Models”一节的结论是:全部示例都针对本地 CPU 模型优化,主力为 BLING、DRAGON 与 SLIM 三大家族;若要替换为目录中的其他模型,“通常只需切换model_name”,需要 API key 的模型在示例中均以环境变量方式传 key。
从示例 2 的脚本注释可以提炼出 BLING(Best Little Instruct No-GPU)/ DRAGON 家族的训练特性,这也解释了为何它们特别适合 Agent 工作流:
- 基于事实:依赖给定上下文的“grounded truth”,不提供上下文时常回答 “Not Found” 而非臆测——这正是 RAG/Agent 场景需要的行为;
- 短答案:通常几个 token 的精准回答,便于程序化归类、汇总与本地快速生成;
- 负样本 “Not Found”:训练集包含精心构造的不可回答样本,模型一致输出 “Not Found”,便于在多段落中判断“哪段(如果有的话)能回答目标问题”;
- 无需提示词指令:微调后模型默认期望“上下文段落 + 问题”的输入形态;
- 使用
temperature=0.0、sample=False时幻觉率较低。示例脚本还注明 BLING 模型参数规模在 0.5B–3.8B 之间,专为 CPU 运行设计。
GGUF 与 PyTorch 双形态的事实也来自示例 1 的注释:以-gguf/-tool结尾的模型为 GGUF 量化形态(GGUFGenerativeModel类),CPU 笔记本上效率最高;PyTorch 版本结果几乎一致但更慢。Windows 用户示例还额外指向 openvino / onnx 相关用法。
六、本地私有化:数据处理边界
指南“Local Private”一节的核心承诺值得强调:所有处理都发生在你的笔记本本地——无论是ModelCatalog加载 GGUF 模型、LLMfx多步分析、whisper-cpp 语音转写,还是SQLTables的 SQLite 查询,均不依赖外部推理服务。仓库结构印证了这一点:解析器原生库与 GGUF 引擎全部随包分发(llmware/lib/),setup.py按平台选择对应目录安装。唯一需要联网的环节是首次load_model时从模型仓库拉取模型文件(拉取后自动本地缓存),以及示例 14 从 llmware 的 Huggingface 仓库加载基准数据集、示例 12 调用 YFinance/Wikipedia 这类显式 Web 服务——后者属于用户主动引入的外部数据源,可按需裁剪。
七、小结与下一步
- 安装:
pip3 install llmware(或[full]),或克隆仓库后运行 welcome_to_llmware.sh;环境要求为 16GB+ 内存、Python 3.9–3.12、Mac M 系 / Windows / Ubuntu 20/22。 - 心智模型:llmware 的 Agent = 小型专用函数调用模型(SLIM 等)作为“工具” +
LLMfx的工作队列/报告聚合/journal 可观测性编排,完全本地运行。 - 上手路径:从 agents-1-start_here.py 的两步模式(
load_model→inference/function_call)入手,按 15 个示例逐步推进到LLMfx多工具编排(示例 5/6)、RAG+重排(示例 10)、Text2SQL(示例 13)与基准选型(示例 14/15)。 - 深挖入口:llmware/agents.py 的
LLMfx/SQLTables实现、llmware/models.py 的_ModelRegistry工具映射与ModelCatalog,以及solutions/下其余上百个示例;指南也欢迎反馈与示例贡献,这是一个持续演进的教程工程。
【免费下载链接】llmwareUnified framework for building enterprise RAG pipelines with small, specialized models项目地址: https://gitcode.com/GitHub_Trending/ll/llmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考