1.Cluade 3.5에 대해 알아보기
https://www.anthropic.com/news/claude-3-5-sonnet
일일 chatGPT 4o 를 잘 사용하던 개발자로서 클로드3.5 가 나왔다실래 사용해보았다
우선 엔트로픽 소개에 따르면 엄청나다고 소개하고 있다
본인들이 초기 만들었던 3가지 모델중 제일 우수한 클로드 3 오퍼스보다 높은 성능을 이야기한다
성능 측면에서도 아래와 같이 표시하고 있다
위 링크 블로그에서도 확인할 수 있다
2.정말 대단한가?
그래서 직접 물어보았다
부끄럼을 타는지 형식적인 답변만 한다
2. 코드 리뷰 및 수정 요청해보기
그럼 바로 코딩에 활용해본다
약 100 줄로 작성된 난독화(읽기 어렵게 처리된 텍스트 파일)된 파일들을 구분하는 코드이다
import os
from groq import Groq
import openai
import re
import shutil
from dotenv import load_dotenv
load_dotenv()
# OpenAI API 키와 모델 설정
openai.api_key = os.getenv("OPENAI_API_KEY")
openai_model = os.getenv("OPENAI_API_MODEL")
Groq.api_key = os.getenv("GROQ_API_KEY")
groq_model = os.getenv("GROQ_API_MODEL")
def get_all_files(directory):
files_list = []
for root, dirs, files in os.walk(directory):
for file in files:
files_list.append(os.path.join(root, file))
return files_list
def check_obfuscation(content_chunk, to="groq"):
prompt = f"Is the following code obfuscated? Please answer with 'Yes' or 'No'.\n\n{content_chunk}"
# openai
response_text = ""
if to == "openai":
response = openai.ChatCompletion.create(
model=openai_model,
messages=[{"role": "user", "content": prompt}],
# temperature=0 # 일관된 응답을 위한 설정
)
response_text = response.choices[0].message['content'].strip()
elif to == "groq":
# https://groq.com
response = Groq().chat.completions.create(
model=groq_model,
messages=[{"role": "user", "content": prompt}],
)
response_text = response.choices[0].message.content.strip()
return normalize_response(response_text)
def normalize_response(response):
response_lower = response.lower()
if "yes" in response_lower:
return "Yes"
elif "no" in response_lower:
return "No"
else:
return "Uncertain"
def read_file_and_remove_comments(file_path):
try:
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
content_no_comments = remove_comments(content)
return content_no_comments
except Exception as e:
print(f"Error reading {file_path}: {e}")
return None
def remove_comments(content):
# 모든 주석 제거 (Python, JavaScript, Java, JSP, PHP, Ruby, Go, ASP, HTML, XML 등)
content = re.sub(r'#.*', '', content) # Python, Ruby 라인 주석
content = re.sub(r'//.*', '', content) # C, C++, Java, JavaScript, PHP, Go 라인 주석
content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL) # C, C++, Java, JavaScript, PHP, Go 블록 주석
content = re.sub(r'=begin.*?=end', '', content, flags=re.DOTALL) # Ruby 블록 주석
content = re.sub(r"'[^\n]*", '', content) # ASP 라인 주석
content = re.sub(r'<!--.*?-->', '', content, flags=re.DOTALL) # HTML, XML 주석
return content
def analyze_file_in_chunks(file_content, chunk_size=1000):
chunks = [file_content[i:i + chunk_size] for i in range(0, len(file_content), chunk_size)]
obfuscation_results = [check_obfuscation(chunk) for chunk in chunks]
return obfuscation_results
def main(input_directory, output_directory):
files_list = get_all_files(input_directory)
if not os.path.exists(output_directory):
os.makedirs(output_directory)
obfuscation_results = {}
for file in files_list:
content_no_comments = read_file_and_remove_comments(file)
if content_no_comments:
if len(content_no_comments) < 1000:
print(f"File {file} is smaller than 1000 bytes after removing comments. Skipping.")
# continue
obfuscation_checks = analyze_file_in_chunks(content_no_comments, len(content_no_comments))
else:
obfuscation_checks = analyze_file_in_chunks(content_no_comments, 1000)
# Majority voting or any aggregation logic
if obfuscation_checks.count("Yes") > obfuscation_checks.count("No"):
final_result = "Yes"
else:
final_result = "No"
print(f"chunk : {len(content_no_comments)}") # 추가된 출력문
obfuscation_results[file] = final_result
# 파일 분류 및 복사
if not os.path.exists(output_directory):
os.makedirs(output_directory)
if final_result == "Yes":
result_subdir = os.path.join(output_directory, "obfuscated")
elif final_result == "No":
result_subdir = os.path.join(output_directory, "not_obfuscated")
else:
result_subdir = os.path.join(output_directory, "uncertain")
if not os.path.exists(result_subdir):
os.makedirs(result_subdir)
shutil.copy(file, result_subdir)
return obfuscation_results
# Example usage
input_directory = 'check'
output_directory = 'result'
results = main(input_directory, output_directory)
# Display the results
for file, obfuscation_check in results.items():
print(f"File: {file}")
print(f" Obfuscation Check: {obfuscation_check}")
chatGPT4o 의 경우 파일이 아닌 입력하는 부분에서 파일 형도로 업로드 된다
좀 변경된 사항으로 좌, 우 이렇게 화면 분할이 되어 코드가 생성된다
3. 코드 결과(1차)
와우~~~~ 거의 새로 작성한 정도다.......아이디어는 좋은데(비동기 추가됨)
코드는 정상적으로 수행되나 내가 의도한 결과는 아니었다.......
원래 정상적인 실행하는 코드를 비정상적인 코드로 만들다니,,,,,,
너무너무 실망적이었다
물론 실수할 수 있지,...그래서 너프하게 "정상적으로 동작하지 않아" 만이야기 해보았다
chatgpt4o 보다는 친절하게 이야기 해주는 것 같다(아닌가?) ㅋㅋㅋ
프롬프트를 다시 작성해서 피드백을 러프하게 한번 더 주었다
4. 코드 결과(2차)
신규 코드 결과는 아래와 같다
import os
from groq import Groq
import openai
import re
import shutil
from dotenv import load_dotenv
load_dotenv()
# OpenAI API 키와 모델 설정
openai.api_key = os.getenv("OPENAI_API_KEY")
openai_model = os.getenv("OPENAI_API_MODEL")
Groq.api_key = os.getenv("GROQ_API_KEY")
groq_model = os.getenv("GROQ_API_MODEL")
def get_all_files(directory):
files_list = []
for root, dirs, files in os.walk(directory):
for file in files:
files_list.append(os.path.join(root, file))
return files_list
def check_obfuscation(content_chunk, to="groq"):
prompt = f"Is the following code obfuscated? Please answer with 'Yes' or 'No'.\n\n{content_chunk}"
try:
if to == "openai":
response = openai.ChatCompletion.create(
model=openai_model,
messages=[{"role": "user", "content": prompt}]
)
response_text = response.choices[0].message['content'].strip()
elif to == "groq":
response = Groq().chat.completions.create(
model=groq_model,
messages=[{"role": "user", "content": prompt}]
)
response_text = response.choices[0].message.content.strip()
else:
raise ValueError(f"Unsupported API: {to}")
return normalize_response(response_text)
except Exception as e:
print(f"Error in API call: {e}")
return "Uncertain"
def normalize_response(response):
response_lower = response.lower()
if "yes" in response_lower:
return "Yes"
elif "no" in response_lower:
return "No"
else:
return "Uncertain"
def read_file_and_remove_comments(file_path):
try:
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
content_no_comments = remove_comments(content)
return content_no_comments
except Exception as e:
print(f"Error reading {file_path}: {e}")
return None
def remove_comments(content):
# 모든 주석 제거 (Python, JavaScript, Java, JSP, PHP, Ruby, Go, ASP, HTML, XML 등)
content = re.sub(r'#.*', '', content) # Python, Ruby 라인 주석
content = re.sub(r'//.*', '', content) # C, C++, Java, JavaScript, PHP, Go 라인 주석
content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL) # C, C++, Java, JavaScript, PHP, Go 블록 주석
content = re.sub(r'=begin.*?=end', '', content, flags=re.DOTALL) # Ruby 블록 주석
content = re.sub(r"'[^\n]*", '', content) # ASP 라인 주석
content = re.sub(r'<!--.*?-->', '', content, flags=re.DOTALL) # HTML, XML 주석
return content
def analyze_file_in_chunks(file_content, chunk_size=1000):
chunks = [file_content[i:i + chunk_size] for i in range(0, len(file_content), chunk_size)]
obfuscation_results = [check_obfuscation(chunk) for chunk in chunks]
return obfuscation_results
def main(input_directory, output_directory):
files_list = get_all_files(input_directory)
if not os.path.exists(output_directory):
os.makedirs(output_directory)
obfuscation_results = {}
for file in files_list:
content_no_comments = read_file_and_remove_comments(file)
if content_no_comments:
if len(content_no_comments) < 1000:
print(f"File {file} is smaller than 1000 bytes after removing comments.")
obfuscation_checks = analyze_file_in_chunks(content_no_comments, len(content_no_comments))
else:
obfuscation_checks = analyze_file_in_chunks(content_no_comments)
final_result = "Yes" if obfuscation_checks.count("Yes") > obfuscation_checks.count("No") else "No"
print(f"File: {file}, Chunk size: {len(content_no_comments)}, Result: {final_result}")
obfuscation_results[file] = final_result
result_subdir = os.path.join(output_directory, "obfuscated" if final_result == "Yes" else "not_obfuscated")
os.makedirs(result_subdir, exist_ok=True)
shutil.copy(file, result_subdir)
return obfuscation_results
# Example usage
input_directory = 'check'
output_directory = 'result'
results = main(input_directory, output_directory)
# Display the results
for file, obfuscation_check in results.items():
print(f"File: {file}")
print(f" Obfuscation Check: {obfuscation_check}")
결과는 나름 만족!!!
정상적으로 코드 수행은 물론이며 코드 라인도 감소하였다
원하는 코드 리뷰와 수정까지 정상적으로 가능했다
명령 프롬프트를 러프하게 했는데 정상적으로 반영한다는 점에서 앞으로
대충대충 빠르게 해야 하는 귀찮은 작업을 많이 시켜야겠다
확실히 이전보다는 더 잘 작성하는게 체감은 된다
그럼 chatgpt 구독을 끊고 cluade 구독하러 고고~~ 해야되서 그럼 저는 이만
동일한 위 코드 내용으로 ChatGPT4o 코드 리뷰 결과 보기
https://coffee926.tistory.com/77
'AI' 카테고리의 다른 글
Groq api key 발급하기 (0) | 2024.07.27 |
---|---|
claude 야 대시보드 만들어줘(프로젝트 기능 사용기) (0) | 2024.07.05 |
AI(ChatGPT) 로 코드 리뷰 받기(good? or bad ?) (0) | 2024.06.22 |
ChatGPT vs Claude 3 Sonnet (0) | 2024.03.30 |
wit.ai 로 한국어 인식해보기 (1) | 2024.03.28 |