9个Python库把一个月的AI开发周期缩短到了3天

0 阅读5分钟

地球人都知道,Python 在人工智能领域的地位那是杠杠的。但是为了让程序能同时调用 OpenAI 和 Claude,通常需要写厚厚的封装层。为了解析客户发来的混乱 PDF,我甚至手动写过正则。结果是代码库越来越臃肿,维护成本也越来越高。

今天就介绍 9 个能够显著减少重复代码的 Python 库,涵盖了从数据接入到模型评估的完整链路。

搭建 Python 开发环境

在开始使用这些库之前,稳定且易于管理的 Python 环境是基础。对于新手程序员,在不同的版本、虚拟环境和依赖冲突中反复横跳,半天时间就这么荒废了。

可以通过 ServBay 来一键搞定 Python 环境,无论是切换版本还是管理数据库,点几下鼠标就能完成。这种把开发者从琐碎配置中解放出来的思路,和我接下来要分享的工具逻辑如出一辙。

环境准备就绪后,可以根据具体需求选择以下工具。

LiteLLM:统一多平台模型调用

不同厂商的 API 标准各异。为了对比 GPT、Claude 或 Llama 的效果,我要写三套请求逻辑、三套错误处理。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是什么?"))

这个降低了代码的耦合度。但在生产环境中需要注意,当厂商更新特有参数时,可能需要等待 LiteLLM 完成适配。

MarkItDown:多格式文档转 Markdown

解析文档挺让我头疼的。为了处理 Word、Excel 和 PDF,我得装四个库,处理四种不同的报错。感谢微软的 MarkItDown, 它把所有文档都统一转成 LLM 最喜欢的 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:连接数据与大模型的框架

LlamaIndex 原名 GPT Index,专注于解决私有数据接入 LLM 的问题。它提供了从文档读取、索引构建到查询接口的完整流程。

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("总结文档的核心观点"))

它在处理复杂文档结构和构建 RAG 系统时表现稳健,是目前主流的数据框架之一。

PydanticAI:类型安全的智能体开发

以前我总是求着 AI 返回 JSON,结果它总是在开头加一句“好的,这是你要的 JSON”,导致我的解析程序崩溃。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)

它把 AI 调用变成了类型安全的函数调用。

Marvin:将 AI 能力封装为函数

如果我只需要一个简单的分类或提取功能,我不想写复杂的 Prompt。Marvin 让我能像写普通函数一样写 AI 逻辑,而且非常适合处理分类、提取或生成任务。

import marvin

@marvin.fn
def generate_tags(description: str) -> list[str]:
    """
    根据产品描述生成 3 个标签
    """

tags = generate_tags("高性能全铝合金笔记本电脑,支持快速充电")
print(tags) # 输出类似 ['科技', '办公', '便携']

这种方式让 AI 能力能够以最小的侵入性集成到现有系统中。

Haystack:端到端的检索流水线

Haystack 适合构建大规模的搜索系统。它支持多种向量数据库(如 Qdrant、Elasticsearch),因为它能把检索、排序、过滤像搭积木一样组合起来。

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?"}})

对于需要处理海量文档并实现语义检索的应用,Haystack 提供了良好的扩展性。

tiktoken:精准计算 Token 消耗

我曾经因为一个递归逻辑产生的超长 Prompt,单次调用就花了 1.5 美元。现在我学乖了,在发送请求前要算一下账。而 tiktoken 是计算速度极快的分词器,常用于 OpenAI 模型的成本预估。

import tiktoken

tokenizer = tiktoken.encoding_for_model("gpt-4")
content = "测试文本的 token 数量"
token_list = tokenizer.encode(content)

print(f"Token 计数: {len(token_list)}")

它让我对成本有了实时的掌控,不再被月底的账单吓一跳。

FAISS:高效的向量相似度搜索

在处理几十万条数据检索时,普通的线性搜索会卡死。FAISS 作为 Meta 开源的向量库,能在毫秒级时间内从数亿个向量中找出与查询最相关的片段。

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:提示词回归测试

我以前改提示词全靠感觉,跑两个例子,看着顺眼就上线。结果上线后发现修复了一个 Bug 却带出三个新 Bug。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()

这种确定性是开发生产级应用的前提。


总结

LiteLLM 统一了接口,MarkItDown 简化了文档处理,PydanticAI 保证了输出质量。

这几个库让开发效率蹭蹭上涨,假期综合症都好了。