Optimizing Qwen2.5-Coder for Local Python Automation Using Ollama and LangChain
The biggest "gotcha" with local LLMs is the prompt drift—Qwen is powerful, but if you don't constrain its output, it tends to be too chatty, which breaks your Python exec() or eval() calls. I've found that using a strict System Prompt and a structured output parser is the only way to make local automation reliable.
Here is the setup I'm using to build a local "Code Agent" that can take a natural language request and turn it into a runnable script.
First, pull the model and set up the LangChain connection:
from langchain_community.llms import Ollama
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# I use the 7b version; it's fast enough for real-time automation
llm = Ollama(model="qwen2.5-coder:7b", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "You are a Python automation expert. Return ONLY valid Python code. No markdown blocks, no explanations, no 'Here is your code'. Just the raw code."),
("user", "{input}")
])
chain = prompt | llm | StrOutputParser()To actually get this to work for automation, you can't just print the output. You need a safety wrapper. I've implemented a basic execution loop that handles the output from Qwen. One tip: always tell the model to include necessary imports in the generated snippet, otherwise, your exec() will fail on a NameError.
def execute_local_automation(user_request):
# Generate code from Qwen2.5-Coder
code = chain.invoke({"input": user_request})
# Basic cleanup in case the model ignores the 'no markdown' rule
clean_code = code.replace("python", "").replace("", "").strip()
try:
# Use a dedicated dictionary for local variables to avoid polluting global scope
local_vars = {}
exec(clean_code, {}, local_vars)
return "Success", local_vars
except Exception as e:
return f"Error: {str(e)}", None
# Example: Automating a file cleanup task
status, result = execute_local_automation("List all .log files in the current directory and delete them.")
print(f"Status: {status}")Config and Performance Tips:
Ollama Memory Management: If you're running this alongside an IDE like Cursor, your VRAM will choke. Set OLLAMA_NUM_GPU or adjust the num_ctx in your Modelfile to 4096. Qwen2.5-Coder doesn't need a massive context window for short automation scripts, and lowering it saves a ton of memory.
Temperature Zero: For automation, temperature=0 is non-negotiable. Any randomness in code generation usually results in a syntax error or a hallucinated library method.
The "Loop" Strategy: When the code fails, don't manually fix it. Pass the error message back into the prompt: "The previous code failed with error {e}. Fix it and return the full corrected code." This self-healing loop increases my success rate from about 70% to 95%.
This setup turns Qwen2.5-Coder into a local engine that handles the "grunt work" of Python scripting without sending my internal file structures to a cloud server. It's significantly faster than waiting for a web UI to stream a response when you just need a 10-line script to parse a CSV.
All Replies (0)
No replies yet — be the first!
