선행지식
토큰화 : 텍스트를 의미 있는 단위(토큰)로 나누는 과정입니다. 이 단위는 단어, 문장, 문단, 심지어 더 작은 단위일 수도 있습니다. 토큰화는 NLP의 첫 번째 단계로, 원시 텍스트 데이터를 처리 가능한 형태로 변환
파싱 : 토큰화된 텍스트를 구조화된 형식으로 변환하는 과정. 이 과정은 구문 분석(Syntax Parsing), 의미 분석(Semantic Parsing), 그리고 구문 트리(Syntax Tree)나 추상 구문 트리(Abstract Syntax Tree, AST)를 생성
Parser의 종류와 기능
1. StrOutputParser()
- 입력된 텍스트를 변경 없이 그대로 반환합니다. 이는 가장 기본적인 파싱 작업이며, 주로 기본 클래스나 간단한 테스트 목적으로 사용
- 변환전
AIMessage(content='인공지능 모델의 학습 원리는 데이터를 이용하여 패턴을 학습하는 것입니다. 이렇게 반복적으로 학습을 진행하면 모델은 입력 데이터로부터 패턴을 학습하여 정확한 결과를 예측하게 됩니다. 이러한 학습 원리를 통해 인공지능 모델은 데이터를 이용하여 스스로 학습하고 문제를 해결할 수 있습니다.', response_metadata={'token_usage': {'completion_tokens': 214, 'prompt_tokens': 33, 'total_tokens': 247}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-7f8a08f4-51ba-4d14-b9d2-2e092be3e7aa-0', usage_metadata={'input_tokens': 33, 'output_tokens': 214, 'total_tokens': 247})
- 변환후
인공지능 모델의 학습 원리는 데이터를 이용하여 패턴을 학습하는 것입니다. 이렇게 반복적으로 학습을 진행하면 모델은 입력 데이터로부터 패턴을 학습하여 정확한 결과를 예측하게 됩니다. 이러한 학습 원리를 통해 인공지능 모델은 데이터를 이용하여 스스로 학습하고 문제를 해결할 수 있습니다.
- 너무 기능이 없는뎁쇼? .. -> StrOutputParser를 상속하여 더 복잡한 텍스트 처리를 수행하는 커스텀 파서를 구현 가능
class StrOutputParser:
def parse(self, text: str) -> str:
return text
import re
class CustomOutputParser(StrOutputParser):
def parse(self, text: str) -> dict:
# 기본 파싱: 부모 클래스의 parse 메서드 호출
text = super().parse(text)
# 정규 표현식을 사용하여 특정 정보를 추출
temperature_match = re.search(r"temperature is (\d+) degrees", text)
temperature = temperature_match.group(1) if temperature_match else None
# 결과를 사전 형태로 구조화
weather_info = {
"location": "Seoul",
"temperature": temperature,
"description": text
}
return weather_info
# 사용 예시
response = "Today's weather in Seoul is clear and the temperature is 25 degrees Celsius."
output_parser = CustomOutputParser()
parsed_output = output_parser.parse(response)
print(parsed_output)
{
"location": "Seoul",
"temperature": "25",
"description": "Today's weather in Seoul is clear and the temperature is 25 degrees Celsius."
}
2. JSON Output Parser
목적: 모델의 출력이 JSON 형식일 때 이를 파싱하여 Python 딕셔너리로 변환하는 데 사용됩니다.
입력 형식: 입력 텍스트가 JSON 형식이어야 합니다.
사용 예: 모델의 출력이 이미 JSON 구조를 가지고 있을 때, 이를 직접적으로 파싱하여 사용하기에 적합합니다.
사용 예제
import json
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# OpenAI 언어 모델 초기화
llm = OpenAI(api_key="your-api-key")
# 프롬프트 템플릿 생성
prompt = PromptTemplate(
input_variables=["query"],
template="Provide the following information in JSON format: {query}"
)
# 질문 설정
query = "The weather in New York today is sunny with a temperature of 22 degrees Celsius."
formatted_prompt = prompt.format(query=query)
# 모델 실행
response = llm.generate(formatted_prompt)
print("Raw Response:", response)
class JSONOutputParser:
def parse(self, text: str) -> dict:
try:
return json.loads(text)
except json.JSONDecodeError:
raise ValueError("Invalid JSON response")
# JSON Output Parser 초기화
output_parser = JSONOutputParser()
# 모델의 응답 파싱
parsed_output = output_parser.parse(response)
print("Parsed Output:", parsed_output)
Output:
{
"location": "New York",
"weather": "sunny",
"temperature": 22,
"unit": "Celsius"
}
3. Key-Value Output Parser
목적: 모델의 출력에서 키-값 쌍을 추출하여 Python 딕셔너리로 변환하는 데 사용됩니다.
입력 형식: 입력 텍스트가 JSON 형식이 아닐 수도 있습니다. 텍스트 내에서 키-값 쌍을 식별하여 이를 딕셔너리로 변환합니다.
사용 예: 모델의 출력이 포맷화된 JSON이 아닐 때, 텍스트에서 특정 키-값 쌍을 추출하여 구조화된 데이터로 변환하는 데 적합합니다.
사용 예제
import re
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# OpenAI 언어 모델 초기화
llm = OpenAI(api_key="your-api-key")
# 프롬프트 템플릿 생성
prompt = PromptTemplate(
input_variables=["query"],
template="Extract the following information as key-value pairs: {query}"
)
# 질문 설정
query = "The weather in Paris today is cloudy with a temperature of 18 degrees Celsius."
formatted_prompt = prompt.format(query=query)
# 모델 실행
response = llm.generate(formatted_prompt)
print("Raw Response:", response)
class KeyValueOutputParser:
def parse(self, text: str) -> dict:
key_value_pairs = re.findall(r"(\w+):\s*([^,]+)", text)
return {key.strip(): value.strip() for key, value in key_value_pairs}
# Key-Value Output Parser 초기화
output_parser = KeyValueOutputParser()
# 모델의 응답 파싱
parsed_output = output_parser.parse(response)
print("Parsed Output:", parsed_output)
Output:
{
"weather": "cloudy",
"temperature": "18 degrees Celsius"
}
4. List Output Parser
목적 : List Output Parser는 모델의 출력에서 리스트 형태의 데이터를 추출하여 Python의 리스트로 변환하는 데 사용됩니다.
입력 형식 : 입력 텍스트는 여러 줄로 구분된 항목 리스트 형태여야 합니다. 각 항목은 개별 줄로 나뉘어야 합니다.
사용 예 : 모델의 출력이 여러 줄로 구분된 항목 리스트일 때, 이를 파싱하여 Python 리스트로 변환합니다.
사용 예제
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# OpenAI 언어 모델 초기화
llm = OpenAI(api_key="your-api-key")
# 프롬프트 템플릿 생성
prompt = PromptTemplate(
input_variables=["query"],
template="List the top 5 tourist attractions in {query}:"
)
# 질문 설정
query = "Tokyo"
formatted_prompt = prompt.format(query=query)
# 모델 실행
response = llm.generate(formatted_prompt)
print("Raw Response:", response)
# List Output Parser
class ListOutputParser:
def parse(self, text):
items = text.split('\n')
return [item.strip() for item in items if item.strip()]
# List 파서 초기화
output_parser = ListOutputParser()
# 모델의 응답 파싱
parsed_output = output_parser.parse(response)
print("Parsed Output:", parsed_output)
Output:
[
"Tokyo Tower",
"Senso-ji Temple",
"Shibuya Crossing",
"Meiji Shrine",
"Ueno Park"
]
5. CSV Output Parser
목적 : CSV Output Parser는 모델의 출력이 CSV 형식일 때 이를 파싱하여 Python의 리스트 또는 딕셔너리로 변환하는 데 사용됩니다.
입력 형식 : 입력 텍스트는 CSV 형식이어야 합니다. 즉, 각 행은 쉼표로 구분된 값들을 포함하며, 첫 번째 행은 일반적으로 헤더 행입니다.
사용 예 : 모델의 출력이 CSV 형식일 때, 이를 파싱하여 Python의 리스트 또는 딕셔너리 리스트로 변환합니다.
사용 예제
import csv
import io
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# OpenAI 언어 모델 초기화
llm = OpenAI(api_key="your-api-key")
# 프롬프트 템플릿 생성
prompt = PromptTemplate(
input_variables=["query"],
template="Provide the data in CSV format: {query}"
)
# 질문 설정
query = "Name, Age, City\nAlice, 30, New York\nBob, 25, Los Angeles"
formatted_prompt = prompt.format(query=query)
# 모델 실행
response = llm.generate(formatted_prompt)
print("Raw Response:", response)
# CSV Output Parser
class CSVOutputParser:
def parse(self, text):
f = io.StringIO(text)
reader = csv.DictReader(f)
return [row for row in reader]
# CSV 파서 초기화
output_parser = CSVOutputParser()
# 모델의 응답 파싱
parsed_output = output_parser.parse(response)
print("Parsed Output:", parsed_output)
Output:
[
{"Name": "Alice", "Age": "30", "City": "New York"},
{"Name": "Bob", "Age": "25", "City": "Los Angeles"}
]
'langchain 공부' 카테고리의 다른 글
LLM 프로젝트를 기획할 때 겪게 되는 어려운 점들 (0) | 2024.08.12 |
---|---|
langchain 퓨샷 프롬프트(prompt) (0) | 2024.08.04 |
langchain 프롬프트(prompt) 기초 (0) | 2024.08.03 |
langchain LCEL 인터페이스 (0) | 2024.08.02 |
langchain 기초 (0) | 2024.07.29 |