以使用 OpenAI 的聊天模型(如 GPT-4)為例,從設置環境、初始化模型、調用模型到處理響應的各個方面進行介紹:
1. 環境設置
- 安裝
langchain-openai
包。 - 設置環境變量
OPENAI_API_KEY
,用于認證(以linux為例,windows也可以手動添加環境變量)
pip install -U langchain-openai
export OPENAI_API_KEY="your-api-key"
2. 初始化參數
- 模型參數:如模型名稱、溫度(temperature)、最大生成令牌數(max_tokens)等。
- 客戶端參數:如請求超時時間(timeout)、最大重試次數(max_retries)、API 密鑰(api_key)等。
from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-4o",temperature=0,max_tokens=None,timeout=None,max_retries=2,# api_key="...",# base_url="...",# organization="...",# other params...
)
3. 調用模型
- 通過
invoke
方法調用模型,傳入對話消息。 - 支持同步和異步調用。
messages = [("system", "You are a helpful translator. Translate the user sentence to French."),("human", "I love programming."),
]
response = llm.invoke(messages)
print(response.content)
完整代碼:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage# 使用LangChain調用DeepSeek模型
llm = ChatOpenAI(model="gpt-4o", # 使用完整的模型名稱temperature=0,max_tokens=None,timeout=None,max_retries=2,api_key="******",base_url="https://openrouter.ai/api/v1", # 添加OpenRouter的基礎URLopenai_api_base="https://openrouter.ai/api/v1", # 有些版本可能需要這個參數
)
# 創建消息列表 - 使用LangChain的消息格式
messages = [SystemMessage(content="你是一個有幫助的助手,請用中文回答用戶的問題。"),HumanMessage(content="今天天氣如何?")
]try:response = llm.invoke(messages)print(response.content)
except Exception as e:print(f"發生錯誤: {e}")
4. 流式響應
- 使用
stream
方法獲取流式響應,逐步處理生成的文本。
for chunk in llm.stream(messages):print(chunk.text(), end="")
完整代碼:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage# 使用LangChain調用DeepSeek模型
llm = ChatOpenAI(model="gpt-4o", # 使用完整的模型名稱temperature=0,max_tokens=None,timeout=None,max_retries=2,api_key="******",base_url="https://openrouter.ai/api/v1", # 添加OpenRouter的基礎URLopenai_api_base="https://openrouter.ai/api/v1", # 有些版本可能需要這個參數
)
# 創建消息列表 - 使用LangChain的消息格式
messages = [SystemMessage(content="你是一個有幫助的助手,請用中文回答用戶的問題。"),HumanMessage(content="今天天氣如何?")
]try:for chunk in llm.stream(messages):print(chunk.text(), end="")
except Exception as e:print(f"發生錯誤: {e}")
5. 異步調用
- 支持異步調用,適用于需要非阻塞操作的場景。
await llm.ainvoke(messages)
6. 工具調用
- 可以綁定工具(如天氣查詢、人口查詢等),模型會自動調用這些工具。
from pydantic import BaseModel, Fieldclass GetWeather(BaseModel):location: str = Field(..., description="The city and state, e.g. San Francisco, CA")llm_with_tools = llm.bind_tools([GetWeather])
response = llm_with_tools.invoke("What is the weather in LA?")
完整代碼:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from pydantic import BaseModel, Fieldclass GetWeather(BaseModel):location: str = Field(..., description="The city and state, e.g. San Francisco, CA")# 使用LangChain調用DeepSeek模型
llm = ChatOpenAI(model="gpt-4o", # 使用完整的模型名稱temperature=0,max_tokens=None,timeout=None,max_retries=2,api_key="******",base_url="https://openrouter.ai/api/v1", # 添加OpenRouter的基礎URLopenai_api_base="https://openrouter.ai/api/v1", # 有些版本可能需要這個參數
)llm_with_tools = llm.bind_tools([GetWeather])# 創建消息列表 - 使用LangChain的消息格式
messages = [SystemMessage(content="你是一個有幫助的助手,請用中文回答用戶的問題。"),HumanMessage(content="北京,今天天氣如何?")
]try:for chunk in llm_with_tools.stream(messages):print(chunk.text(), end="")
except Exception as e:print(f"發生錯誤: {e}")
7. 內置工具
- 使用 OpenAI 的內置工具,如搜索、文檔解析等。
tool = {"type": "web_search"}
llm_with_tools = llm.bind_tools([tool])
response = llm_with_tools.invoke("What was a positive news story from today?")
8. 對話狀態管理
- 通過
previous_response_id
維護對話狀態,確保對話連貫性。
response = llm.invoke("Hi, I'm Bob.")
second_response = llm.invoke("What is my name?", previous_response_id=response.response_metadata["id"])
9. 結構化輸出
- 可以指定輸出格式為特定的 Pydantic 模型。
class Joke(BaseModel):setup: str = Field(description="The setup of the joke")punchline: str = Field(description="The punchline to the joke")structured_llm = llm.with_structured_output(Joke)
response = structured_llm.invoke("Tell me a joke about cats")
10. JSON 模式
- 指定響應格式為 JSON 對象。
json_llm = llm.bind(response_format={"type": "json_object"})
response = json_llm.invoke("Return a JSON object with key 'random_ints' and a value of 10 random ints in [0-99]")
11. 圖像輸入
- 支持將圖像作為輸入,模型可以處理圖像內容。
import base64
import httpximage_url = "https://example.com/image.jpg"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
message = HumanMessage(content=[{"type": "text", "text": "describe the weather in this image"},{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_data}"}},]
)
response = llm.invoke([message])
12. 令牌使用
- 獲取每次調用的令牌使用情況,包括輸入、輸出和總令牌數。
response = llm.invoke(messages)
print(response.usage_metadata)
13. 日志概率
- 獲取生成文本的日志概率信息。
logprobs_llm = llm.bind(logprobs=True)
response = logprobs_llm.invoke(messages)
print(response.response_metadata["logprobs"])
14. 響應元數據
- 獲取響應的元數據,包括模型名稱、完成原因等。
response = llm.invoke(messages)
print(response.response_metadata)
15. 靈活處理
- 使用 OpenAI 的靈活處理(flex processing)服務,適用于非關鍵任務。
llm = ChatOpenAI(model="o4-mini", service_tier="flex")
16. OpenAI 兼容 API
- 支持與 OpenAI 兼容的 API(如 LM Studio、vLLM 等),通過
extra_body
參數傳遞特定參數。
llm = ChatOpenAI(base_url="http://localhost:8000/v1",api_key="EMPTY",model="meta-llama/Llama-2-7b-chat-hf",extra_body={"use_beam_search": True, "best_of": 4},
)
17. 參數選擇
- 使用
model_kwargs
傳遞標準 OpenAI 參數。 - 使用
extra_body
傳遞特定于兼容 API 的自定義參數。
18. 提示緩存優化
- 使用
prompt_cache_key
參數優化緩存命中率,減少成本。
response = llm.invoke(messages, prompt_cache_key="example-key-a")
總結
本位提供了非常全面的指導,幫助開發者快速集成和使用 OpenAI 的聊天模型,包括環境設置、參數配置、調用方法、工具集成、響應處理等。