LangChain使用方法以OpenAI 的聊天模型GPT-4o为例
本文介绍了如何使用OpenAI聊天模型(如GPT-4)的完整流程。首先需安装langchain-openai包并设置API密钥。初始化模型时可配置温度、最大令牌数等参数。支持同步/异步调用、流式响应、工具调用(如天气查询)和图像输入。还能管理对话状态、获取结构化输出(JSON/Pydantic模型)和令牌使用情况。兼容OpenAI API的第三方服务,通过extra_body传递自定义参数。文章全
·
以使用 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 ChatOpenAI
llm = 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的基础URL
openai_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的基础URL
openai_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, Field
class 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, Field
class 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的基础URL
openai_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. 对话状态管理
- 维护对话状态,确保对话连贯性。
first_response = llm.invoke(messages)
messages.append({"role": "assistant", "content": first_response.content})
messages.append({"role": "user", "content": "What is my name?"})
second_response = llm.invoke(messages)
完整代码:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from pydantic import BaseModel, Field
class GetWeather(BaseModel):
location: str = Field(..., description="The city and state, e.g. San Francisco, CA")
# 使用LangChain调用DeepSeek模型
llm = ChatOpenAI(
model="gtp-4o", # 使用完整的模型名称
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
api_key="******",
base_url="https://openrouter.ai/api/v1", # 添加OpenRouter的基础URL
openai_api_base="https://openrouter.ai/api/v1", # 有些版本可能需要这个参数
)
messages = []
try:
content = ""
for chunk in llm.stream("你好!"):
content += chunk.text()
print(chunk.text(), end="")
for _ in range(100):
messages.append({"role": "assistant", "content": content})
print()
messages.append({"role": "user", "content": input("请提问:")})
# response = llm.invoke(messages)
content = ""
for chunk in llm.stream(messages):
content += chunk.text()
print(chunk.text(), end="")
except Exception as e:
print(f"发生错误: {e}")
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 httpx
image_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 的聊天模型,包括环境设置、参数配置、调用方法、工具集成、响应处理等。
更多推荐
所有评论(0)