
llmware 如何不使用数据库在内存中解析文档并直接用于 Prompt【免费下载链接】llmwareUnified framework for building enterprise RAG pipelines with small, specialized models项目地址: https://gitcode.com/GitHub_Trending/ll/llmware当手头只有若干个本地文档PDF、Office、文本等想直接让模型基于这些文档回答问题又不想为此搭建数据库、创建 library 时llmware 提供了一条不需要任何数据库的路径Parser().parse_one()把单个文档在内存中解析成 blocks或者更直接地用Prompt.add_source_document()把文档边解析边打包进 Prompt随后调用prompt_with_source()完成推理。仓库中对应的完整示例是 parse_in_memory.py 和 parse_into_prompt.py文档入口见 Parsing 示例页。准备条件安装文档installation.md给出的环境要求平台Mac M1/M2/M3、Windows、LinuxUbuntu 20 或 Ubuntu 22 优先RAM16 GB 起步Python 3.9、3.10、3.11文档注明 3.12 暂不支持安装pip3 install llmware如果要在本地跑推理模型示例选用的是llmware/bling-1b-0.1代码注释说明它在笔记本 CPU 上运行typically requires 16 GB laptop RAM首次使用时可能需要几分钟从 HuggingFace 下载模型。步骤一准备待解析的文档两个示例都先用Setup().load_sample_files()从非受限的 AWS S3 公共桶下载 llmware 自带样例文档解压到llmware_path/sample_files下并返回该路径llmware/setup.py中的文档字符串显示返回值形如/home/user/llmware_data/sample_files。下载到的样例文件夹包括Agreements约 15 份合同文档Invoices40 份 PDF 发票样例UN-Resolutions-500500 份 PDFSmallLibrary约 10 份 PDF 与 Office 混合文档FinDocs约 15 份财务报告AgreementsLarge约 80 份合同文档注意load_sample_files()的行为如果sample_files路径已存在且未传over_writeTrue函数直接返回已有路径、不会重新下载。你自己的文档则把路径直接指向本地文件夹即可这一节仅用于跟示例走。步骤二可选路径先用 Parser 在内存中解析单个文档parse_in_memory.py演示了最底层的无数据库解析核心就一行调用from llmware.parsers import Parser from llmware.setup import Setup sample_files_path Setup().load_sample_files() ingestion_file_path os.path.join(sample_files_path, Agreements) for doc in os.listdir(ingestion_file_path): parser_output Parser().parse_one(ingestion_file_path, doc, save_historyFalse) if parser_output: # parser_output 是 blocks 列表每个 block 是带 metadata 的 dict print(fextracted {len(parser_output)} blocks) for blocks in parser_output[:10]: print(blocks[block_ID], blocks[text]) else: print(fdid not find any content for file - {doc})要点parse_one(fp, fn, save_historyTrue)的源码注释写明这是 Parse one ad hoc unbound parsing of a single document in memory - no library required即按扩展名自动分发到 PDF / Office / text / voice 的内存解析分支不依赖 library。参数fp是文件夹路径、fn是文件名save_historyFalse表示不把解析历史落库。返回值是 blocks 列表每个 block 至少包含text和block_ID字段示例按这两个键打印。验证方式解析成功时打印extracted N blocks以及前 10 个 block 的内容示例中超过 100 字符的 text 会截断显示解析不出内容时parser_output为空脚本打印did not find any content for file - {doc}源码侧同时会记录Parser - parse_one - no content parsed from document的警告日志。如果你只需要把解析结果用于程序内部处理比如导出 JSON到这一步就够了下面一步才是直接用于 Prompt。步骤三把文档直接挂到 Prompt 上并调用模型这是本场景的主路径对应 prompt_with_sources.md 和parse_into_prompt.py。关键类方法是Prompt.add_source_document(input_fp, input_fn, queryNone)它内部调用Parser().parse_one()解析文档并做 text chunking可选地用query在内存里对 blocks 做一次过滤再把文本连同文件 metadata 打包成 source 挂到 Prompt 对象上。完整可运行代码摘自parse_into_prompt.pyimport os from llmware.prompts import Prompt from llmware.setup import Setup def prompt_source(model_name): # step 1 - 下载样例文档 sample_files_path Setup().load_sample_files() contracts_path os.path.join(sample_files_path, Agreements) # step 2 - 加载本地 BLING 模型首次会从 HuggingFace 下载 prompter Prompt() prompter.load_model(model_name) # 要问给每份文档的问题 research {topic: base salary, prompt: What is the executives base salary?} for contract in os.listdir(contracts_path): if contract ! .DS_Store: # 排除 Mac 特有文件 # 文档被解析、chunk 化再按 base salary 过滤 # 不传 query 时整个文档都会被加入 source source prompter.add_source_document(contracts_path, contract, queryresearch[topic]) print(Source created from document: , source) # 调用 LLMsource 内容自动打包进 prompt responses prompter.prompt_with_source(research[prompt], prompt_namedefault_with_context, temperature0.3) for response in responses: print(\nLLM Response: , response[llm_response]) # 处理完这份合同清除 source prompter.clear_source_materials() if __name__ __main__: prompt_source(llmware/bling-1b-0.1)各步骤的说明与判断依据add_source_document返回的sources对象会被打印出来可以看到本次挂上去的文本批次与统计信息——这是文档已解析并打包的直接验证。若没有文本挂上源码会记录警告No source added in .add_source_document.。query是可选参数不传时整份文档进入 source传了则只对匹配的 text chunks 做 in-memory filtering。prompt_with_source返回一个list文档较大、按模型 context window 分批时可能有多次推理所以示例用循环遍历responses每项取response[llm_response]。prompt_namedefault_with_context表示把 source 作为 context 使用的 prompt 模板temperature0.3是示例中指定的采样参数。clear_source_materials()用于处理完当前文档后清空 source。示例注释说明如果希望多份文档聚合进同一个running source就不要调用它。成功条件终端依次打印每份合同名、Source created from document的 source 摘要以及形如LLM Response: ...的模型回答。结果核对prompt_with_source 的行为边界components/prompt_with_sources.md 中的精简示例与上述行为一致from llmware.prompts import Prompt prompter Prompt().load_model(llmware/bling-tiny-llama-v0) source prompter.add_source_document(/folder/to/one/doc/, filename, queryfast query) responses prompter.prompt_with_source(my query) for i, response in enumerate(responses): print(response: , i, response)其中/folder/to/one/doc/和filename需要替换为你自己的文档文件夹路径与文件名这是文档中给出的占位写法。两个与上面示例不同的点值得注意这里加载的模型是llmware/bling-tiny-llama-v0比bling-1b-0.1更小的本地模型两个模型名均来自仓库文档。源码中prompt_with_source的默认参数是first_source_onlyTrue即多 source 时只用第一个批次要按 batch 遍历需显式传first_source_onlyFalse或指定source_id_list。文档未挂上 source 时也会继续推理但只记录警告回答质量不保证——所以看到No source materials attached to the Prompt警告时应先回到add_source_document一步检查路径与文件名。限制与适用边界这条路径的定位是单文档/少量文档的ad hoc场景parse_one不需要 libraryadd_source_document直接吃本地文件夹路径 文件名。文档量大、需要跨文档检索时仓库的常规路径是先入库建 library本文不展开。支持的文件类型由parse_one的扩展名分支决定pdf、self.office_types、self.text_types、self.voice_types不在这些集合内的文件不会产出 blocks。模型首次加载需要联网从 HuggingFace 下载Setup().load_sample_files()需要访问 AWS S3 公共桶。RAM 16 GB 是文档给出的本地运行 BLING 模型的最低要求解析本身对内存的压力远小于模型推理。想继续走建库 检索的完整 RAG 流程可以看 rag 目录下的分步示例本文覆盖的无数据库、直接进 Prompt到此即完整闭环。【免费下载链接】llmwareUnified framework for building enterprise RAG pipelines with small, specialized models项目地址: https://gitcode.com/GitHub_Trending/ll/llmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考