부록 #4. Anthropic API 응답 받기¶
변경 파일을 한 번에 덮어쓰기 하실려면, pyhub-git-commit-apply 유틸리티 설치하신 후에, 프로젝트 루트에서 아래 명령 실행하시면 지정 커밋의 모든 파일을 다운받아 현재 경로에 덮어쓰기합니다.
python -m pyhub_git_commit_apply https://github.com/pyhub-kr/django-webchat-rag-langcon2025/commit/3927187ffec09c8c6976ad21aae36e835d3263fc
uv
를 사용하실 경우
uv run pyhub-git-commit-apply https://github.com/pyhub-kr/django-webchat-rag-langcon2025/commit/3927187ffec09c8c6976ad21aae36e835d3263fc
다양한 LLM API들이 있으며, 서비스의 목적에 맞는 LLM API들을 사용해야할 것입니다. 이에 Anthropic API를 추가로 지원해보겠습니다.
Anthropic의 Claude 모델은 OpenAI의 GPT 모델과 함께 가장 널리 사용되는 LLM 중 하나이며, 긴 컨텍스트 처리와 자연스러운 대화에 강점이 있습니다.
미리보기¶

같은 프롬프트의 claude-3-7-sonnet-20250219 모델 응답¶
라이브러리 설치¶
requirements.txt
파일 덮어쓰기¶ 1django-pyhub-rag
2django-environ
3django-extensions
4django-lifecycle
5openai
6anthropic
7
8# sqlite 데이터베이스를 사용할 경우
9sqlite-vec
10numpy
11
12# postgres 데이터베이스를 사용할 경우
13# psycopg2-binary
14# pgvector
15
16ipython
API_KEY 발급 및 등록¶
Anthropic API Key는 https://console.anthropic.com/settings/keys 페이지에서 발급받으실 수 있습니다.
발급받으신 api key를 복사하여 .env
파일에 ANTHROPIC_API_KEY
환경변수로서 등록해주세요.
.env
파일¶OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-api03-...
settings
에서도 환경변수 참조를 위해 ANTHROPIC_API_KEY
설정을 추가합니다.
mysite/settings.py
파일에 추가¶# Anthropic API Key
# default 값을 지정하지 않았기에 지정 환경변수가 없더라도 예외가 발생하지 않습니다.
ANTHROPIC_API_KEY = env.str("ANTHROPIC_API_KEY", default=None)
model 인자에 따른 API 호출 분기¶
chat/llm.py
파일의 LLM
클래스에서 model
인자에 따라 API 호출을 분기하여 응답을 생성합니다.
chat/llm.py
파일 덮어쓰기
chat/llm.py
파일¶ 1from typing import Dict, List, Optional, Literal, Union, cast
2
3from anthropic.types import ModelParam as AnthropicModelParam
4from django.conf import settings
5from anthropic import Anthropic
6from openai import OpenAI
7from openai.types import ChatModel as OpenAIChatModel
8from typing_extensions import TypeAlias
9
10# https://platform.openai.com/docs/models
11openai_client = OpenAI(api_key=settings.OPENAI_API_KEY)
12
13# https://docs.anthropic.com/en/docs/about-claude/models/all-models
14anthropic_client = Anthropic(api_key=settings.ANTHROPIC_API_KEY)
15
16# LLM Model Types
17LLMModelParams: TypeAlias = Union[str, AnthropicModelParam, OpenAIChatModel]
18
19
20class LLM:
21 def __init__(
22 self,
23 model: LLMModelParams = "gpt-4o-mini",
24 temperature: float = 0.2,
25 max_tokens: int = 1000,
26 system_prompt: str = "",
27 initial_messages: Optional[List[Dict]] = None,
28 ):
29 self.model = model
30 self.temperature = temperature
31 self.max_tokens = max_tokens
32 self.system_prompt = system_prompt
33 self.history = initial_messages or []
34
35 def make_reply(
36 self,
37 human_message: Optional[str] = None,
38 model: Optional[LLMModelParams] = None,
39 ):
40 current_messages = [*self.history]
41 current_model = model or self.model
42
43 if human_message is not None:
44 current_messages.append({"role": "user", "content": human_message})
45
46 try:
47 if "claude" in current_model.lower():
48 response = anthropic_client.messages.create(
49 model=cast(AnthropicModelParam, current_model),
50 system=self.system_prompt,
51 messages=current_messages,
52 temperature=self.temperature,
53 max_tokens=self.max_tokens,
54 )
55 ai_message = response.content[0].text
56 else:
57 response = openai_client.chat.completions.create(
58 model=cast(OpenAIChatModel, current_model),
59 messages=[
60 {
61 "role": "system",
62 "content": self.system_prompt,
63 },
64 ]
65 + current_messages,
66 temperature=self.temperature,
67 max_tokens=self.max_tokens,
68 )
69 ai_message = response.choices[0].message.content
70 except Exception as e:
71 return f"API 호출에서 오류가 발생했습니다: {str(e)}"
72 else:
73 self.history.extend(
74 [
75 {"role": "user", "content": human_message},
76 {"role": "assistant", "content": ai_message},
77 ]
78 )
79 return ai_message
LLM 인스턴스 생성 시에 anthropic 모델 지정¶
이제 chat/models.py
파일에서 LLM
인스턴스 생성 시에 모델을 claude-3-7-sonnet-latest
로 변경하면 Claude API를 호출하여 응답을 생성합니다.
anthropic에서 지원하는 모델은 https://docs.anthropic.com/en/docs/about-claude/models/all-models 공식문서에서 확인하실 수 있습니다.
chat/models.py
파일 중 일부¶1llm = LLM(
2 # model="gpt-4o-mini",
3 # model="claude-3-7-sonnet-20250219",
4 model="claude-3-7-sonnet-latest",
5 temperature=1,
6 system_prompt=system_prompt,
7 initial_messages=messages,
8)