AI开发-python-langchain框架(3-12-AI 直接生成并执行 Python 代码 )
LangChain PythonREPL + 大模型:让 AI 直接生成并执行 Python 代码
一、核心主角:LangChain PythonREPL 到底是什么?
PythonREPL 是 LangChain 生态中极具实用价值的工具,专门用于动态执行 Python 代码。- 接收字符串格式的 Python 代码
- 在独立环境中直接运行代码
- 自动返回执行结果
- 无缝对接大模型输出,零格式转换成本
二、最强组合:PythonREPL + 大模型的核心能力
1. 大模型负责「理解 + 生成代码」
- 理解自然语言问题(数学题、逻辑题、计算题等)
- 根据问题自动生成可运行的 Python 代码
- 严格遵循指令,只输出纯代码,不携带多余内容
2. PythonREPL 负责「执行代码 + 返回结果」
- 接收模型生成的代码
- 全自动执行,无需人工复制、运行
- 返回最精准、最可靠的计算结果
- 全程无人工干预,真正自动化
三、完整实现流程:清晰易懂,全程自动化
1. 对接大模型
2. 提示词约束
3. 代码清洗
4. PythonREPL 自动执行
四、这套方案的核心优势(为什么一定要用?)
-
计算绝对精准彻底解决大模型口算错误问题,代码执行结果 100% 可靠。
-
全流程自动化从提问到答案,中间生成代码、执行代码全部自动完成。
-
零门槛集成基于 LangChain 生态,依赖少、接入快,几行核心逻辑即可实现。
-
场景无限扩展可用于数学计算、公式推导、数据处理、逻辑判断、简单脚本生成等。
-
模型能力翻倍让普通大模型瞬间拥有「代码生成 + 代码执行」双重能力,实用性大幅提升。
五、实际效果演示(直观感受强大能力)
- 大模型读懂题目 → 生成对应的 Python 计算代码
- 自动清洗代码格式
- PythonREPL 自动执行代码
- 直接输出最终答案
六、总结
- 大模型提供「理解与代码生成」
- PythonREPL 提供「代码执行与精准计算」
#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得到总重量。
所以代码步骤大概是这样的:
1. 计算每箱苹果的重量:apples_total = 45,boxes_apples =3 → per_apple = apples_total / boxes_apples
2. 梨每箱重量是per_apple +5
3. 梨的箱数是6,总重量就是(per_apple +5)*6
4. 输出结果
那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
浙公网安备 33010602011771号