빠른 시작
이 빠른 시작에서는 기능/도구 호출을 지원하는 챗 모델을 사용하여 텍스트에서 정보를 추출하는 방법을 알아보겠습니다.
기능/도구 호출을 사용한 추출은 기능/도구 호출을 지원하는 모델에서만 작동합니다.
설정
우리는 기능/도구 호출을 지원하는 LLM(언어 모델 대)에서 사용 가능한 구조화된 출력 방법을 사용할 것입니다.
모델을 선택하고, 해당 모델의 종속성을 설치하고 API 키를 설정하세요!
!pip install langchain
스키마
먼저, 텍스트에서 추출하려는 정보를 설명해야 합니다.
우리는 Pydantic을 사용하여 개인 정보를 추출하기 위한 예제 스키마를 정의할 것입니다.
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""사람에 대한 정보."""
name: Optional[str] = Field(..., description="사람의 이름")
hair_color: Optional[str] = Field(
..., description="알려진 경우 사람의 머리 색상"
)
height_in_meters: Optional[str] = Field(
..., description="미터 단위로 측정된 키"
)
스키마를 정의할 때 두 가지 최선의 방법이 있습니다:
- 속성 및 스키마 자체에 대한 문서화: 이 정보는 LLM(언어 모델 대)에 전송되어 정보 추출의 품질을 향상시키기 위해 사용됩니다.
- LLM(언어 모델 대)에 정보를 구성하게 강요하지 마세요! 우리는 위에서
Optional
을 사용하여 속성에 대한 정보가 없는 경우에 대해None
을 출력하도록 했습니다.
최상의 성능을 위해, 스키마를 잘 문서화하고 텍스트에서 추출할 정보가 없는 경우에는 결과를 반환하지 않도록 모델을 강요하지 마세요.
추출기
우리가 위에서 정의한 스키마를 사용하여 정보 추출기를 만들어 봅시다.
from typing import Optional
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"당신은 전문적인 추출 알고리즘입니다. "
"텍스트에서 관련 정보만 추출하세요. "
"추출해야 하는 속성의 값이 알 수 없는 경우, "
"해당 속성의 값을 null로 반환하세요.",
),
("human", "{text}"),
]
)
우리는 기능/도구 호출을 지원하는 모델을 사용해야 합니다.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
runnable = prompt | llm.with_structured_output(schema=Person)
이제 테스트해 봅시다.
text = "Alan Smith는 키가 6 피트이고 금발입니다."
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='blond', height_in_meters='1.8288')
추출은 생성적입니다 🤯 LLM(언어 모델 대)은 생성적인 모델이기 때문에, 피트로 제공되었음에도 불구하고 정확하게 해당 사람의 키를 미터로 추출할 수 있는 등 멋진 일들을 할 수 있습니다!
다중 엔터티
대부분의 경우에는 한 가지 엔터티가 아닌 여러 개의 엔터티 목록을 추출해야 합니다.
이는 pydantic을 사용하여 모델을 서로 중첩시킴으로써 쉽게 수행할 수 있습니다.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""개인에 관한 정보."""
name: Optional[str] = Field(..., description="사람의 이름")
hair_color: Optional[str] = Field(
..., description="알려진 경우 사람의 머리 색상"
)
height_in_meters: Optional[str] = Field(
..., description="미터 단위로 측정한 키"
)
class Data(BaseModel):
"""사람에 관한 추출된 데이터."""
people: List[Person]
여기서 추출이 완벽하지 않을 수 있습니다. 추출 품질을 향상시키기 위해 참조 예제를 사용하는 방법 및 지침 섹션을 계속 참조하세요!
runnable = prompt | llm.with_structured_output(schema=Data)
text = "내 이름은 Jeff이고, 내 머리 색은 검고, 키는 6피트입니다. 안나는 나와 똑같은 머리 색상을 가지고 있어."
runnable.invoke({"text": text})
Data(people=[Person(name='Jeff', hair_color=None, height_in_meters=None), Person(name='Anna', hair_color=None, height_in_meters=None)])
스키마가 다중 엔터티의 추출을 가능케 할 때, 해당 텍스트에 관련 정보가 없는 경우 빈 목록을 제공함으로써 모델이 엔터티를 감지하지 않아도 되도록 하기도 합니다.
이것은 보통 좋은 일입니다! 모델이 이러한 엔터티를 탐지하도록 강제하지 않고도 엔터티의 필수 속성을 지정할 수 있게 합니다.