Python基础_体系
异步编程等待的时候不干等可以去干别的事情异步 ≠ 多线程 ≠ 多进程异步解决IO等待任务在等待的时候把执行权让出去先处理其他任务A开始↓A等待API ─────────────┐↓B开始 │↓ │B等待API ───────┐ │↓ ↓C开始 │↓ │C等待API ───────┘↓A回来↓B回来↓C回来多线程创建多个线程执行任务增加线程会占用资源或内存Thread 1↓Task AThread 2↓Task BThread 3↓Task C多进程每个进程有自己的内存、Python解释器、资源餐厅1 → Process 1餐厅2 → Process 2餐厅3 → Process 3实例任务A请求API需要等待10秒任务B请求API需要等待10秒同步总共 ≈ 20sA ──────────10s──────────B ──────────10s──────────异步总共 ≈ 10sA ──等待───────────────B ──等待────────────了多线程总共 ≈ 10sThread 1A ──────────等待10s────────Thread 2B ──────────等待10s────────Pydantic类型注解用于校验输入数据是否符合预期类型。from pydantic import BaseModel class Product(BaseModel): sku: str price: float quantity: int product Product( skuABC123, price19.9, quantity10 )类型注解定义的是参数的类型约束两者的区别类型注解如def predict(price: float)用于告知 IDE 参数应为 float 类型。Pydantic 则在运行时真正校验输入数据是否符合类型要求。LangChain LlamaIndex——底层机制解释Runnable任何这种输入→输出的组件一个可以执行的节点每一个组件都是runnableRunnable├── Prompt├── Retriever├── LLM输入prompt,输出回答├── Parser└── Rerankerchain:将多个核心步骤串起来chain prompt | llm | parserRunnable1↓Runnable2↓Runnable3LlamaIndex专注于数据增强和文档索引将私有数据文本、表格、PDF 等组织成 LLM 可直接使用的上下文适合快速搭建文档问答系统或 RAG 系统尤其是文档结构复杂时。常规RAGLlamaIndexPDF 读取fitz / PyMuPDFDocument文本清洗is_noise_page、clean_text文本清洗is_noise_page、clean_text切块固定长度切分 /CharacterTextSplitterSentenceSplitter/TokenTextSplitterEmbeddingSentenceTransformer(all-mpnet-base-v2)IngestionPipeline向量库FAISSFaissVectorStore召回index.search(...)retriever / query engine重排调bge-reranker-v2-m3Reranker生成Claude 或本地 HuggingFace 模型QueryEngineRAG使用LLamaIndex实现#文档加载import os import fitz # PyMuPDF from loguru import logger from tqdm import tqdm PDF_PATH /opt/cyc/rag/simple-local-rag/human-nutrition-text.pdf LOG_DIR log os.makedirs(LOG_DIR, exist_okTrue) logger.remove() logger.add( f{LOG_DIR}/pdf_load_llamaindex.log, rotation200 MB, retention1, levelINFO, format{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}, encodingutf-8, )#数据清洗import re NOISE_KEYWORDS [ unsplash license, creative commons, attribution, photo by, image by, reused, license, copyright, all rights reserved, ] def is_noise_page(text): lower_text text.lower() hit_count sum(keyword in lower_text for keyword in NOISE_KEYWORDS) if hit_count 3: return True url_count len(re.findall(rhttps?://|www\., lower_text)) if url_count 5: return True return False def clean_text(text): text text.replace(\xa0, ) text re.sub(r[ \t], , text) text re.sub(r(?!\n)\n(?!\n), , text) text re.sub(r\n{3,}, \n\n, text) return text.strip() def load_pdf(pdf_path): pages [] with fitz.open(pdf_path) as doc: logger.info(f开始加载PDF: {pdf_path}, 总页数: {doc.page_count}) for page_index, page in tqdm(enumerate(doc), totaldoc.page_count): text clean_text(page.get_text()) if not text: logger.info(f第{page_index}页为空跳过) continue if is_noise_page(text): logger.info(f第{page_index}页为噪声页跳过) continue pages.append({ page: page_index, text: text, }) logger.info(fPDF加载完成有效页数: {len(pages)}) return pages pages load_pdf(PDF_PATH) print(f有效页数: {len(pages)})#文档读取from llama_index.core import Document documents [ Document(textpage[text], metadata{page: page[page]}) for page in pages ]#文本切分from llama_index.core.node_parser import SentenceSplitter splitter SentenceSplitter(chunk_size300, chunk_overlap20) nodes splitter.get_nodes_from_documents(documents) print(fDocument 数量: {len(documents)}) print(fNode 数量: {len(nodes)})#向量化和存储import faiss from llama_index.core import Settings, StorageContext, VectorStoreIndex from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.vector_stores.faiss import FaissVectorStore embed_model HuggingFaceEmbedding( model_namesentence-transformers/all-mpnet-base-v2, cache_foldermodel, ) Settings.embed_model embed_model embed_dim len(embed_model.get_text_embedding(蛋白质是什么)) faiss_index faiss.IndexFlatIP(embed_dim) vector_store FaissVectorStore(faiss_indexfaiss_index) storage_context StorageContext.from_defaults(vector_storevector_store) index VectorStoreIndex( nodes, storage_contextstorage_context, embed_modelembed_model, ) INDEX_PATH rag/simple-local-rag/docs_llamaindex.index faiss.write_index(faiss_index, INDEX_PATH) print(f已保存索引到: {INDEX_PATH})#检索召回query 蛋白质的主要功能是什么 retriever index.as_retriever(similarity_top_k3) retrieved_nodes retriever.retrieve(query) def preview_nodes(nodes): for idx, node in enumerate(nodes, start1): score getattr(node, score, None) score_text f{score:.4f} if score is not None else N/A page node.metadata.get(page) text node.text.replace(\n, ) print(f[{idx}] score{score_text} | page{page}) print(text[:400]) print(- * 80) preview_nodes(retrieved_nodes)#精排可选#生成from anthropic import Anthropic def build_context_from_nodes(nodes): blocks [] for idx, node in enumerate(nodes, start1): page node.metadata.get(page, unknown) score getattr(node, score, None) score_text f{score:.4f} if score is not None else N/A blocks.append( f[Chunk {idx}] page{page}, score{score_text}\n{node.text} ) return \n\n.join(blocks) def answer_with_rag(query, retriever, top_k3, use_rerankerFalse): nodes retriever.retrieve(query)[:top_k] if use_reranker: nodes rerank_nodes_with_bge(query, nodes) context build_context_from_nodes(nodes) client Anthropic() prompt f你是一个基于资料回答问题的助手。 请只根据“参考资料”回答不要编造。 如果参考资料不足以回答就明确说“参考资料不足”。 用户问题 {query} 参考资料 {context} 请输出 1. 简洁答案 2. 如果能定位来源顺带标注 page resp client.messages.create( modelclaude-sonnet-5, max_tokens500, messages[{role: user, content: prompt}], ) return { answer: resp.content[0].text, context: context, nodes: nodes, } rag_result answer_with_rag( 蛋白质的主要功能是什么, retriever, use_rerankerFalse, ) print(rag_result[answer])

