이 가이드는 Anthropic (Claude) chat models 시작하기에 대한 간단한 개요를 제공합니다.Anthropic의 최신 모델, 비용, context window, 지원되는 입력 타입에 대한 정보는 Claude 문서에서 확인할 수 있습니다.
API Reference모든 기능과 구성 옵션에 대한 자세한 문서는 ChatAnthropic API reference를 참조하세요.
AWS Bedrock과 Google VertexAI특정 Anthropic 모델은 AWS Bedrock과 Google VertexAI를 통해서도 액세스할 수 있습니다. 이러한 서비스를 통해 Anthropic 모델을 사용하려면 ChatBedrock 및 ChatVertexAI integration을 참조하세요.
messages = [ ( "system", "You are a helpful assistant that translates English to French. Translate the user sentence.", ), ("human", "I love programming."),]ai_msg = model.invoke(messages)ai_msg
tool, extended thinking 및 기타 기능을 사용할 때, 단일 Anthropic AIMessage의 content는 단일 문자열이거나 content block 목록일 수 있습니다. 예를 들어, Anthropic 모델이 tool을 호출할 때, tool invocation은 message content의 일부입니다(표준화된 AIMessage.tool_calls에도 노출됨):
Copy
from langchain_anthropic import ChatAnthropicfrom typing_extensions import Annotatedmodel = ChatAnthropic(model="claude-3-5-haiku-latest")def get_weather( location: Annotated[str, ..., "Location as city and state."]) -> str: """Get the weather at a location.""" return "It's sunny."model_with_tools = model.bind_tools([get_weather])response = model_with_tools.invoke("Which city is hotter today: LA or NY?")response.content
Copy
[{'text': "I'll help you compare the temperatures of Los Angeles and New York by checking their current weather. I'll retrieve the weather for both cities.", 'type': 'text'}, {'id': 'toolu_01CkMaXrgmsNjTso7so94RJq', 'input': {'location': 'Los Angeles, CA'}, 'name': 'get_weather', 'type': 'tool_use'}, {'id': 'toolu_01SKaTBk9wHjsBTw5mrPVSQf', 'input': {'location': 'New York, NY'}, 'name': 'get_weather', 'type': 'tool_use'}]
content_blocks를 사용하면 provider 간에 일관된 표준 형식으로 content가 렌더링됩니다:
Copy
response.content_blocks
Copy
[{'type': 'text', 'text': "I'll help you compare the temperatures of Los Angeles and New York by checking their current weather. I'll retrieve the weather for both cities."}, {'type': 'tool_call', 'name': 'get_weather', 'args': {'location': 'Los Angeles, CA'}, 'id': 'toolu_01CkMaXrgmsNjTso7so94RJq'}, {'type': 'tool_call', 'name': 'get_weather', 'args': {'location': 'New York, NY'}, 'id': 'toolu_01SKaTBk9wHjsBTw5mrPVSQf'}]
.tool_calls attribute를 사용하여 표준 형식으로 tool call에 특별히 액세스할 수도 있습니다:
Claude는 관리되는 Files API를 통한 파일 상호작용도 지원합니다. 아래 예제를 참조하세요.Files API는 Claude의 내장 code-execution tool과 함께 사용할 container에 파일을 업로드하는 데에도 사용할 수 있습니다. 자세한 내용은 아래 code execution 섹션을 참조하세요.
일부 Claude 모델은 extended thinking 기능을 지원하며, 최종 답변에 도달한 단계별 추론 과정을 출력합니다.적용 가능한 모델은 Anthropic 가이드 여기를 참조하세요.extended thinking을 사용하려면 ChatAnthropic을 초기화할 때 thinking parameter를 지정하세요. invocation 중에 kwarg로 전달할 수도 있습니다.이 기능을 사용하려면 token budget을 지정해야 합니다. 아래 사용 예제를 참조하세요:
Copy
import jsonfrom langchain_anthropic import ChatAnthropicmodel = ChatAnthropic( model="claude-sonnet-4-5", max_tokens=5000, thinking={"type": "enabled", "budget_tokens": 2000},)response = model.invoke("What is the cube root of 50.653?")print(json.dumps(response.content_blocks, indent=2))
Copy
[ { "type": "reasoning", "reasoning": "To find the cube root of 50.653, I need to find the value of $x$ such that $x^3 = 50.653$.\n\nI can try to estimate this first. \n$3^3 = 27$\n$4^3 = 64$\n\nSo the cube root of 50.653 will be somewhere between 3 and 4, but closer to 4.\n\nLet me try to compute this more precisely. I can use the cube root function:\n\ncube root of 50.653 = 50.653^(1/3)\n\nLet me calculate this:\n50.653^(1/3) \u2248 3.6998\n\nLet me verify:\n3.6998^3 \u2248 50.6533\n\nThat's very close to 50.653, so I'm confident that the cube root of 50.653 is approximately 3.6998.\n\nActually, let me compute this more precisely:\n50.653^(1/3) \u2248 3.69981\n\nLet me verify once more:\n3.69981^3 \u2248 50.652998\n\nThat's extremely close to 50.653, so I'll say that the cube root of 50.653 is approximately 3.69981.", "extras": {"signature": "ErUBCkYIBxgCIkB0UjV..."} }, { "text": "The cube root of 50.653 is approximately 3.6998.\n\nTo verify: 3.6998\u00b3 = 50.6530, which is very close to our original number.", "type": "text" }]
Anthropic은 message, tool definition, tool result, image 및 document를 포함한 prompt의 요소의 caching을 지원합니다. 이를 통해 대용량 문서, instruction, few-shot document 및 기타 데이터를 재사용하여 지연 시간과 비용을 줄일 수 있습니다.prompt의 요소에 caching을 활성화하려면 cache_control key를 사용하여 관련 content block을 표시하세요. 아래 예제를 참조하세요:
from langchain_anthropic import convert_to_anthropic_toolfrom langchain.tools import tool# For demonstration purposes, we artificially expand the# tool description.description = ( f"Get the weather at a location. By the way, check out this readme: {readme}")@tool(description=description)def get_weather(location: str) -> str: return "It's sunny."# Enable caching on the toolweather_tool = convert_to_anthropic_tool(get_weather) weather_tool["cache_control"] = {"type": "ephemeral"} model = ChatAnthropic(model="claude-3-7-sonnet-20250219")model_with_tools = model.bind_tools([weather_tool])query = "What's the weather in San Francisco?"response_1 = model_with_tools.invoke(query)response_2 = model_with_tools.invoke(query)usage_1 = response_1.usage_metadata["input_token_details"]usage_2 = response_2.usage_metadata["input_token_details"]print(f"First invocation:\n{usage_1}")print(f"\nSecond:\n{usage_2}")
Copy
First invocation:{'cache_read': 0, 'cache_creation': 1809}Second:{'cache_read': 1809, 'cache_creation': 0}
Incremental caching in conversational applications
Prompt caching은 multi-turn conversation에서 중복 처리 없이 이전 message의 context를 유지하는 데 사용할 수 있습니다.최종 message를 cache_control로 표시하여 incremental caching을 활성화할 수 있습니다. Claude는 후속 message에 대해 가장 긴 이전 캐시된 prefix를 자동으로 사용합니다.아래에서는 이 기능을 통합한 간단한 chatbot을 구현합니다. LangChain chatbot tutorial을 따르지만, 각 user message의 마지막 content block을 cache_control로 자동으로 표시하는 custom reducer를 추가합니다. 아래를 참조하세요:
Copy
import requestsfrom langchain_anthropic import ChatAnthropicfrom langgraph.checkpoint.memory import MemorySaverfrom langgraph.graph import START, StateGraph, add_messagesfrom typing_extensions import Annotated, TypedDictmodel = ChatAnthropic(model="claude-3-7-sonnet-20250219")# Pull LangChain readmeget_response = requests.get( "https://raw.githubusercontent.com/langchain-ai/langchain/master/README.md")readme = get_response.textdef messages_reducer(left: list, right: list) -> list: # Update last user message for i in range(len(right) - 1, -1, -1): if right[i].type == "human": right[i].content[-1]["cache_control"] = {"type": "ephemeral"} break return add_messages(left, right)class State(TypedDict): messages: Annotated[list, messages_reducer]workflow = StateGraph(state_schema=State)# Define the function that calls the modeldef call_model(state: State): response = model.invoke(state["messages"]) return {"messages": [response]}# Define the (single) node in the graphworkflow.add_edge(START, "model")workflow.add_node("model", call_model)# Add memorymemory = MemorySaver()app = workflow.compile(checkpointer=memory)
================================== Ai Message ==================================Hello, Bob! It's nice to meet you. How are you doing today? Is there something I can help you with?{'cache_read': 0, 'cache_creation': 0}
Copy
query = f"Check out this readme: {readme}"input_message = HumanMessage([{"type": "text", "text": query}])output = app.invoke({"messages": [input_message]}, config)output["messages"][-1].pretty_print()print(f"\n{output['messages'][-1].usage_metadata['input_token_details']}")
Copy
================================== Ai Message ==================================I can see you've shared the README from the LangChain GitHub repository. This is the documentation for LangChain, which is a popular framework for building applications powered by Large Language Models (LLMs). Here's a summary of what the README contains:LangChain is:- A framework for developing LLM-powered applications- Helps chain together components and integrations to simplify AI application development- Provides a standard interface for models, embeddings, vector stores, etc.Key features/benefits:- Real-time data augmentation (connect LLMs to diverse data sources)- Model interoperability (swap models easily as needed)- Large ecosystem of integrationsThe LangChain ecosystem includes:- LangSmith - For evaluations and observability- LangGraph - For building complex agents with customizable architecture- LangSmith - For deployment and scaling of agentsThe README also mentions installation instructions (`pip install -U langchain`) and links to various resources including tutorials, how-to guides, conceptual guides, and API references.Is there anything specific about LangChain you'd like to know more about, Bob?{'cache_read': 0, 'cache_creation': 1498}
Copy
query = "What was my name again?"input_message = HumanMessage([{"type": "text", "text": query}])output = app.invoke({"messages": [input_message]}, config)output["messages"][-1].pretty_print()print(f"\n{output['messages'][-1].usage_metadata['input_token_details']}")
Copy
================================== Ai Message ==================================Your name is Bob. You introduced yourself at the beginning of our conversation.{'cache_read': 1498, 'cache_creation': 269}
LangSmith trace에서 “raw output”을 토글하면 cache_control key를 포함하여 chat model에 전송되는 정확한 message가 표시됩니다.
Anthropic은 Claude가 사용자가 제공한 source document를 기반으로 답변에 context를 첨부할 수 있는 citations 기능을 지원합니다. "citations": {"enabled": True}가 포함된 document 또는 search result content block이 query에 포함되면 Claude는 response에서 citation을 생성할 수 있습니다.
from langchain_anthropic import ChatAnthropicmodel = ChatAnthropic(model="claude-3-5-haiku-latest")messages = [ { "role": "user", "content": [ { "type": "document", "source": { "type": "text", "media_type": "text/plain", "data": "The grass is green. The sky is blue.", }, "title": "My Document", "context": "This is a trustworthy document.", "citations": {"enabled": True}, }, {"type": "text", "text": "What color is the grass and sky?"}, ], }]response = model.invoke(messages)response.content
Copy
[{'text': 'Based on the document, ', 'type': 'text'}, {'text': 'the grass is green', 'type': 'text', 'citations': [{'type': 'char_location', 'cited_text': 'The grass is green. ', 'document_index': 0, 'document_title': 'My Document', 'start_char_index': 0, 'end_char_index': 20}]}, {'text': ', and ', 'type': 'text'}, {'text': 'the sky is blue', 'type': 'text', 'citations': [{'type': 'char_location', 'cited_text': 'The sky is blue.', 'document_index': 0, 'document_title': 'My Document', 'start_char_index': 20, 'end_char_index': 36}]}, {'text': '.', 'type': 'text'}]
Claude는 knowledge base 또는 기타 custom source에 대한 query의 인용 가능한 결과를 나타내는 search_result content block을 지원합니다. 이러한 content block은 claude에 top-line(위 예제와 같이)과 tool result 내에서 모두 전달될 수 있습니다. 이를 통해 Claude는 tool call의 결과를 사용하여 response의 요소를 인용할 수 있습니다.tool call에 대한 응답으로 search result를 전달하려면 Anthropic의 native format으로 search_result content block 목록을 반환하는 tool을 정의하세요. 예를 들어:
Copy
def retrieval_tool(query: str) -> list[dict]: """Access my knowledge base.""" # Run a search (e.g., with a LangChain vector store) results = vector_store.similarity_search(query=query, k=2) # Package results into search_result blocks return [ { "type": "search_result", # Customize fields as desired, using document metadata or otherwise "title": "My Document Title", "source": "Source description or provenance", "citations": {"enabled": True}, "content": [{"type": "text", "text": doc.page_content}], } for doc in results ]
LangGraph를 사용한 end to end 예제
여기서는 샘플 문서로 LangChain vector store를 채우고 해당 문서를 query하는 tool을 Claude에 장착하는 end-to-end 예제를 보여줍니다.
여기서 tool은 search query와 category string literal을 받지만, 유효한 모든 tool signature를 사용할 수 있습니다.
Copy
from typing import Literalfrom langchain.chat_models import init_chat_modelfrom langchain.embeddings import init_embeddingsfrom langchain_core.documents import Documentfrom langchain_core.vectorstores import InMemoryVectorStorefrom langgraph.checkpoint.memory import InMemorySaverfrom langchain.agents import create_agent# Set up vector storeembeddings = init_embeddings("openai:text-embedding-3-small")vector_store = InMemoryVectorStore(embeddings)document_1 = Document( id="1", page_content=( "To request vacation days, submit a leave request form through the " "HR portal. Approval will be sent by email." ), metadata={ "category": "HR Policy", "doc_title": "Leave Policy", "provenance": "Leave Policy - page 1", },)document_2 = Document( id="2", page_content="Managers will review vacation requests within 3 business days.", metadata={ "category": "HR Policy", "doc_title": "Leave Policy", "provenance": "Leave Policy - page 2", },)document_3 = Document( id="3", page_content=( "Employees with over 6 months tenure are eligible for 20 paid vacation days " "per year." ), metadata={ "category": "Benefits Policy", "doc_title": "Benefits Guide 2025", "provenance": "Benefits Policy - page 1", },)documents = [document_1, document_2, document_3]vector_store.add_documents(documents=documents)# Define toolasync def retrieval_tool( query: str, category: Literal["HR Policy", "Benefits Policy"]) -> list[dict]: """Access my knowledge base.""" def _filter_function(doc: Document) -> bool: return doc.metadata.get("category") == category results = vector_store.similarity_search( query=query, k=2, filter=_filter_function ) return [ { "type": "search_result", "title": doc.metadata["doc_title"], "source": doc.metadata["provenance"], "citations": {"enabled": True}, "content": [{"type": "text", "text": doc.page_content}], } for doc in results ]# Create agentmodel = init_chat_model("anthropic:claude-3-5-haiku-latest")checkpointer = InMemorySaver()agent = create_agent(model, [retrieval_tool], checkpointer=checkpointer)# Invoke on a queryconfig = {"configurable": {"thread_id": "session_1"}}input_message = { "role": "user", "content": "How do I request vacation days?",}async for step in agent.astream( {"messages": [input_message]}, config, stream_mode="values",): step["messages"][-1].pretty_print()
Anthropic은 custom document type을 사용하여 자체 split을 지정할 수도 있습니다. LangChain text splitter를 사용하여 이 목적을 위한 의미 있는 split을 생성할 수 있습니다. 아래 예제를 참조하세요. 여기서는 LangChain README(markdown 문서)를 split하고 context로 Claude에 전달합니다:
Claude는 web search tool을 사용하여 검색을 실행하고 citation으로 response를 근거할 수 있습니다.
Web search tool은 langchain-anthropic>=0.3.13부터 지원됩니다
Copy
from langchain_anthropic import ChatAnthropicmodel = ChatAnthropic(model="claude-sonnet-4-5")tool = {"type": "web_search_20250305", "name": "web_search", "max_uses": 3}model_with_tools = model.bind_tools([tool])response = model_with_tools.invoke("How do I update a web app to TypeScript 5.5?")
from langchain_anthropic import ChatAnthropicmodel = ChatAnthropic( model="claude-sonnet-4-20250514", betas=["code-execution-2025-05-22"],)tool = {"type": "code_execution_20250522", "name": "code_execution"}model_with_tools = model.bind_tools([tool])response = model_with_tools.invoke( "Calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]")
Files API와 함께 사용
Files API를 사용하여 Claude는 데이터 분석 및 기타 목적으로 파일에 액세스하는 code를 작성할 수 있습니다. 아래 예제를 참조하세요:
Copy
# Upload fileimport anthropicclient = anthropic.Anthropic()file = client.beta.files.upload( file=open("/path/to/sample_data.csv", "rb"))file_id = file.id# Run inferencefrom langchain_anthropic import ChatAnthropicmodel = ChatAnthropic( model="claude-sonnet-4-20250514", betas=["code-execution-2025-05-22"],)tool = {"type": "code_execution_20250522", "name": "code_execution"}model_with_tools = model.bind_tools([tool])input_message = { "role": "user", "content": [ { "type": "text", "text": "Please plot these data and tell me what you see.", }, { "type": "container_upload", "file_id": file_id, }, ]}model_with_tools.invoke([input_message])
Claude는 code execution의 일부로 파일을 생성할 수 있습니다. Files API를 사용하여 이러한 파일에 액세스할 수 있습니다:
Copy
# Take all file outputs for demonstration purposesfile_ids = []for block in response.content: if block["type"] == "code_execution_tool_result": file_ids.extend( content["file_id"] for content in block.get("content", {}).get("content", []) if "file_id" in content )for i, file_id in enumerate(file_ids): file_content = client.beta.files.download(file_id) file_content.write_to_file(f"/path/to/file_{i}.png")
text editor tool은 텍스트 파일을 보고 수정하는 데 사용할 수 있습니다. 자세한 내용은 여기 문서를 참조하세요.
Copy
from langchain_anthropic import ChatAnthropicmodel = ChatAnthropic(model="claude-3-7-sonnet-20250219")tool = {"type": "text_editor_20250124", "name": "str_replace_editor"}model_with_tools = model.bind_tools([tool])response = model_with_tools.invoke( "There's a syntax error in my primes.py file. Can you help me fix it?")print(response.text)response.tool_calls
Copy
I'd be happy to help you fix the syntax error in your primes.py file. First, let's look at the current content of the file to identify the error.