[AI] 실전 - 음성파일이 보이스피싱인지 판단해보자.

늘 공부하는 괴짜·2025년 5월 19일
0

AI : Langchain (RAG)

목록 보기
21/38

1. 통화 녹음 파일 준비

화자분리가 안되어도 좋으니 mp3, ogg, wav 등의 음원이 필요하다.

1-1. 통화 내용은 대충 이렇다.

출처 : 다락원 한국어
문제가 될 시에는 내리겠다.

삼계탕은 달걀, 인삼, 대추 등 여러 가지 재료를 넣어서
 만들어요. 한국 사람들은 보통 여름에 삼계탕을 먹어요. 그래요? 저도 삼계탕을 한번 먹어보고 싶어요
. 그럼 우리 삼계탕을 먹읍시다. 제인 씨, 오늘 점심에 무엇을 먹을까요? 글쎄요, 민호 씨는 무슨 음식
을 좋아해요? 저는 삼계탕을 좋아해요. 재인 씨는 삼계탕을 먹어봤어요? 아니요. 삼계탕은 어떤 음식이
에요? 삼계탕은 달걀, 인삼, 대추 등 여러 가지 재료를 넣어서 만들어요. 한국 사람들은 보통 여름에  
삼계탕을 먹어요. 그래요? 저도 삼계탕을 한번 먹어보고 싶어요.

2. 보이스피싱 안내 텍스트 준비

보이스피싱 사례

사례 1) 은행, 저축은행 사칭 : 대출 금리 낮춰주겠다며 입금 요구
"ㅇㅇ저축은행입니다. ㅇㅇ대출 상품을 이용하고 계시네요. 지금 상품은 금리가 25%인데, 금리 13% 상품으로 지금 갈아탈 수 있습니다. 다만 대출 처리 비용이 있어, 선입금을 해주셔야 합니다." 혹은 "고금리 대출을 먼저 받아 상환하면, 신용등급이 올라 저금리 대출이 지금보다 쉽게 가능합니다."
은행, 저축은행을 사칭해 더 낮은 금리의 대출 상품을 제안하는 방식이에요. 대출 비용 선입금하라 혹은 고금리의 대출을 먼저 받으라는 식으로 송금을 유도해요.
피해자는 전화를 건 사람이 자신의 대출내역을 훤히 알고 있어서 저축은행임에 의심이 없었다고 해요. 내 정보를 다 알고 있다고 해도, 어떤 방식이든 송금을 유도하는 전화는 모두 보이스피싱이니 주의하세요.

사례 2) 검찰, 경찰, 금융감독원 사칭 : 금융 범죄에 연루되었다며 개인정보 요구
"중앙지방검찰청 김수현 수사관입니다. 92년생 김지원 씨를 아시나요? (모른다고 대답하면) 김지원 씨가 당신의 명의로 대포통장을 만들어 범죄를 저질렀습니다"
경찰, 검찰, 금융감독원을 사칭해, 피해자의 명의로 금융 사기 대포통장이 발견되었다고 속여요. 범죄에 가담할 의지가 없는 것이 밝혀지지 않으면, 유죄가 된다며 피해자를 위협해요. 확인차 신용 조회를 해야한다며 카드 번호, 비밀번호 등 개인정보를 요구해요.
실제로 신용조회를 위해 필요한 정보 중 카드번호와 비밀번호는 포함되지 않아요. 카드번호나 비밀번호로 신용조회에 필요한 금융거래 정보를 얻을 수 없기 때문이죠. 실제 기관에서 신용조회 시, 수집하는 개인식별정보는 성명, 주민등록번호, 국적, 직업, 주소 등이 있어요.

사례 3) 가족་지인 사칭: 송금 유도
"엄마 나 휴대폰이 갑자기 고장 나서 친구 휴대폰으로 연락해. 휴대폰 바꾸게 내 계좌 △△은행 12345678로 3백만 원만 보내줘"
혹은 요즘은 딥페이크 혹은 AI로 목소리를 손쉽게 만들 수 있는데요. 이걸 악용해 "(울고 있는 자녀의 목소리를 들려주며) 당신 자녀가 친구 보증 5천만 원을 섰는데 갚지 않아 납치했습니다. 지금 당장 5천만 원을 송금하세요"
가족, 지인을 사칭하거나 이용해서 송금을 유도하거나 해킹 앱을 깔게 하는 사기 수법이에요. 요즘은 보이스피싱 범죄자가 자녀의 휴대폰 번호를 사용해서 문자를 보낼 수 있다고 해요. 그러니 가족끼리 송금을 요구할 때는 비밀 암호를 지정하는 걸 추천드려요.

사례 4) 은행, 카드사 사칭 : 카드가 도용당했다며 개인정보 요구
"고객님의 신상정보가 도용된 카드가 부정 사용되어 연체 중입니다. 경찰에 수사 의뢰를 해드릴 테니, 전화가 오면 협조해 주시길 바랍니다." 혹은 "△△은행입니다. 고객님이 김수현 씨에게 통장과 도장을 맡겨 돈을 찾아오라고 하셨나요? 확인차 연락드립니다."
은행을 사칭해 피해자의 통장에서 누군가가 출금하려고 한다고 속여요. 카드사 사칭의 경우 피해자의 명의로 카드가 잘못 발급되어 부정 사용된 금액이 연체되었다고 속여요. 확인차 계좌번호, 비밀번호 등 개인 정보를 요구해요. 혹은 경찰에 신고를 해주겠다며 경찰에서 곧 전화가 갈 거니, 전화를 받으라고 해요. 해당 전화를 받는 순간 보이스피싱이 시작되는 거예요.