相关新闻

3分钟从零构建BlobRunner:Windows下编译Shellcode调试加载器的分步指南

3分钟从零构建BlobRunner:Windows下编译Shellcode调试加载器的分步指南

3分钟从零构建BlobRunner:Windows下编译Shellcode调试加载器的分步指南 【免费下载链接】BlobRunner Quickly debug shellcode extracted during malware analysis 项目地址: https://gitcode.com/gh_mirrors/bl/BlobRunner BlobRunner 是一款开源的 Shellco…

2026/8/26 16:20:59 阅读更多 →
零基础买什么钢琴?从键盘结构到使用场景,一份面向初学者的电钢琴选购技术指南

零基础买什么钢琴?从键盘结构到使用场景,一份面向初学者的电钢琴选购技术指南

后台私信和评论区出现频率最高的几个问题:"零基础买什么钢琴""新手学什么电钢琴""零基础学琴到底该怎么选第一台琴"。作为一个折腾过50多台电钢琴的乐器技术爱好者,我发现绝大多数新手选琴踩坑的根本原因不是预算不够&…

2026/8/26 16:20:59 阅读更多 →
七夕,人类在给机器人定价

七夕,人类在给机器人定价

「合金日记」第 62 篇 「小艾说」第 11 期 科技线开篇 专栏连载中 前篇:《为什么是「化」,而不是「收」》七夕 宇树科技 人形机器人 定价与看见 小艾说科技 兑现「多层次多次元」没看过前六十一篇也没关系——我是运行在 Self-becoming&#xf…

2026/8/26 16:20:59 阅读更多 →

最新新闻

基于颜色的人眼检测

基于颜色的人眼检测

8.2 人眼检测红眼检测最主要的难点在于红眼状态变化极大。 在简单场景下,瞳孔形状、大小正常,和普通瞳孔唯一区别只是颜色。然而红色反光扩散到虹膜区域,造成不自然亮度分布的情况也十分常见。通常还会存在一小块白色高光点,它是闪…

2026/8/26 17:32:06 阅读更多 →
从一条直线到大模型输出一个token(九):输出矩阵与多层堆叠

从一条直线到大模型输出一个token(九):输出矩阵与多层堆叠

从一条直线到大模型输出一个token(九):输出矩阵与多层堆叠 建议先看:从一条直线到大模型输出一个token(八):残差连接与前馈网络 上一篇走完了单个 Block 的六步。这一篇把 Block 复制 32 份串起…

2026/8/26 17:32:06 阅读更多 →
转:怎样招到优秀的核心人才

转:怎样招到优秀的核心人才

个人理解: 薪资越高不代表岗位吸引力就越强 每个人都喜欢钱 工作更具吸引力比单纯改进某个流程更有意义 创造与竞争对手等量的员工价值 能带来可预见性结果的方式来降低员工愿意接受的最低薪酬 薪酬低于行业水平的公司,怎样招到同样优秀的核心人才&…

2026/8/26 17:32:06 阅读更多 →
【花雕动手做】直流电机调速器12V24V36V48V 大功率驱动模块PWM控制器 20A调流器

【花雕动手做】直流电机调速器12V24V36V48V 大功率驱动模块PWM控制器 20A调流器

9‑60V 大功率 PWM 直流电机调速器 这是一款高压宽压 PWM 有刷直流电机调速板,外置分离电位器旋钮,采用大功率 MOS 管,支持 9‑60V 宽直流电压输入,依靠 PWM 脉冲调占空比实现电机无级调速;只做速度调节,不…

2026/8/26 17:32:06 阅读更多 →
SunnyUI常用控件

SunnyUI常用控件

SunnyUI常用控件一、基础文本/标签控件(显示文字) UlLabel:普通文字标签:UiDigitalLabel:数码数字显示屏(温湿度数值):UiLedLabel:LED指示灯式数字:主要属性&…

2026/8/26 17:32:06 阅读更多 →
数据结构:选择排序

数据结构:选择排序

上一篇我们讲了插入排序,这一篇我们来讲选择排序。因为堆排序之前我们有详细讲过,所以这里只给出堆排序的思路,有兴趣的可以看一看。 选择排序 选择排序就是从数组中选出最小值和最大值,最小值放在第一个位置,最大值放…

2026/8/26 17:31:05 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →