LangChain PythonREPL + 大模型:让 AI 直接生成并执行 Python 代码
在大模型的实际应用中,我们经常遇到一个痛点:大模型擅长理解和推理,但在精准计算、逻辑运算上容易出错。
而 LangChain 实验性工具库中的 PythonREPL ,完美解决了这个问题。它能让大模型直接生成 Python 代码,并且自动运行代码、输出精准结果,实现真正的「AI 自主计算」。
今天这篇文章,就带大家彻底搞懂:PythonREPL + 大模型 如何实现「自然语言提问 → 生成 Python 代码 → 自动执行代码 → 返回精准答案」的全流程能力。
一、核心主角:LangChain PythonREPL 到底是什么?
PythonREPL 是 LangChain 生态中极具实用价值的工具,专门用于动态执行 Python 代码。
它的核心能力:
- 接收字符串格式的 Python 代码
- 在独立环境中直接运行代码
- 自动返回执行结果
- 无缝对接大模型输出,零格式转换成本
简单说:它就是大模型的「代码执行器」,让大模型不再只输出文字,而是能真正运行代码、完成计算任务。
二、最强组合:PythonREPL + 大模型的核心能力
这两者结合后,会产生远超单一模型的强大能力:
1. 大模型负责「理解 + 生成代码」
- 理解自然语言问题(数学题、逻辑题、计算题等)
- 根据问题自动生成可运行的 Python 代码
- 严格遵循指令,只输出纯代码,不携带多余内容
2. PythonREPL 负责「执行代码 + 返回结果」
- 接收模型生成的代码
- 全自动执行,无需人工复制、运行
- 返回最精准、最可靠的计算结果
- 全程无人工干预,真正自动化
这就是这套方案的核心价值:大模型负责「动脑生成代码」,PythonREPL 负责「动手运行代码」,强强联合,实现 100% 精准计算。
三、完整实现流程:清晰易懂,全程自动化
整个实现逻辑非常简洁,一共四步:
1. 对接大模型
配置兼容 OpenAI 接口的大模型,设定参数,保证代码生成稳定、准确。
2. 提示词约束
通过提示模板,强制模型只返回纯 Python 代码,不返回解释、文字、格式符号。
3. 代码清洗
自动清理模型可能附带的标签、代码块标记,保证代码纯净可执行。
4. PythonREPL 自动执行
将清洗后的代码直接传入 PythonREPL,一键执行,立即输出结果。
全程不需要人工写代码、不需要手动运行,真正实现AI 全自动计算。
四、这套方案的核心优势(为什么一定要用?)
- 计算绝对精准彻底解决大模型口算错误问题,代码执行结果 100% 可靠。
- 全流程自动化从提问到答案,中间生成代码、执行代码全部自动完成。
- 零门槛集成基于 LangChain 生态,依赖少、接入快,几行核心逻辑即可实现。
- 场景无限扩展可用于数学计算、公式推导、数据处理、逻辑判断、简单脚本生成等。
- 模型能力翻倍让普通大模型瞬间拥有「代码生成 + 代码执行」双重能力,实用性大幅提升。
五、实际效果演示(直观感受强大能力)
以数学应用题为例:3 箱苹果重 45 千克。一箱梨比一箱苹果多 5 千克,6 箱梨重多少千克?
这套系统会自动完成:
- 大模型读懂题目 → 生成对应的 Python 计算代码
- 自动清洗代码格式
- PythonREPL 自动执行代码
- 直接输出最终答案
你只需要输入问题,剩下全部交给 AI + PythonREPL 自动完成。
六、总结
LangChain PythonREPL 与大模型的结合,是大模型从「文字回答」走向「实际执行」的关键能力。
- 大模型提供「理解与代码生成」
- PythonREPL 提供「代码执行与精准计算」
两者结合,让 AI 不再是只会说话的助手,而是能写代码、能运行代码、能给出精准结果的智能工具。
这种能力不仅适用于数学计算,还能扩展到数据处理、自动化脚本、逻辑验证等大量实际场景,是大模型工程化、实用化的必备技巧!
代码实现:
#pip install langchain-experimental
#pip install langchain-core==0.1.52 langchain-experimental==0.0.54
from langchain_experimental.utilities import PythonREPL
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
import re
#测试执行python代码
python_repl = PythonREPL()
result = python_repl.run("print(1+3)")
print(f"执行结果:{result}")
# 1. 初始化 LLM(保持不变)
DEEPSEEK_API_KEY = "123" # 替换为实际的 API Key
llm = ChatOpenAI(
api_key=DEEPSEEK_API_KEY,
base_url="http://qwen3-32b-awq.model.xjipc.com/openai/v1", # Deepseek 的 API 基础地址
model="qwen3-32b-awq", # Deepseek 对话模型(可选:deepseek-chat-pro 等高级模型)
temperature=0.7, # 温度参数(0-1,越低越稳定)
max_tokens=1024 # 最大生成 tokens
)
promptFormat = """{query}
请根据上面的问题,生成Python代码计算出问题的答案,最后计算出来的结果用print()打印出来,请直接返回Python代码,不要返回其他任何内容的字符串
"""
prompt = ChatPromptTemplate.from_template(promptFormat)
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
result = chain.invoke({"query":"3箱苹果重45千克。一箱梨比一箱苹果多5千克,6箱梨重多少千克?"})
print('-----返回python代码-----')
print(result)
def remove_think_tags(text):
"""
移除字符串中<think></think>标签及其内容
Args:
text: 包含think标签的字符串
Returns:
移除think标签及其内容后的字符串
"""
# 支持多行内容和标签可能有的属性
pattern = r'<think[^>]*>.*?</think>'
result = re.sub(pattern, '', text, flags=re.DOTALL)
# 清理空白字符
result = result.strip()
result = re.sub(r'\n{3,}', '\n\n', result) # 限制连续换行
return result
#去掉<think>标签之间的内容
result = remove_think_tags(result)
#去掉返回值中不需要的部分
def parsePython(codeStr):
codeStr = codeStr.replace("```","")
codeStr = codeStr.replace("python", "")
return codeStr
result = parsePython(result)
print('**************')
print(result)
print('**************')
print('-----返回python执行结果-----')
print(python_repl.run(result))
结果输出:
执行结果:4
-----返回python代码-----
<think>
好的,我现在得解决这个问题。题目是说,3箱苹果重45千克。一箱梨比一箱苹果多5千克,问6箱梨重多少千克?
首先,我应该先理清楚已知条件和要求。首先,苹果的部分:3箱苹果总重45千克,那每箱苹果的重量应该是45除以3,也就是15千克。对吧?所以每箱苹果是15kg。
然后,题目说一箱梨比一箱苹果多5千克。那梨每箱的重量就是苹果每箱的重量加上5。也就是15+5=20千克每箱梨。对吧?
接下来,问题是要算6箱梨的总重量。那应该就是每箱梨的重量乘以6。也就是20*6=120千克。所以答案应该是120千克。
那现在我要怎么用Python代码来实现这个过程呢?首先,我需要计算每箱苹果的重量。已知3箱苹果总重45kg,所以apple_per_box = 45 / 3。得到15。然后,梨每箱就是15+5=20。然后乘以6得到总重量。
所以代码步骤大概是这样的:
-
计算每箱苹果的重量:apples_total = 45,boxes_apples =3 → per_apple = apples_total / boxes_apples
-
梨每箱重量是per_apple +5
-
梨的箱数是6,总重量就是(per_apple +5)*6
-
输出结果
那Python代码应该怎样写呢?比如:
apples_total = 45
apple_boxes = 3
per_apple = apples_total / apple_boxes
pear_per_box = per_apple +5
pear_boxes =6
total_pears = pear_per_box * pear_boxes
print(total_pears)
这样应该就能得到正确的结果了。然后运行的话应该输出120.0?或者是否需要处理成整数?不过题目中的数值都是整数,可能希望得到整数结果。不过45除以3是整数,所以没问题。但如果是其他情况可能有小数,这里应该没问题。所以直接打印即可。
那这段代码应该就能解决问题了。检查一下步骤是否正确。是的。所以生成的代码应该就是这样的。
</think>
```python
apples_total = 45
apple_boxes = 3
per_apple = apples_total / apple_boxes
pear_per_box = per_apple + 5
pear_boxes = 6
total_pears = pear_per_box * pear_boxes
print(total_pears)
```
**************
apples_total = 45
apple_boxes = 3
per_apple = apples_total / apple_boxes
pear_per_box = per_apple + 5
pear_boxes = 6
total_pears = pear_per_box * pear_boxes
print(total_pears)
**************
-----返回python执行结果-----
120.0
更多学习资料尽在 老虎网盘资源