Применение ИИ при написании кода на Python для анализа данных
Применение искусственного интеллекта для автоматизации написания кода на Python в научных вычислениях
Современные ИИ-модели способны генерировать, оптимизировать и отлаживать код Python, что существенно ускоряет исследовательские и аналитические задачи. В этой части рассмотрены основные подходы: от использования готовых API до локальных моделей и агентных систем.
Как получить рабочий фрагмент кода для численного интегрирования с помощью OpenAI API?
Наиболее прямой способ - отправка запроса к большой языковой модели через её API. Пример ниже демонстрирует запрос к GPT-4 на генерацию функции, вычисляющей определённый интеграл методом Симпсона.
import openai
openai.api_key = "ваш_ключ"
prompt = (
"Напиши на Python функцию, которая вычисляет определённый интеграл "
"функции f(x)=x**2 + 3*x на отрезке [0, 4] методом Симпсона с шагом 0.01. "
"Функция должна принимать параметры: f, a, b, n (чётное число разбиений). "
"Верни значение интеграла и количество вызовов f."
)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.2
)
code = response['choices'][0]['message']['content']
print(code)Python для инженерных задач (python для инженерных задач)
def simpson(f, a, b, n):
if n % 2 != 0:
raise ValueError("n должно быть чётным")
h = (b - a) / n
s = f(a) + f(b)
for i in range(1, n, 2):
s += 4 * f(a + i * h)
for i in range(2, n-1, 2):
s += 2 * f(a + i * h)
calls = n + 1
return (h / 3) * s, calls
# Пример использования
f = lambda x: x**2 + 3*x
result, calls = simpson(f, 0, 4, 400)
print(f"Значение интеграла: {result}, вызовов функции: {calls}")задачи для анализа данных python (задачи анализа данных на python)
После получения кода его необходимо проверить на синтаксические ошибки и корректность результата. Проблемы возникают, когда модель генерирует несуществующие библиотеки или использует устаревшие API. Рекомендуется всегда запускать код в изолированной среде.
Типичные ошибки и их устранение:
- Ошибка импорта - модель может предложить библиотеку, которой нет (например,
scipy.integrate.simpsonвместоscipy.integrate.simpson). Проверяйте документацию или попросите модель исправить. - Несоответствие параметров - если запрос не конкретен, функция может быть слишком общей. Лучше уточнять типы данных и ожидания.
- Проблема с точностью - метод Симпсона требует чётного числа разбиений, модель может забыть проверку или явно не указать это. Добавьте в промпт требование проверки.
Как использовать локальную модель (CodeLlama) для генерации кода без доступа к интернету?
Для работы в офлайн-среде подойдут модели из семейства CodeLlama, запускаемые через библиотеку transformers. Такой подход обеспечивает конфиденциальность данных и отсутствие лимитов.
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_name = "codellama/CodeLlama-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
prompt = """# Напиши функцию на Python, которая сглаживает временной ряд методом скользящего среднего.
# Аргументы: series (list of float), window_size (int).
# Верни новый список той же длины (заполни края средними значениями).
"""
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=300, temperature=0.1)
code = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(code)
задачи линейного программирования python (задачи линейного программирования на python)
def moving_average(series, window_size):
result = []
for i in range(len(series)):
start = max(0, i - window_size // 2)
end = min(len(series), i + window_size // 2 + 1)
window = series[start:end]
result.append(sum(window) / len(window))
return resultPandas python задачи (задачи с библиотекой pandas)
Цель такого варианта - полностью автономная работа на персональном компьютере без отправки данных внешним сервисам. Подходит для конфиденциальных научных проектов.
Возможные проблемы:
- Требования к ресурсам - для модели 7B необходимо минимум 16 ГБ оперативной памяти и видеокарта с CUDA. Без GPU генерация будет медленной. Можно использовать квантизированные версии (например, через
bitsandbytes). - Качество кода - локальные модели часто уступают GPT-4 по сложным задачам. Для повышения точности используйте более крупные версии (13B, 34B) или дообучение на своём наборе научных скриптов.
Как автоматизировать многошаговый процесс анализа данных с помощью LangChain?
Библиотека LangChain позволяет создавать цепочки вызовов ИИ, где один запрос зависит от результата предыдущего. Например, можно спроектировать агента, который сначала генерирует код для загрузки данных, затем для очистки, потом для визуализации.
from langchain.agents import create_python_agent
from langchain.agents.agent_toolkits import PythonREPLTool
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
agent = create_python_agent(
llm=llm,
tool=PythonREPLTool(),
verbose=True
)
prompt = """
У меня есть CSV-файл 'data.csv' с колонками: x, y, z. Напиши код на Python, который:
1. Загрузит данные с помощью pandas.
2. Удалит строки с NaN.
3. Построит 3D-поверхность (plot_surface) с использованием matplotlib.
4. Сохранит график в файл 'surface.png'.
"""
agent.run(prompt)Результатом будет выполнение кода и создание файла прямо в сессии агента. Это удобно для прототипирования, но требует контроля над исполнением - агент может запускать потенциально опасные операции.
Ограничения подхода:
- Безопасность - выполнение произвольного кода на локальной машине несёт риски. Используйте изолированные контейнеры.
- Зависимость от промпта - нечёткое описание задачи приводит к неверным действиям. Рекомендуется разбивать задачу на шаги.
- Лимиты токенов - длинные цепочки могут превысить контекст модели. Используйте чанкинг и память.
Расширенные примеры интеграции ИИ в научные вычисления на Python
Как реализовать автоматическое создание отчёта с численными расчётами и объяснениями?
Ниже приведён пример, где ИИ сначала генерирует код для расчёта корреляции Пирсона, затем запускает его и на основе результата формирует текстовый отчёт. Используется библиотека inspect для извлечения кода из ответа и exec для выполнения.
import openai
import numpy as np
from io import StringIO
import sys
openai.api_key = "ваш_ключ"
# Генерация кода
prompt_code = (
"Напиши функцию correlation_pearson(x, y), которая принимает два списка чисел "
"и возвращает коэффициент корреляции Пирсона, p-value и строку с интерпретацией. "
"Используй scipy.stats.pearsonr."
)
response = openai.ChatCompletion.create(model="gpt-4", messages=[{"role":"user","content":prompt_code}], temperature=0)
code_block = response['choices'][0]['message']['content']
# Извлечение кода из ответа (упрощённый парсинг)
code_lines = [line for line in code_block.split('\n') if not line.startswith('')]
code_clean = '\n'.join(code_lines)
# Выполнение и захват вывода
old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
try:
exec(code_clean)
except Exception as e:
error_msg = str(e)
finally:
sys.stdout = old_stdout
output = mystdout.getvalue()
# Генерация отчёта
prompt_report = (
f"Вот результат выполнения кода: {output}. Ошибки: {error_msg if 'error_msg' in dir() else 'нет'}. "
"Напиши краткий отчёт на русском языке, содержащий описание корреляции, интерпретацию p-value и рекомендации."
)
response2 = openai.ChatCompletion.create(model="gpt-4", messages=[{"role":"user","content":prompt_report}], temperature=0.3)
report = response2['choices'][0]['message']['content']
print(report)Отчёт: Коэффициент корреляции Пирсона составил 0.95, p-value < 0.001. Это указывает на сильную положительную линейную связь. Рекомендуется построить scatter plot и рассмотреть регрессионную модель.
Обратите внимание: для production нужно использовать безопасное выполнение (Docker или subprocess), так как exec открывает уязвимости.
Как использовать RAG (Retrieval-Augmented Generation) для поиска актуальных функций numpy?
Научные библиотеки обновляются, а ИИ может не знать новые версии. С помощью RAG можно извлекать документацию из локального корпуса и добавлять её в промпт. Ниже пример с использованием LangChain и FAISS.
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
# Предположим, у нас есть тексты документации numpy (chapter1.txt и т.д.)
# Загружаем и индексируем
from pathlib import Path
docs_path = Path("docs_numpy")
all_texts = []
for file in docs_path.glob("*.txt"):
with open(file, "r") as f:
all_texts.append(f.read())
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(all_texts, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
qa = RetrievalQA.from_chain_type(
llm=OpenAI(temperature=0),
chain_type="stuff",
retriever=retriever,
verbose=True
)
question = "Как с помощью numpy вычислить ковариационную матрицу для многомерного массива? Укажи новейший синтаксис."
answer = qa.run(question)
print(answer)Для вычисления ковариационной матрицы используйте `numpy.cov(m, rowvar=True)`. Если массив имеет форму (n_samples, n_features), установите `rowvar=False`. Начиная с версии 1.22, можно указать `dtype=np.float32` для экономии памяти.
Этот подход гарантирует, что модель опирается на актуальную документацию, а не на свои устаревшие данные.
Потенциальные трудности:
- Создание корпуса - требуется периодически обновлять файлы документации. Можно настроить автоматическое скачивание с сайта библиотеки.
- Пересечение контекста - если извлечено много фрагментов, модель может запутаться. Уменьшайте k и используйте реранжировку.