9个Python库把一个月的AI开发周期缩短到了3天
地球人都知道,Python 在人工智能领域的地位那是杠杠的。但是为了让程序能同时调用 OpenAI 和 Claude,通常需要写厚厚的封装层。为了解析客户发来的混乱 PDF,我甚至手动写过正则。结果是代码库越来越臃肿,维护成本也越来越高。 今天就介绍 9 个能够显著减少重复代码的 Python 库,涵盖了从数据接入到模型评估的完整链路。 在开始使用这些库之前,稳定且易于管理的 Python 环境是基础。对于新手程序员,在不同的版本、虚拟环境和依赖冲突中反复横跳,半天时间就这么荒废了。 可以通过 ServBay 来一键搞定 Python 环境,无论是切换版本还是管理数据库,点几下鼠标就能完成。这种把开发者从琐碎配置中解放出来的思路,和我接下来要分享的工具逻辑如出一辙。 环境准备就绪后,可以根据具体需求选择以下工具。 不同厂商的 API 标准各异。为了对比 GPT、Claude 或 Llama 的效果,我要写三套请求逻辑、三套错误处理。LiteLLM 出现后,就不需要这样了,它将这些接口标准化,实现了无缝切换。 这个降低了代码的耦合度。但在生产环境中需要注意,当厂商更新特有参数时,可能需要等待 LiteLLM 完成适配。 解析文档挺让我头疼的。为了处理 Word、Excel 和 PDF,我得装四个库,处理四种不同的报错。感谢微软的 MarkItDown, 它把所有文档都统一转成 LLM 最喜欢的 Markdown。 它能较好地保留标题和表格结构,减少了数据清洗的工作量。不过,它主要处理文字层,对于扫描件或复杂的图片表格,解析效果会有波动。 LlamaIndex 原名 GPT Index,专注于解决私有数据接入 LLM 的问题。它提供了从文档读取、索引构建到查询接口的完整流程。 它在处理复杂文档结构和构建 RAG 系统时表现稳健,是目前主流的数据框架之一。 以前我总是求着 AI 返回 JSON,结果它总是在开头加一句“好的,这是你要的 JSON”,导致我的解析程序崩溃。PydanticAI 直接定义了数据边界。 它把 AI 调用变成了类型安全的函数调用。 如果我只需要一个简单的分类或提取功能,我不想写复杂的 Prompt。Marvin 让我能像写普通函数一样写 AI 逻辑,而且非常适合处理分类、提取或生成任务。 这种方式让 AI 能力能够以最小的侵入性集成到现有系统中。 Haystack 适合构建大规模的搜索系统。它支持多种向量数据库(如 Qdrant、Elasticsearch),因为它能把检索、排序、过滤像搭积木一样组合起来。 对于需要处理海量文档并实现语义检索的应用,Haystack 提供了良好的扩展性。 我曾经因为一个递归逻辑产生的超长 Prompt,单次调用就花了 1.5 美元。现在我学乖了,在发送请求前要算一下账。而 tiktoken 是计算速度极快的分词器,常用于 OpenAI 模型的成本预估。 它让我对成本有了实时的掌控,不再被月底的账单吓一跳。 在处理几十万条数据检索时,普通的线性搜索会卡死。FAISS 作为 Meta 开源的向量库,能在毫秒级时间内从数亿个向量中找出与查询最相关的片段。 它是目前向量检索领域的标杆工具,尤其在本地化部署时表现优异。 我以前改提示词全靠感觉,跑两个例子,看着顺眼就上线。结果上线后发现修复了一个 Bug 却带出三个新 Bug。Pydantic Evals 就能让我跑自动化的回归测试,通过预设案例来验证模型表现。 这种确定性是开发生产级应用的前提。 LiteLLM 统一了接口,MarkItDown 简化了文档处理,PydanticAI 保证了输出质量。 这几个库让开发效率蹭蹭上涨,假期综合症都好了。搭建 Python 开发环境
LiteLLM:统一多平台模型调用
from litellm import completion
# 无论是调 GPT-4 还是 Claude,逻辑完全一样
def ask_ai(model_name, prompt):
res = completion(
model=model_name,
messages=[{"role": "user", "content": prompt}]
)
return res.choices[0].message.content
# 换模型只需要改个字符串
print(ask_ai("gpt-4o", "RAG是什么?"))
print(ask_ai("claude-3-5-sonnet", "RAG是什么?"))MarkItDown:多格式文档转 Markdown
from markitdown import MarkItDown
md_converter = MarkItDown()
# 解析 PDF 或 Excel
doc_result = md_converter.convert("annual_report.pdf")
table_result = md_converter.convert("budget.xlsx")
print(doc_result.text_content)LlamaIndex:连接数据与大模型的框架
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 自动读取目录下所有文档并构建索引
data_docs = SimpleDirectoryReader("./docs").load_data()
data_index = VectorStoreIndex.from_documents(data_docs)
# 快速创建查询引擎
engine = data_index.as_query_engine()
print(engine.query("总结文档的核心观点"))PydanticAI:类型安全的智能体开发
from pydantic import BaseModel
from pydantic_ai import Agent
class AnalysisResult(BaseModel):
summary: str
score: float
analysis_agent = Agent(
"openai:gpt-4o",
result_type=AnalysisResult,
system_prompt="分析用户反馈并打分"
)
output = analysis_agent.run_sync("这个功能非常好用,提升了工作效率")
print(output.data.summary)Marvin:将 AI 能力封装为函数
import marvin
@marvin.fn
def generate_tags(description: str) -> list[str]:
"""
根据产品描述生成 3 个标签
"""
tags = generate_tags("高性能全铝合金笔记本电脑,支持快速充电")
print(tags) # 输出类似 ['科技', '办公', '便携']Haystack:端到端的检索流水线
from haystack import Pipeline
from haystack.components.builders import PromptBuilder
from haystack.components.generators import OpenAIGenerator
# 组装流水线节点
query_pipeline = Pipeline()
query_pipeline.add_component("prompt_builder", PromptBuilder(template="回答:{{query}}"))
query_pipeline.add_component("llm", OpenAIGenerator(model="gpt-4o"))
query_pipeline.connect("prompt_builder", "llm")
res = query_pipeline.run({"prompt_builder": {"query": "如何学习 Python?"}})tiktoken:精准计算 Token 消耗
import tiktoken
tokenizer = tiktoken.encoding_for_model("gpt-4")
content = "测试文本的 token 数量"
token_list = tokenizer.encode(content)
print(f"Token 计数: {len(token_list)}")FAISS:高效的向量相似度搜索
import faiss
import numpy as np
# 初始化索引
vector_dim = 64
search_index = faiss.IndexFlatL2(vector_dim)
# 模拟添加向量数据
mock_data = np.random.random((1000, vector_dim)).astype('float32')
search_index.add(mock_data)
# 执行搜索
distances, results = search_index.search(mock_data[:1], 3)Pydantic Evals:提示词回归测试
from pydantic_evals import Case, Dataset
# 定义测试集
eval_dataset = Dataset(
cases=[
Case(inputs="提取公司名:微软发布了新系统", expected_output="微软"),
]
)
# 运行评估并查看报告
results = eval_dataset.evaluate(your_extract_function)
results.print()总结