채널톡 아이콘

인프런 커뮤니티 질문&답변

이성규님의 프로필 이미지

작성한 질문수 4

LangGraph를 활용한 AI Agent 개발

Hub에서 다운 받은 프롬프트에 이미지 추가하기

해결된 질문

작성

·

69

·

수정됨

0

안녕하세요.

 

저는 이번에 pdf를 입력하고 그것을 기반으로하는 멀티모달 graph를 streamlit을 통해 구현했습니다.

 

근데 제가 이번에 Langchain 관련 코드를 몰라서 완성 된 것과는 별개로 너무 투박하게 코드가 작성된 것 같아서 질문드립니다.

 

질문 요약 :

hub.pull("rlm/rag-prompt")한 프롬포트 str로 뽑기 or

이미지 추가해서 메세지만드는 방법

 

 

 

GPT 모델은

message_content = []
message_content.append({"type": "text", "text": prompt})
message_content.append(
                {"type": "image_url", "image_url": {"url": f"data:{image_type};base64,{image_data}"}}
            )
message = HumanMessage(content=message_content)

# 응답받기
client = ChatOpenAI(model='gpt-4o')
response = client.invoke([message])

response.content ## str임!

해당 모양대로 메세지를 만들고 invoke하면 이미지포함 메세지가 되는 것을 알았습니다.

이를 통해 이미지에 보이는것은 ~~문서에있니? 이런식으로 구현하고자 했습니다.

 

generate 함수(노드) 에서 이미지와 텍스트를 같이 메세지로 전달하고 싶은데 조금 어려움을 겪었습니다. generate 함수 코드입니다.

해당 함수는 sate['context']의 내용을 프롬포트에 넣고 이를 이미지와 함께 보내고자합니다.

# 허브에서 RAG 프롬프트를 가져옵니다
generate_prompt = hub.pull("rlm/rag-prompt")

# 지정된 매개변수로 언어 모델을 초기화합니다
generate_llm2 = ChatOpenAI(model='gpt-4o')

def generate(state: AgentState) -> AgentState:
    """
    주어진 state를 기반으로 RAG 체인을 사용하여 응답을 생성합니다.

    Args:
        state (AgentState): 사용자의 질문과 문맥을 포함한 에이전트의 현재 state.

    Returns:
        AgentState: 생성된 응답을 포함하는 state를 반환합니다.
    """
    
    context = state['context']
    query = state['query_message']
    
    make_massage = []
    massage = generate_prompt.invoke({'question': query, 'context': context})
    messages = massage.to_messages()
    # print(massage)
    # print("--------------------------------")
    # print(messages)
    # print("--------------------------------")
    # print(messages[0])
    # print("--------------------------------")
    # print(messages[0].content)
    # print("--------------------------------")
    make_massage.append({"type": "text", "text": messages[0].content})


    if state['query_img'] != "":
        make_massage.append({"type": "image_url", 'image_url': {"url": state['query_img']}})
    

    final_massage = HumanMessage(content=make_massage)
    response = generate_llm2.invoke([final_massage])

    
    answer = { "type" : "RAGtext", "message" : response.content}
    
    print(f"call : generate")
    
    return {'answer': answer}

 

처음에는 prompt에서 str을 추출하려고 했는데 조금 어려웠습니다;

from langchain_openai import ChatOpenAI
from langchain import hub

# 허브에서 RAG 프롬프트를 가져옵니다
generate_prompt = hub.pull("rlm/rag-prompt")

print(generate_prompt.messages[0])

print(generate_prompt.messages[0].content) # 'HumanMessagePromptTemplate' object has no attribute 'content' 오류

print(generate_prompt.messages[0].invoke({"context" : "test", "question" : "test22" })) # 오류;; 

 

그렇기에 일단 invoke 를하고 완성된 text를 찾아 넣어주었습니다.

 

 

make_massage.append({"type": "text", "text": messages[0].content})

이런식으로 텍스트를 추출해서 다시 메세지를 구성하는게아니라.

이미지 url을 알고있으니 추가로 더 넣어주는 뭔가 그런 세련된 방법이 없었을까요?

 

분명 HumanMessagePromptTemplate 클래스나 그런것들다루는거라 기초 문법인거 같은데 조금 많이 헤매서 더 좋은 코드가 있을까 싶어 이렇게 질문을 드립니다.

 

답변 1

1

강병진님의 프로필 이미지
강병진
지식공유자

안녕하세요 성규님! 답변을 드려보자면,


hub.pull에서 가져오는 프롬프트는 허브 사이트에 표시가 되어있습니다. 다른분께서 질문으로 올려주셔서 설명한적이 있는데요, 요약하자면 허브에 작성되어있는 내용을 기반으로 ChatPromptTemplate으로 작성하시면 됩니다.

랭체인에서 이미지를 프롬프트에 넣는 방법은 공식문서에 설명되어있습니다. 다만 rag-prompt의 context에 이미지를 넣을 수 없기 때문에, 허브에 있는 텍스트만 그대로 가져와서 이미지를 메세지로 넣어주는 편이 더 깔끔해보입니다. 추가로 궁금하신 부분이 있으시면 말씀해주세요~

이성규님의 프로필 이미지
이성규
질문자

기본적인 질문 인데 항상 친절히 자세하게 잘 알려주셔서 감사합니다!