> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sambanova.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# LangChain

本ガイドでは、LangChain を使用して SambaNova のモデルと連携する手順を、セットアップからインスタンス化、呼び出し、ストリーミング、チェーンの構築まで解説します。LangChain は、LLM (大規模言語モデル) を活用したアプリケーションを開発するためのソフトウェアフレームワークです。

## 前提条件

作業を始める前に、以下の環境を準備してください。

* [SambaCloud](https://cloud.sambanova.ai/?utm_source=langchain\&utm_medium=external\&utm_campaign=cloud_signup) のアカウントと API キー。[API キーと URL](/docs/ja/get-started/api-keys-urls) をご参照ください。
* Python 3.10 以上。`langchain-sambanova` のバージョン 1.x は Python 3.10 以上を必要とします。Python 3.9 では、pip はエラーを報告する代わりに、はるかに古い 0.2.0 リリースをインストールしてしまいます。

## セットアップ

ChatSambaNova モデルを使用するには、以下の手順を実行してください。

1. [SambaCloud](https://cloud.sambanova.ai/?utm_source=langchain\&utm_medium=external\&utm_campaign=cloud_signup) のアカウントを作成し、API キーを取得します。
2. 以下のコマンドを実行して、連携パッケージ `langchain-sambanova` をインストールします。

```bash theme={}
pip install "langchain-sambanova>=1.1,<2"
```

<Note>
  バージョンの範囲指定は残してください。リリース 1.0.0 では `ChatSambaNovaCloud` クラスと `ChatSambaStudio` クラスが削除されており、このパッケージは破壊的変更を含むメジャーリリースを実際に出しています。範囲を指定しない `pip install langchain-sambanova` では、本ページの例が動作しなくなる将来のメジャーバージョンを取得してしまう可能性があります。
</Note>

インストールしたバージョンを確認します。

```bash theme={}
python -c "import langchain_sambanova; print(langchain_sambanova.__version__)"
```

以下のような出力が表示されるはずです。

```text theme={}
# Expected output
1.1.1
```

## 認証情報の設定

[cloud.sambanova.ai](https://cloud.sambanova.ai/apis) で取得した API キーを環境変数として登録します。`ChatSambaNova` は `SAMBANOVA_API_KEY` を自動的に読み取るため、コード内でキーを渡す必要はありません。

```bash theme={}
export SAMBANOVA_API_KEY="your-sambanova-api-key"
```

Python セッションやノートブックの中からキーを設定する場合は、ソースコードにハードコードする代わりに、実行時に入力を求めるようにします。

```python theme={}
import getpass
import os

os.environ["SAMBANOVA_API_KEY"] = getpass.getpass("SambaNova API key: ")
```

<Note>
  SambaCloud ユーザーに必要なのは API キーのみです。リクエストはデフォルトで `https://api.sambanova.ai/v1` に送信されます。SambaStack ユーザーは、これに加えて `SAMBANOVA_API_BASE` にデプロイメントの URL を設定するか、`ChatSambaNova` に `base_url` を渡します。
</Note>

## モデルのインスタンス化

以下の例のように、ChatSambaNova モデルオブジェクトをインスタンス化し、chat completion を生成できます。

以下は、Meta 社の Llama 3.3 70B 向けに構成した ChatSambaNova モデルオブジェクトを作成する例です。

```python theme={}
from langchain_sambanova import ChatSambaNova

llm = ChatSambaNova(
    model="Meta-Llama-3.3-70B-Instruct",
    max_tokens=1024,
    temperature=0.7,
    top_p=0.01,
)
```

<Note>
  SambaCloud が現在提供している任意のモデル ID を指定できます。モデルカタログは随時変更されるため、[SambaCloud モデル](/docs/ja/models/sambacloud-models) で ID を確認するか、`curl https://api.sambanova.ai/v1/models` で直接一覧を取得してください。
</Note>

## モデルの呼び出し

システムプロンプトとユーザーメッセージをモデルに渡します。

```python theme={}
messages = [
    (
        "system",
        "You are a helpful assistant that translates English to French. "
        "Translate the user sentence.",
    ),
    ("human", "I love programming."),
]
ai_msg = llm.invoke(messages)
print(ai_msg.content)
```

以下のような出力が表示されるはずです。

```text theme={}
# Expected output
J'adore la programmation.
```

## ストリーミング

モデルが生成したトークンを逐次表示するには、`invoke()` の代わりに `stream()` を呼び出し、各チャンクの `content` を出力します。各チャンクは `AIMessageChunk` であり、それぞれの `content` の値を連結すると完全な応答が再現されます。

```python theme={}
for chunk in llm.stream(messages):
    print(chunk.content, end="", flush=True)
```

以下のような出力が、一度にまとめてではなく少しずつ表示されるはずです。

```text theme={}
# Expected output
J'adore la programmation.
```

## チェーンの構築

プロンプトテンプレートとモデルを組み合わせてチェーンを構築し、翻訳先の言語を動的に扱えるようにします。

```python theme={}
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate(
    [
        (
            "system",
            "You are a helpful assistant that translates {input_language} "
            "to {output_language}.",
        ),
        ("human", "{input}"),
    ]
)

chain = prompt | llm
response = chain.invoke(
    {
        "input_language": "English",
        "output_language": "German",
        "input": "I love programming.",
    }
)
print(response.content)
```

以下のような出力が表示されるはずです。

```text theme={}
# Expected output
Ich liebe das Programmieren.
```

## ツール呼び出し

`bind_tools` を使って Python 関数をモデルにバインドします。LangChain は各関数のシグネチャと docstring を JSON Schema に変換し、リクエストの `tools` フィールドで送信します。つまり、その関数をいつ呼び出すべきかをモデルに伝えるのは docstring です。

```python theme={}
from langchain_core.tools import tool


@tool
def get_weather(city: str) -> str:
    """Return the current weather for a city."""
    return f"It is sunny in {city}."


llm_with_tools = llm.bind_tools([get_weather])
response = llm_with_tools.invoke("What is the weather in Palo Alto?")
print(response.tool_calls)
```

以下のような出力が表示されるはずです。

```text theme={}
# Expected output
[{'name': 'get_weather', 'args': {'city': 'Palo Alto'}, 'id': 'call_1', 'type': 'tool_call'}]
```

モデルが返すのは、実行してほしい呼び出しであって、その実行結果ではありません。関数を実行して出力をモデルに戻すのは呼び出し側のコードの役割です。

```python theme={}
from langchain_core.messages import HumanMessage

messages = [HumanMessage("What is the weather in Palo Alto?")]
messages.append(response)

for call in response.tool_calls:
    result = get_weather.invoke(call)
    messages.append(result)

print(llm_with_tools.invoke(messages).content)
```

モデルがツールを呼び出さずに直接回答した場合、`response.tool_calls` は空になります。呼び出しが行われた前提で処理せず、`response.tool_calls` の有無で分岐してください。

<Note>
  ツール呼び出しには、対応するモデルが必要です。現在の対応モデル一覧は [Function calling](/docs/ja/features/function-calling) をご参照ください。`Meta-Llama-3.3-70B-Instruct` は対応していますが、`gemma-4-31B-it` は非対応です。非対応モデルでは、リクエストは通常のテキスト回答を返すだけで、ツールが無視されたことを示すエラーは発生しません。
</Note>

## 構造化出力

`with_structured_output` を使用すると、テキストの代わりに検証済みの Pydantic オブジェクトを取得できます。この機能はツール呼び出しを使用しません。スキーマを `type: json_schema` の `response_format` として送信し、応答をモデルクラスにパースするため、Function calling ではなく[構造化出力のサポート](/docs/ja/features/function-calling)に依存します。

```python theme={}
from typing import Literal, Optional

from pydantic import BaseModel, Field


class Ticket(BaseModel):
    """A support ticket extracted from a message."""

    title: str = Field(description="One-line summary")
    priority: Literal["low", "medium", "high"] = Field(description="Urgency")
    owner: Optional[str] = Field(default=None, description="Assignee if named")


structured_llm = llm.with_structured_output(Ticket)
ticket = structured_llm.invoke("Ada needs the quarterly review finished, it is urgent.")
print(ticket)
```

以下のような出力が表示されるはずです。

```text theme={}
# Expected output
title='Quarterly review' priority='high' owner='Ada'
```

結果は正真正銘の `Ticket` インスタンスであるため、`ticket.priority` は型付けされ、`Literal` の範囲外の値はコードに渡る前に拒否されます。フィールドの説明 (description) はスキーマの一部として送信されるため、丁寧に書く価値があります。

## トラブルシューティング

<AccordionGroup>
  <Accordion title="SambaNovaError: The api_key client option must be set">
    スクリプトを実行する環境に環境変数が設定されていません。[認証情報の設定](#認証情報の設定) の手順どおりにエクスポートするか、`ChatSambaNova` に `api_key="..."` を渡してください。
  </Accordion>

  <Accordion title="AuthenticationError: Error code: 401 invalid_api_key">
    キーが誤っているか、失効しているか、余分な引用符や改行が混入しています。[cloud.sambanova.ai/apis](https://cloud.sambanova.ai/apis) で新しいキーを生成してください。
  </Accordion>

  <Accordion title="TypeError: object.__init__() takes exactly one argument with ChatSambaNovaCloud">
    `ChatSambaNovaCloud` は `langchain-sambanova` 1.0.0 で削除され、現在は引数を受け取らない空の非推奨スタブになっています。[モデルのインスタンス化](#モデルのインスタンス化) のとおり、代わりに `ChatSambaNova` を使用してください。
  </Accordion>

  <Accordion title="ImportError: cannot import name 'ChatSambaNova' from 'langchain_sambanova'">
    `ChatSambaNovaCloud` のみを提供していた 0.1.x を使用しています。`pip install -U "langchain-sambanova>=1.1,<2"` でアップグレードしてください。
  </Accordion>

  <Accordion title="最新リリースを指定しても pip が 0.2.0 をインストールする">
    Python 3.9 以前を使用しています。バージョン 1.x は Python 3.10 以上を必要とします。Python をアップグレードしてから再インストールしてください。
  </Accordion>

  <Accordion title="SAMBANOVA_URL が無視されているように見える">
    バージョン 1.x はベース URL を `SAMBANOVA_API_BASE` から読み取ります。`SAMBANOVA_URL` は 0.1.x の環境変数で、現在は効果がありません。
  </Accordion>

  <Accordion title="RateLimitError: Error code: 429 rate limit exceeded">
    ティアで許可されているリクエスト数を超過しました。間隔を空けて再試行するか、同時実行数を減らしてください。適用される制限は [レート制限](/docs/ja/models/rate-limits) をご参照ください。
  </Accordion>

  <Accordion title="OutputParserException: Invalid json output from with_structured_output">
    応答がスキーマに対して有効な JSON ではありませんでした。これは構造化出力に対応していないモデルで発生します。[Function calling](/docs/ja/features/function-calling) でモデルの対応状況を確認し、深くネストしたスキーマは簡素化してください。
  </Accordion>

  <Accordion title="response.tool_calls が空で、モデルが文章で回答する">
    モデルがツールを呼び出さないことを選択したか、ツール呼び出しに対応していません。[Function calling](/docs/ja/features/function-calling) で対応状況を確認し、ツールをいつ使うべきかを docstring に明確に記述してください。
  </Accordion>
</AccordionGroup>

## 参考情報

詳細については、以下のリソースをご参照ください。

* [ChatSambaNova ドキュメント](https://docs.langchain.com/oss/python/integrations/chat/sambanova)
* [SambaNova-LangChain ドキュメント](https://docs.langchain.com/oss/python/integrations/providers/sambanova)
* [LangChain 公式ドキュメント](https://docs.langchain.com/oss/python/langchain/overview)
* [LangChain と SambaNova を使用したエンドツーエンドのコード例](https://github.com/sambanova/ai-starter-kit)
* [SambaNovaEmbeddings ドキュメント](https://docs.langchain.com/oss/python/integrations/embeddings/sambanova)。Embedding モデルは SambaCloud ではなく SambaStack 上で動作します。[Embedding (埋め込み) 機能の実装](/docs/ja/features/embeddings) をご参照ください。
