# LLM生成代码的库依赖陷阱:84%错误率与agentic修复实践
大语言模型生成的代码,最隐蔽的坑不在逻辑,而在import。一句看似合理的 `from langchain.chat_models import ChatOpenAI`,在LangChain 0.3系列版本中直接抛ImportError。这不是个例。arXiv最新论文《Understanding and Mitigating Library-Related Issues in LLM-Generated Code》给出了扎心数据:用GPT-5.2(知识截止2025年8月)生成的100个RAG脚本里,84个文件至少包含一个库相关错误。论文覆盖了LangChain、AutoGen、CrewAI、LlamaIndex、Agno五个主流框架,每个框架都在快速演化,而模型的记忆显然没跟上。
## 五类库错误,每个都致命
论文把这84%的错误分成五类,我结合代码实例梳理如下。
**Incorrect Import Path** 出现最多,93次,影响81个文件。典型错误是 `from langchain.chat_models import ChatOpenAI`,但ChatOpenAI在LangChain 0.3中已经被迁移到了独立包`langchain_openai`。模块路径和实际库结构不匹配,运行第一行就崩。
**Missing Import** 排第二,79次,影响54个文件。AutoGen组件被直接使用,代码里却找不到`import autogen`。这个错误很反直觉——模型写了API调用,却漏掉最基础的依赖引入。
**Hallucinated Import** 有28次,影响25个文件。比如 `from openai import OpenAIGym`,OpenAI SDK里根本没有这个类。它语法完全合法,IDE不报错,直到运行才暴露。
**Deprecated Import** 有17次。典型是`import openai`之后直接`openai.ChatCompletion.create`,这是OpenAI Python SDK v0.x的用法,v1.x必须改成client实例化。
**Unused Import** 有11次。`import requests`出现但后面完全没用,属于冗余依赖。
一个文件可能同时犯多个错误。比如先写错的import路径,再补一个不存在的类,最后调用一个废弃方法。逐行看都是小问题,合起来就是代码无法运行。
## 根因:知识截断与库演化的错位
为什么模型会在import上反复翻车?核心原因是训练语料中的代码快照滞后于第三方库的演化速度。LangChain从0.1到0.3历经了多次模块拆分,AutoGen在0.4版本彻底重构了运行时。LLM在生成时,会基于概率混合不同版本的API记忆,产生“跨版本拼凑”的代码。
RAG pipeline放大了这个问题。一个简单的PDF问答系统要依赖PyPDFLoader、FAISS、OpenAIEmbeddings、RecursiveCharacterTextSplitter、RetrievalQA等组件,每个组件都有自己的第三方依赖树。模型需要在一次生成中同时命中五个库的最新API,错误率自然高。
论文提出的agentic修复思路很直接:不再让模型凭记忆写import,而是给它一个“库望远镜”,让它实时查看当前环境里真实存在的模块和函数。
## agentic修复:从猜测到查证
这个框架分四步。第一步,运行生成的代码,捕获ImportError和AttributeError。第二步,用分类器判断错误类型,是路径错误、缺失依赖还是幻觉依赖。第三步,调用库探索器扫描当前环境的包结构,列出指定包的实际成员。第四步,把扫描结果和错误堆栈一起交给修复模型,生成新版代码并重新验证。
论文的关键数据在下面这张对比表里。直接提示的baseline正确率,在不同模型上差异很大:
| 模型 | 直接提示 | agentic修复 | 提升 |
|---|---|---|---|
| GPT-5 | 81% | 85% | +5% |
| DeepSeek-V3 | 71% | 83% | +12% |
| Qwen-3 | 67% | 82% | +15% |
| Mistral | 64% | 78% | +14% |
| Llama-3 | 61% | 77% | +16% |
总库错误数下降幅度是38%到55%。注意一个现象:基础模型越弱,相对提升反而越大。Llama-3的错误数减少了48%,Mistral减少了55%。这证明agentic修复不是对特定模型的补丁,而是系统性解决了所有模型在库知识上的盲区。修复一个文件的中位迭代次数是1.68到2.53轮,没有陷入疯狂重试。
## 实战:修复一个PDF RAG脚本
我复现了论文中最典型的错误场景。用户提示要求生成一个基于PDF的RAG系统,模型输出如下代码:
```python
# 错误示例:LangChain 0.3.x + OpenAI SDK 1.x 下无法运行
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import FAISS
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
loader = PyPDFLoader("report.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(chunks, embeddings)
llm = ChatOpenAI(model="gpt-5.2")
qa = RetrievalQA.from_chain_type(llm=llm, retriever=db.as_retriever())
answer = qa.run("总结这份报告")
```
这段代码至少有四个错误。`langchain.chat_models`已拆到`langchain_openai`,`langchain.vectorstores`和`langchain.embeddings`进了`langchain_community`,`qa.run`也变成了`qa.invoke`。如果直接跑,第一行就崩。
论文的agentic方法会怎么做?它先用静态扫描捕获ImportError,然后用`pkgutil.iter_modules`列出真实包结构:
```python
import pkgutil, importlib
def resolve_import(module_name: str):
try:
mod = importlib.import_module(module_name)
return [m.name for m in pkgutil.iter_modules(mod.__path__)]
except ImportError:
return None
# 检查 langchain_openai 是否存在 ChatOpenAI
print(resolve_import("langchain_openai"))
```
扫描结果会告诉修复模型:`ChatOpenAI`和`OpenAIEmbeddings`在`langchain_open