첫 번째 이유는 단순히 가설이었다.
두 번째 이유는 input tokens에서의 이점이다.
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
prompt = ChatPromptTemplate.from_messages(
[
("system", "***"),
("user", "{user_input}"),
]
)
llm = ChatGooroomeeAI(model="***")
model = prompt | llm.bind(temperature=1.0, maxTokens=1000, n=4)
async def gen(prompt_template, ***):
output_parser = JsonOutputParser(pydantic_object=OutputFormat)
prompt = PromptTemplate(
template=prompt_template,
input_variables=[
"***",
"***",
"***",
],
partial_variables={
"format_instructions": output_parser.get_format_instructions()
},
)
chain = prompt | model | output_parser
response = chain.invoke(
{
"***": ***,
"***": ***,
"***": ***,
}
)
return response
class OutputFormat(BaseModel):
***: str = Field(description="***")
***: str = Field(description="***")
process: dict[str, str] = Field(
description="""응답 생성 과정으로, 'Step _'을 key로 하고 해당 Step의 과정을 진행한 내용을 value로 한다.
응답 예시)
Step 1: 응답 생성 과정의 첫번째 과정 진행,
Step 2: 응답 생성 과정의 두번째 과정 진행,
..."""
)
해결 코드 작성 과정은 아래와 같다.
chain = prompt | model | output_parser
이렇게 pipe로 연결된 경우에서 chain._generate()를 호출할 수가 없었다.
response = llm._generate([[message]])
위의 프롬프트 내용을 message로 변경해야했다.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
llm = ChatOpenAI(model="***", temperature=1.0, max_tokens=2000, n=4)
# max_tokens 값을 올려야 응답이 중간에 끊기는 것을 방지 가능
async def gen(prompt_template, ***):
output_parser = JsonOutputParser(pydantic_object=OutputFormat)
prompt = ChatPromptTemplate.from_messages(
[
("system", "***"),
("user", prompt_template), # 바로 prompt_template 사용
]
)
response = llm._generate( # llm._generate 호출
prompt.invoke( # prompt에 변수 삽입
{
"***": ***,
"***": ***,
"***": ***,
"format_instructions": output_parser.get_format_instructions(),
}
).to_messages() # message로 형식으로 변경
)
## n개의 응답을 parsing하고 dict으로 분리 ##
response_dict = {}
for idx, res in enumerate(response.generations):
response_dict[idx] = output_parser.parse(res.text)
# outputParser를 이용한 parsing
return response_dict
나와 동일한 방식으로 ChatPromptTemplate
을 사용하면서 n 파라미터를 사용하려고 시도한 경우를 찾지 못해서 해결에 난항을 겪었었다.
이 글을 보게 될 다른 이는 금방 해결할 수 있기를 바라며 글을 남긴다.
langchain n param
langchain n param not work