LLM 시대, LangChain(랭체인)으로 배우는 AI 소프트웨어 개발
이번에는 OpenAI API, Gemini API, Anthropic API와 같은 주요 언어모델 API에 대한 일반적인 사용법과 차이점을 설명합니다. 이러한 API를 적절하게 활용하여 특정 언어모델에 독립적인 시스템을 개발할 수 있습니다.
모든 API의 공통점은 다음과 같습니다.
모델명 지정
메시지 목록 전달
API키를 환경변수에서 읽음
복수의 모달리티(형식)를 입력 가능
temperature, top-p, 최대토큰수, 정지시퀀스등의 파라미터 지정 가능
그러나, 이러한 파라미터의 이름과 전달방법에는 API간에 차이가 있습니다. 각 API에 대해 텍스트 전용 대화와 이미지가 포함된 다중 모달 대화의 2가지 예를 보여주면서 그 특징을 설명합니다.
OpenAI API는 OpenAI에서 제공하는 API입니다. OpenAI API를 사용하면 OpenAI가 개발한 모델에 접근할 수 있습니다. OpenAI API를 사용하려면 사전에 API키를 가져와 환경변수로 설정해야 합니다.
아래 코드는 OpenAI API를 사용하여 텍스트만 대화하는 예제입니다. 이 프로그램을 사용하여 OpenAI API를 사용하는 방법을 보여줍니다.
OpenAI API를 통한 대화(src/api/chat_openai.py)
먼저 필요한 라이브러리를 가져옵니다.
여기서는 openai 패키지에서 OpenAI클래스를 가져옵니다. 그런 다음 API클라이언트를 초기화합니다. 여기에서는 OpenAI 클래스의 인스턴스를 만들고 client변수에 할당합니다.
그런 다음 API를 호출하여 대화를 진행합니다.
이 코드는 OpenAI의 chat.completions.create메소드에서 메시지 목록을 입력으로 GPT-4o mini 모델에 쿼리하고 응답을 response변수에 저장합니다. 또한, 이 메소드에는 model, message, tempature, top_p, max_tokens, stop등의 파라미터를 지정할 수 있습니다.
model은 OpenAI에서 제공하는 모델명을 지정합니다. 여기서는 GPT-4o mini를 지정합니다.
messages는 메시지 목록입니다. 메시지 목록의 개별요소는 사전형식의 메시지입니다. role은 메시지의 역할을 나타내며, 사용자, 보조자 또는 시스템을 지정합니다.
content는 메시지 내용을 나타냅니다. 여기서는 시스템 메시지로 "You area helpful assistant."라는 LLM에 역할을 설정하는 메시지를 지정합니다. 이것은 OpenAI 샘플에서 자주 사용되는 상용문입니다. 시스템 메시지는 가끔 LLM역할과 페르소나를 설정하는데 사용됩니다.
temperature, top_p, max_tokens, stop은 각각 생성되는 텍스트의 특성을 제어하는 파라미터입니다. 마지막으로 API응답을 표시합니다.
여기서는 response 객체로부터 최신 어시스턴트 응답을 취득해 latest_response변수에 넣고 있습니다. 그리고 그 내용을 표시하고 있습니다. response객체는 API의 전체응답을 나타냅니다. choices는 API의 응답목록입니다. 이 예제에서는 특히 여러 응답을 반환하는 설정을 하지 않으므로 choices의 첫번째 요솔를 얻습니다. message는 응답내용을 나타냅니다. content는 응답을 문자열로 유지합니다. 이 프로그램을 실행하면 다음과 같은 응답을 얻을 수 있습니다.
아래 코드는 OpenAI API를 사용하여 이미지를 포함하는 다중 모달 질문응답을 수행하는 예제입니다. 구체적으로는 명령줄에서 이미지파일을 지정해 그 이미지에 대한 설명을 요구합니다. 이번에는 OpenAI의 멀티모달 기능을 사용하는 방법을 보여줍니다.
OpenAI API를 통한 다중 모달 질문응답 (src/api/mm_openai.py)
우선 필요한 라이브러리를 가져옵니다.
여기서는 sys, base64 openai패키지에서 각각 필요한 모듈을 가져옵니다. sysㅁ모듈은 명령행 인수를 얻는데 사용됩니다. base64모듈은 이미지 데이터를 base64인코딩하는데 사용됩니다. 그런 다음 이미지 파일을 설명하는 함숫를 정의합니다. 함수의 시그니처는 다음과 같습니다.
여기에서는 파일명를 받아, 그 이미지에 관한 설명을 돌려주는 함수로서 정의합니다. 그런 다음 OpenAI API를 사용하여 함수 본문을 구현합니다. 먼저 이미지파일을 읽고 base64로 인코딩합니다.
여기서는 이미지파일을 바이너리 모드로 읽고 base64로 인코딩합니다. 그런 다음 OpenAI API를 호출하여 이미지에 대한 설명을 얻습니다.
API를 사용하는 것은 일반적으로 텍스트 전용 대화와 비슷하지만, 메시지에 이미지 데이터가 포함된 image_url을 지정해야 합니다. 또한, 메시지 내용이 문자열에서 목록으로 변경되었습니다. 이 목록에는 텍스트와 이미지 데이터가 포함된 사전이 포함됩니다. 사전의 type키에 대응하는 값이 text인 경우는 text키에 대응하는 값에 텍스트를 지정합니다. 한편 type키에 대응하는 값이 image_url인 경우 image_url에 대응하는 값에 이미지 데이터를 지정합니다. 이 함수는 마지막으로 응답을 반환합니다.
마지막으로 explain_image 함수를 호출하여 이미지에 대한 설명을 표시합니다. 여기서는 명령줄 인수에서 이미지파일명을 가져오고 print함수를 호출하여 결과를 표시합니다.
이미지를 입력하여 이 프로그램을 다음과 같이 실행하면 아래 응답을 얻을 수 있어야 합니다.
결과가 사과와 책의 구도를 올바르게 설명되는 것을 알 수 있습니다.
Gemini API는 Google에서 제공하는 API입니다. Gemini API를 사용하면 Google에서 개발한 LLM인 Gemin에 액세스할 수 있습니다. Gemini API를 사용하려면 먼저 API키를 가져와 환경변수로 설정해야 합니다.
아래 코드는 Gemini API를 사용하여 텍스만 대화하는 예시입니다.
Gemini API를 통한 대화 (src/api/chat_google.py)
우선 필요한 라이브러리를 가져옵니다.
여기에서는 google.generativeai모듈을 genai로 가져옵니다. 그런 다음 API를 호출하기 위한 파라미터를 설정합니다.
Gemini API에서는 generai.types.GenerattionConfig클래스를 사요ㅕㅇ하여 파라미터를 지정합니다. 이 클래스를 사용하면 temperature, top_p, max_output_tokens, stop_sequences등의 파라미터를 지정할 수 있습니다. 그런 다음 모델의 인스턴스를 만듭니다.
여기서는 generai.GenerativeModel클래스의 인스턴스를 만들고 model변수에 할당합니다. 생성자 인수는 사용할 모델명을 지정합니다. 그런 당름 API를 호출하여 대화를 진행합니다.
이 코드에서는 generai.GenerativeModel 클래스의 generate_content메소드를 사용하여 gemini-1.5-flash-latest모델에서 메시지 목록(contents)을 전달하고 응답을 가져옵니다. contents는 메시지 목록입니다. 목록의 개별요소는 사전형식의 메시지이며 role 및 parts가 있습니다. role은 메시지의 역할을 나타내며, 사용자, 모델 중 하나를 지정합니다. parts는 메시지 내용을 나타내는 목록입니다. generation_config는 방금 만든 GenerationConfig클래스의 인스턴스를 지정합니다. 마지막으로 API 응답을 표시합니다.
여기서는 response객체에서 text솏성을 가져와서 latest_response변수에 저장합니다. 그리고 그 내용을 표시합니다.
아래 코드는 Gemini API를 사용하여 이미지를 포함하는 다중 모달 질문응답을 수행하는 예시입니다.
우선 필요한 라이브러리를 가져옵니다.
여기에서는 sys, google.generativeai, PIL.Image모듈을 가져옵니다. 그런 다음 이미지 파일을 설명하는 함수를 정의합니다. 함수 시그니처는 다음과 같습니다.
여기서는 파일명을 받고, 이미지에 대한 설명을 반환하는 함수로 정의합니다. 그런 다음 Gemini API를 사용하여 함수 본문을 구현합니다.
API를 사용하는 것은 일반적으로 텍스트 전용 대화와 유사하지만, parts목록의 두번째 요소에 이미지 데이터를 지정합니다. 여기에서는 PIL.Image모듈을 사용하여 이미지파일을 읽고 그대로 parts목록에 추가합니다. Gemini API에서는 이미지데이터를 base64로 인코딩된 문자열로 전달할 필요가 없습니다. 이 함수는 마지막으로 응답텍스트를 반환합니다. 마지막으로 explain_image함수를 호출하여 이미지에 대한 설명을 표시합니다.
여기서 명령줄 인수에서 이미지파일명을 가져와 함수를 호출하여 결과를 표시합니다.
Anthropic API는 Anthropic에서 제공하는 API입니다. Anthropic API를 사용하면 Anthrpic이 개발한 LLM인 Claude에 액세스할 수 있습니다. Anthropic API를 사용하려면 사전에 API키를 가져와 환경변수로 설정해야 합니다.
아래 코드는 Anthropic API를 사용하여 텍스트만 대화하는 예시입니다.
Anthropic API를 통한 대화 (src/api/chat_anthropic.py)
우선 필요한 라이브러리를 가져옵니다.
여기 anthropic패키지를 가져옵니다. 그런 다음 API를 호출하여 대화를 진행합니다.
이 코드에서는 anthropic.Anthropic().messages.create메소드를 사용하여 claude-3.5-haiku-latest모델에 메시지 목록을 전달하고 응답을 가져옵니다. messages는 메시지 목록입니다. 리스트 개별요소는 사전형 메시지로 role와 content를 가집니다. role은 메시지역할을 나타내며, user, assistant중 하나를 지정합니다.
content는 메시지 내용을 나타냅니다. Anthropic API를 사용하면 OpenAI API와 마찬가지로 temperature, top_p, max_tokens, stop_sequences와 같은 파라미터를 직접 지정할 수 있습니다. 파라미터의 의미는 OpenAI API와 비슷합니다.
여기에서는 response 객체로부터 최신의 어시스턴트의 응답을 취득해 latest_response변수에 저장합니다. 그리고 그 내용을 표시합니다. response객체의 content속성은 응답 목록을 보유합니다. 여기에서는 리스트의 최초 요소인 text property를 취득하고 있습니다.
아래 코드는 Anthropic API를 사용하여 이미지를 포함하는 다중 모달 질문응답을 수행하는 예시입니다.
Anthropic API를 통한 다중모달질문응답 (src/api/mm_anthropric.py)
우선 필요한 라이브러리를 가져옵니다.
여기서는 sys, base64 및 anthropic 모듈을 가져옵니다. 그런 다음 이미지 파일을 설명하는 함수를 정의합니다.
여기서는 파일명을 받고 이미지에 대한 설명을 반환하는 함수로 정의합니다. 그런 다음 이미지파일을 읽고 base64로 인코딩합니다.
여기서는 이미지 파일을 바이너리 모드로 읽고 base64로 인코딩합니다. 그런 다음 Anthropic API를 호출하여 이미지에 대한 설명을 얻습니다.
API를 사용하는 것은 일반적으로 텍스트 전용 대화와 비슷하지만 메시지에 이미지 데이터가 포함된 이미지를 지정해야 합니다. Anthropic API에서는 이미지 데이터를 base64인코딩된 문자열로 전달하고 media_type파라미터에 이미지의 MIME유형을 지정합니다. 이 함수는 마지막으로 응답 텍스트를 반환합니다. 참고로 모델에는 멀티모달에 대응한 것을 지정하고 있습니다.
여기서는 명령줄 인수로 이미지 파일명을 가져와 함수를 호출하여 결과를 표시합니다.
(4) 언어모델 독립적인 API(LangChain)
LangChain은 특정 언어 모델에 독립적인 프레임워크입니다. LangChain이 제공하는 API를 사용하면 응용프로그램에 사용이 가능하고 특정 언어모델에 의존하지 않도록 할 수 있습니다. 아래 코드는 LangChain API 사용 예시입니다.
LangChain API를 통한 대화 (src/api/chat_langchain.py)
우선 필요한 라이브러리를 가져옵니다.
여기서는 langchain_openai패키지 외에 langchain_anthropic, langchain_google_genai 및 langchain_core 패키지에서 필요한 클래스를 가져옵니다. Langchain_antrhropic 및 langchain_google_genai는 주석처리되었지만 필요에 따라 사용할 수 있습니다.
다음은 사용할 언어모델을 선택합니다.
여기서는 ChatOpenAI, ChatAnthropic 또는 ChatGoogleGenerativeAI 중 하나의 클래스를 사용하여 언어모델을 선택합니다. 이러한 클래스는 각각 OpenAI API, AnthropicAPI, Gemini API에 해당합니다. 생성자 인수는 사용할 모델명을 지정합니다. 여기서도 주석처리된 부분은 필요에 따라 사용할 수 있습니다. 본 프로그램을 실행하려면 사용하는 언어모델 API키를 사전에 환경변수로 설정해 두는 것이 필요합니다. 그런 다음 메시지 목록을 만듭니다.
여기서는 SystemMessage, HumanMessage 및 AIMessage클래스를 사용하여 메시지 목록을 작성합니다. SystemMessage는 어시스턴트역할을 지정하는 메시지입니다. HumanMessage는 사용자 메시지를 나타냅니다. AIMessage는 어시스턴트의 메시지를 나타냅니다. 이러한 클래스를 사용하면 API별 차이를의식하지 않고 일관된 방식으로 메시지 목록을 만들 수 있습니다. SystemMessage는 주석처리되어 유효합니다. 그러나 Gemini API에서는 SystemMessage를 사용할 수 없으므로 주의해야 합니다. 그런 다음 API를 호출하여 대화를 진행합니다.
여기서는 llm객체의 invoke메소드를 사용하여 메시지 목록을 전달하고 응답을 검색합니다. invoke메소드는 LangChain가 제공하는 통일적인 인터페이스입니다. 마지막으로 API응답을 표시합니다.
여기에서는 response객체의 content속성에서 최신 어시스턴트응답을 가져와서 latest_response변수에 저장합니다. 그리고 그 내용을 표시하고 있습니다. 이와 같이, LangChain에서는 ChatOpenAI, ChatAnthropic, ChatGoogleGenerativeAI등의 클래스를 사용하여 각 API를 추상화해 통일적인 인터페이스를 제공하고 있습니다. 이를 통해 사용자는 API간의 차이를 인식하지 않고도 동일한 코드로 다양한 언어모델을 사용할 수 있습니다. 그러나 2024년말까지 LangChain은 멀티모달대화를 지원하지 않습니다.
©2024-2025 GAEBAL AI, Hand-crafted & made with Damon Jaewoo Kim.
GAEBAL AI 개발사: https://gaebalai.com
AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5