사례 5) 우체국, 택배회사 사칭 : 우편물이 계속 반송된다며 개인정보 요구
해당 사례는 주로 ARS로 이루어지는데요. "수취인 부재로 우편물이 반송 예정입니다. 확인하시려면 0번을 눌러주세요." 혹은 "○○택배입니다. 택배가 반송되었으니 자세한 내용을 알고 싶으시면 0번을 눌러 확인해 주세요."
우체국, 택배회사를 사칭해서 우편물이 반송되었다고 확인 전화를 유도해요. 전화할 시, 우편물 조회를 목적으로 과도한 개인정보 입력을 요구해요.

사례 6) 국세청 사칭 : 세무조사 신고 메일로 악성 사이트 접속 유도
메일이 하나 옵니다. 보낸 사람은 국세청 세무국이네요. 국세청 세무조사 신고 내용을 확인하라는 본문이에요. 메일 하단에 [신고 내용 확인하기] 버튼이 있어요.
국세청을 사칭해 해킹 사이트의 클릭을 유도하는 방식이에요. 이때 [신고 내용 확인하기] 버튼을 클릭하지 마세요. 포털사이트처럼 보이지만 그럴듯하게 위장한 불법 사이트로 연결되기 때문이에요. 아이디와 비밀번호 입력을 유도하여 메일 이용자의 계정 정보를 탈취해요.

3. 보이스피싱 안내 파일 벡터화

faiss_index_voice_phishing 폴더에 저장된다.

from langchain_text_splitters import RecursiveCharacterTextSplitter
from modules.llm.embedding_huggingface import getEmbeddingHuggingface  
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores.faiss import FAISS
import os

# TXT 파일 로드
loader = TextLoader("./voice_phishing.txt", encoding="utf-8")
documents = loader.load()

# 문서 분할
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=50,
    length_function=len
)
split_docs = text_splitter.split_documents(documents)

# 임베딩 모델 불러오기
embedding_model = getEmbeddingHuggingface()

# FAISS 벡터 저장소에 문서 저장
try:
    vectorstore = FAISS.from_documents(
        documents=split_docs,
        embedding=embedding_model
    )

    # 인덱스를 로컬에 저장 (예: ./faiss_index_voice_phishing)
    vectorstore.save_local("faiss_index_voice_phishing")

    print("Documents processed and FAISS index saved successfully")
except Exception as e:
    print(f"Error processing documents: {e}")

4. 실행파일

import os
import torch
from langchain.chains import RetrievalQA
from langchain_community.vectorstores.faiss import FAISS
from langchain_community.llms import Ollama
from langchain.prompts import PromptTemplate
from langchain_huggingface import HuggingFaceEmbeddings
from transformers import pipeline


# 1. 음성 파일 텍스트 변환
device = 0 if torch.cuda.is_available() else -1
stt_pipe = pipeline(
    model="openai/whisper-medium", 
    task="automatic-speech-recognition", 
    return_timestamps=True,
    device=device
)
stt_result = stt_pipe("./conv1.mp3", generate_kwargs={"language": "ko"})

# 2. 허깅페이스 임베딩 로드
embedding_model_name = "sentence-transformers/paraphrase-xlm-r-multilingual-v1"

# 허깅페이스 토큰 설정
huggingface_token = os.getenv("HUGGINGFACE_API_KEY")

# 3. 허깅페이스 임베딩 모델 초기화
embeddings = HuggingFaceEmbeddings(
    model_name=embedding_model_name,
    model_kwargs={"device": "cpu"},
    encode_kwargs={"normalize_embeddings": True}
)

# 4. FAISS 인덱스를 저장한 경로
faiss_index_path = "faiss_index_voice_phishing"

vectorstore = FAISS.load_local(
    folder_path=faiss_index_path,
    embeddings=embeddings,
    allow_dangerous_deserialization=True
)

# 5. Retriever 설정
retriever = vectorstore.as_retriever()

# 6. LLM 설정
llm = Ollama(model="llama3:8b")

# 7. 커스텀 프롬프트 정의
custom_prompt = PromptTemplate(
    input_variables=["context", "question"],
    template="""
        당신은 매우 정밀한 보이스 피싱 감지 시스템입니다. 다음의 보이스피싱 사례를 참고하여 통화 내용이 보이스피싱인지 아닌지 판단하세요. 
        ** 매우 중요: 제공되는 사례 내용을 함께 예시로 보여주세요.**
        ** 매우 중요: 제공되는 보이스피싱 사례 외의 내용은 보이스피싱이 아니라고 판단하세요.**
        ** 매우 중요: 제공되는 보이스피싱 사례 외의 판단은 하지 마세요.**

        *한국어* 로 답변하세요.
        
        보이스피싱 사례:
        {context}

        통화 내용:
        {question}

        정확하고 간결한 답변:
    """.strip()
    )


# 8. 체인 구성
chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    chain_type_kwargs={"prompt": custom_prompt}
)
# 9. 체인 실행
result = chain({"query": stt_result["text"]})
print(result["result"])

5. 결과

profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글