基于自定义函数库训练LLM生成代码及token超限问题咨询
精简库代码,只保留核心信息
别把整个库的代码都塞进去,只提取每个函数的签名、关键参数、返回值和核心注释,砍掉冗余的实现细节、测试代码、日志这些没用的内容。可以写个简单的脚本批量处理,比如用Python的inspect模块:import inspect def get_func_core_info(func): sig = inspect.signature(func) doc = inspect.getdoc(func) or "" # 只留文档前3行核心描述 core_doc = "\n".join(doc.split("\n")[:3]) return f"def {func.__name__}{sig}:\n \"\"\"{core_doc}\"\"\""要是有一堆功能相似的函数,直接归类,只留典型函数的信息,说明其他函数功能类似就行。
分模块分批注入上下文
把库拆成几个逻辑模块(比如按功能、按文件),每次只给LLM喂一个模块的精简内容,分多轮让它逐步学习。比如第一轮先给数据处理模块的函数信息,让它生成该模块的调用代码;第二轮再给模型推理模块的内容,结合之前的知识生成跨模块代码。尽量把相关度高的模块打包在一起,减少轮次,利用好gpt-4-32k的长上下文空间。用检索增强生成(RAG)按需调用
把每个函数的签名、文档、示例转成嵌入向量存到向量数据库里。当要生成代码时,先根据用户的需求(比如“写个用这个库处理CSV的代码”)检索最相关的函数,只把这些相关函数的信息塞进上下文,不用加载整个库。这种方式不用一次性喂全量内容,按需取最有用的部分,token消耗会少很多。微调小模型替代上下文注入
要是每次调用都塞大上下文太麻烦,不如拿自定义库的核心函数信息和调用示例去微调一个开源小模型(比如Llama 2 7B/13B)。微调时不用喂全量代码,只给关键信息就行,训练完的模型直接就能生成相关代码,不用每次都把库加载到上下文里。虽然微调需要点算力,但长期用起来更高效。靠代码示例驱动训练
整理一批自定义库的常用调用示例,只把这些示例和对应的函数签名给LLM,不用全量库代码。LLM能通过示例学会函数的用法,生成类似的代码。比如:# 示例:用custom_lib.data.load_csv加载数据 import custom_lib.data as data df = data.load_csv("path/to/file.csv", delimiter=";", header=True)
内容的提问来源于stack exchange,提问作者Anuj Mehta

