아래는 LangChain을 사용하여 소설 데이터를 학습시키고, 유사한 스타일로 소설을 작성하는 고퀄리티 코드 예시입니다. 이 코드는 가상 환경(venv)을 사용하고, API 키는 .env
파일에서 가져오며, 모델 I/O, 데이터, 체인, 메모리, 에이전트를 모두 포함합니다.
LangChain은 대형 언어 모델(LLM)을 체인 형태로 연결하여 복잡한 작업을 수행할 수 있게 해주는 강력한 도구입니다. 이를 통해 소설 데이터를 기반으로 새로운 소설을 생성하는 시스템을 구축할 수 있습니다.
먼저, 프로젝트의 의존성을 격리하기 위해 가상 환경(venv)을 생성하고 필요한 패키지를 설치합니다.
python3 -m venv myenv
source myenv/bin/activate # Windows의 경우: myenv\Scripts\activate
pip install openai langchain python-dotenv
python3 -m venv myenv
: 새로운 가상 환경 myenv
를 생성합니다.source myenv/bin/activate
: 가상 환경을 활성화합니다.pip install
: 필요한 패키지를 가상 환경에 설치합니다.pip install langchain python-dotenv langchain-ollama
.env
파일에서 환경 변수를 로드할 수 있게 해줍니다..env
파일 설정API 키와 같은 민감한 정보를 코드에 직접 작성하는 것은 보안상 위험합니다. 따라서 .env
파일을 사용하여 환경 변수를 설정하고 코드에서 이를 불러오는 것이 좋습니다.
OPENAI_API_KEY=your_openai_api_key
your_openai_api_key
를 실제 OpenAI API 키로 교체하세요..env
파일은 프로젝트 루트 디렉토리에 위치해야 하며, 버전 관리 시스템(git 등)에 포함되지 않도록 .gitignore
에 추가해야 합니다.이제 LangChain을 사용하여 소설 생성 시스템을 구축하는 코드를 작성하겠습니다.
import os
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.chains import SequentialChain
from langchain.memory import ConversationBufferMemory
from dotenv import load_dotenv
# .env 파일에서 API 키 로드
load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")
# 1. OpenAI 모델 초기화
llm = OpenAI(api_key=openai_api_key, model="gpt-3.5-turbo")
# 2. 프롬프트 템플릿 설정
prompt_template = """
당신은 {style} 스타일의 소설 작가입니다. 당신의 스타일은 문학적이며 창의적입니다.
다음 주제를 기반으로 소설의 첫 문장을 작성하세요:
{topic}
"""
# 3. 체인과 메모리 설정
memory = ConversationBufferMemory()
prompt_chain = PromptTemplate(
template=prompt_template, input_variables=["style", "topic"]
)
llm_chain = LLMChain(llm=llm, prompt=prompt_chain, output_key="text")
sequential_chain = SequentialChain(
chains=[llm_chain],
input_variables=["style", "topic"],
output_variables=["text"],
memory=memory,
verbose=True
)
# 4. 소설 생성 함수 정의
def generate_story(style: str, topic: str):
result = sequential_chain({"style": style, "topic": topic})
return result["text"]
# 5. 예제 실행
style = "고풍스러운 문체와 서정적 어휘"
topic = "사랑과 운명에 관한 이야기"
story = generate_story(style, topic)
print(story)
OpenAI
클래스를 사용하여 OpenAI의 GPT-3.5-turbo 모델을 초기화합니다.api_key
는 .env
파일에서 로드한 API 키를 사용합니다.model
파라미터는 사용할 언어 모델의 이름을 지정합니다.PromptTemplate
은 모델에게 전달할 프롬프트의 구조를 정의합니다.{style}
과 {topic}
은 동적으로 입력받을 변수입니다.ConversationBufferMemory
는 이전 대화 내용을 저장하여 컨텍스트를 유지합니다.LLMChain
은 언어 모델과 프롬프트 템플릿을 연결하여 체인을 구성합니다.SequentialChain
은 여러 체인을 순차적으로 실행할 수 있게 합니다.input_variables
와 output_variables
는 체인에 전달할 입력과 받을 출력을 지정합니다.verbose=True
는 체인의 실행 과정을 상세히 출력합니다.generate_story
함수는 스타일과 주제를 입력받아 체인을 실행하고 결과를 반환합니다.sequential_chain
에 필요한 입력을 딕셔너리 형태로 전달합니다."text"
키에 생성된 소설 문장이 담겨 있습니다.style
과 topic
변수를 정의하여 원하는 스타일과 주제를 지정합니다.generate_story
함수를 호출하여 소설의 첫 문장을 생성합니다.{style}
, {topic}
은 사용자가 입력하는 데이터입니다.txt
파일에서 소설 데이터를 불러와 프롬프트에 참고하는 방식으로 구현하면, 모델이 특정 스타일이나 내용에 기반하여 텍스트를 생성하도록 유도할 수 있습니다.
txt
파일에서 데이터 가져오기novel_data.txt
파일에 저장합니다.import os
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.chains import SequentialChain
from langchain.memory import ConversationBufferMemory
from dotenv import load_dotenv
# .env 파일에서 API 키 로드
load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")
# 1. OpenAI 모델 초기화
llm = OpenAI(api_key=openai_api_key, model="gpt-3.5-turbo")
# 2. txt 파일에서 소설 데이터 읽기
def load_novel_data(file_path: str) -> str:
with open(file_path, 'r', encoding='utf-8') as file:
novel_data = file.read()
return novel_data
novel_data_path = "novel_data.txt" # txt 파일 경로
novel_data = load_novel_data(novel_data_path)
# 3. 프롬프트 템플릿 설정 (참고 데이터 포함)
prompt_template = """
당신은 {style} 스타일의 소설 작가입니다. 다음 소설 내용을 참고하여 비슷한 스타일로 새로운 소설의 첫 문장을 작성하세요.
참고 소설 내용:
"{novel_data}"
주제: {topic}
"""
# 4. 체인과 메모리 설정
memory = ConversationBufferMemory()
prompt_chain = PromptTemplate(
template=prompt_template, input_variables=["style", "topic", "novel_data"]
)
llm_chain = LLMChain(llm=llm, prompt=prompt_chain, output_key="text")
sequential_chain = SequentialChain(
chains=[llm_chain],
input_variables=["style", "topic", "novel_data"],
output_variables=["text"],
memory=memory,
verbose=True
)
# 5. 소설 생성 함수 정의
def generate_story(style: str, topic: str, novel_data: str):
result = sequential_chain({"style": style, "topic": topic, "novel_data": novel_data})
return result["text"]
# 6. 예제 실행
style = "고풍스러운 문체와 서정적 어휘"
topic = "운명에 의해 갈라진 연인들의 이야기"
story = generate_story(style, topic, novel_data)
print(story)
load_novel_data
함수는 지정된 경로의 텍스트 파일을 읽어와 문자열로 반환합니다.encoding='utf-8'
로 지정하여 한글이 정상적으로 읽히도록 합니다.novel_data
변수에 파일의 내용을 저장합니다.novel_data
를 프롬프트에 포함하여 모델이 참고할 수 있도록 합니다.input_variables
에 novel_data
를 추가하여 체인에 전달합니다.generate_story
함수에서도 novel_data
를 인수로 받도록 수정합니다.load_novel_data
함수: 외부 파일에서 데이터를 읽어와 프로그램 내에서 활용할 수 있게 해줍니다.novel_data
전달: 체인에 추가적인 입력을 전달하여 프롬프트에 반영되도록 합니다.Ollama를 사용하여 Llama 2 모델을 활용해 소설 데이터를 학습하고 유사한 스타일의 소설을 작성하는 코드를 구현할 수 있습니다.
python3 -m venv myenv
source myenv/bin/activate # Windows의 경우: myenv\Scripts\activate
pip install langchain python-dotenv langchain-ollama
langchain-ollama
패키지는 LangChain과 Ollama를 통합하여 사용할 수 있게 해줍니다.# Ollama 설치
curl -fsSL https://ollama.ai/install.sh | sh
# Llama 3.2 모델 다운로드
ollama pull llama3.2
#llama 3.2 실행
ollama run llama3.2
ollama pull llama2
를 통해 Llama 3.2 모델을 로컬에 다운로드합니다..env
파일 설정Ollama는 로컬에서 실행되므로 별도의 API 키는 필요하지 않습니다.
import os
from langchain import PromptTemplate, LLMChain
from langchain.chains import SequentialChain
from langchain.memory import ConversationBufferMemory
from dotenv import load_dotenv
from langchain_ollama import OllamaLLM
# .env 파일 로드
load_dotenv()
# 1. Ollama 모델 초기화
llm = OllamaLLM(model="llama3.2")
# 2. txt 파일에서 소설 데이터 읽기
def load_novel_data(file_path: str) -> str:
with open(file_path, 'r', encoding='utf-8') as file:
novel_data = file.read()
return novel_data
novel_data_path = "./nbtosung.txt" # txt 파일 경로
novel_data = load_novel_data(novel_data_path)
# 3. Prompt Template 설정 (참고 데이터 포함)
prompt_template = """
당신은 {style} 스타일의 소설 작가입니다. 다음 소설 내용을 참고하여 비슷한 스타일로 새로운 소설의 첫 문장을 작성하세요.
참고 소설 내용:
"{novel_data}"
주제: {topic}
"""
# 4. 체인과 메모리 설정
# memory를 prompt와 연관된 변수를 제외하고, 필요한 데이터만 저장하도록 변경
memory = ConversationBufferMemory(memory_key="memory_buffer", input_key="topic")
prompt_chain = PromptTemplate(
template=prompt_template, input_variables=["style", "topic", "novel_data"]
)
llm_chain = LLMChain(llm=llm, prompt=prompt_chain, output_key="text")
# 최종 체인 설정
sequential_chain = SequentialChain(
chains=[llm_chain],
input_variables=["style", "topic", "novel_data"],
output_variables=["text"],
memory=memory,
verbose=True
)
# 5. 소설 생성 함수 정의
def generate_story(style: str, topic: str, novel_data: str):
result = sequential_chain({"style": style, "topic": topic, "novel_data": novel_data})
return result["text"]
# 6. 예제 실행
style = "고풍스러운 문체와 서정적 어휘"
topic = "운명에 의해 갈라진 연인들의 이야기"
story = generate_story(style, topic, novel_data)
print(story)
Ollama
클래스를 사용하여 Llama 3.2 모델을 초기화합니다.model
파라미터에 사용할 모델의 이름을 지정합니다.langchain-ollama
패키지를 설치하여 LangChain에서 Ollama 모델을 사용할 수 있게 합니다.langchain-ollama
패키지를 통해 LangChain과 Ollama의 통합을 지원합니다.이렇게 LangChain과 Ollama를 활용하여 로컬에서 소설 데이터를 기반으로 유사한 스타일의 소설을 생성하는 시스템을 구축할 수 있습니다. 이를 통해 데이터 프라이버시를 유지하면서도 강력한 언어 생성 능력을 활용할 수 있습니다.