Skip to content

OpenAI 模型集成

OpenAI 是 LangChain 支持的主要模型提供商之一,提供了多种强大的语言模型,如 GPT-3.5、GPT-4 等。本节将详细介绍如何在 LangChain 中集成 OpenAI 的各种模型。

安装依赖

首先,需要安装 OpenAI 相关的依赖包:

bash
pip install langchain-openai

配置 API 密钥

使用 OpenAI 模型需要配置 API 密钥。可以通过以下方式设置:

  1. 环境变量:设置 OPENAI_API_KEY 环境变量
  2. 直接传递:在初始化模型时直接传递 API 密钥

示例:设置环境变量

bash
# Linux/Mac
export OPENAI_API_KEY="your-api-key"

# Windows
set OPENAI_API_KEY=your-api-key

语言模型(LLMs)

OpenAI 的语言模型是最基本的模型类型,接受文本输入并生成文本输出。

初始化语言模型

python
from langchain_openai import OpenAI

# 方式 1:使用环境变量中的 API 密钥
llm = OpenAI()

# 方式 2:直接传递 API 密钥
llm = OpenAI(api_key="your-api-key")

# 配置模型参数
llm = OpenAI(
    model_name="gpt-3.5-turbo-instruct",  # 模型名称
    temperature=0.7,  # 温度参数,控制输出的随机性
    max_tokens=1000,  # 最大生成 tokens 数
    top_p=1.0,  # 控制生成的多样性
    frequency_penalty=0.0,  # 频率惩罚
    presence_penalty=0.0  # 存在惩罚
)

使用语言模型

python
# 生成文本
response = llm("What is LangChain?")
print(response)

# 批量生成
responses = llm.generate(["What is LangChain?", "How to use LangChain?"])
for i, result in enumerate(responses.generations):
    print(f"Response {i+1}: {result[0].text}")

聊天模型(Chat Models)

聊天模型专门用于对话场景,接受消息列表作为输入并生成消息作为输出。

初始化聊天模型

python
from langchain_openai import ChatOpenAI

# 方式 1:使用环境变量中的 API 密钥
chat_model = ChatOpenAI()

# 方式 2:直接传递 API 密钥
chat_model = ChatOpenAI(api_key="your-api-key")

# 配置模型参数
chat_model = ChatOpenAI(
    model_name="gpt-4",  # 模型名称
    temperature=0.7,  # 温度参数
    max_tokens=1000,  # 最大生成 tokens 数
    top_p=1.0,  # 控制生成的多样性
    frequency_penalty=0.0,  # 频率惩罚
    presence_penalty=0.0  # 存在惩罚
)

使用聊天模型

python
from langchain.schema import HumanMessage, SystemMessage, AIMessage

# 发送消息
messages = [
    SystemMessage(content="You are a helpful assistant"),
    HumanMessage(content="What is LangChain?"),
    AIMessage(content="LangChain is a framework for building LLM applications."),
    HumanMessage(content="Can you give me an example?")
]

response = chat_model(messages)
print(response.content)

# 批量生成
responses = chat_model.generate([
    [
        SystemMessage(content="You are a helpful assistant"),
        HumanMessage(content="What is LangChain?")
    ],
    [
        SystemMessage(content="You are a helpful assistant"),
        HumanMessage(content="How to use LangChain?")
    ]
])

for i, result in enumerate(responses.generations):
    print(f"Response {i+1}: {result[0].text}")

嵌入模型(Embedding Models)

嵌入模型用于将文本转换为向量表示,常用于语义搜索和知识检索。

初始化嵌入模型

python
from langchain_openai import OpenAIEmbeddings

# 方式 1:使用环境变量中的 API 密钥
embeddings = OpenAIEmbeddings()

# 方式 2:直接传递 API 密钥
embeddings = OpenAIEmbeddings(api_key="your-api-key")

# 配置模型参数
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-small",  # 模型名称
    chunk_size=1000  # 批处理大小
)

使用嵌入模型

python
# 生成单个文本的嵌入
text = "LangChain is a framework for building LLM applications"
embedding = embeddings.embed_query(text)
print(f"Embedding vector length: {len(embedding)}")
print(f"First 10 values: {embedding[:10]}")

# 生成多个文本的嵌入
texts = [
    "LangChain is a framework for building LLM applications",
    "OpenAI provides powerful language models",
    "Embeddings are used for semantic search"
]
embeddings_list = embeddings.embed_documents(texts)
for i, emb in enumerate(embeddings_list):
    print(f"Embedding {i+1} length: {len(emb)}")

流式输出

OpenAI 模型支持流式输出,可以实时获取生成的文本。

语言模型的流式输出

python
from langchain_openai import OpenAI

# 初始化语言模型
llm = OpenAI()

# 流式输出
for chunk in llm.stream("Write a short story about a robot learning to paint."):
    print(chunk, end="", flush=True)

聊天模型的流式输出

python
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

# 初始化聊天模型
chat_model = ChatOpenAI()

# 流式输出
messages = [
    SystemMessage(content="You are a helpful assistant"),
    HumanMessage(content="Write a short story about a robot learning to paint.")
]

for chunk in chat_model.stream(messages):
    print(chunk.content, end="", flush=True)

函数调用

OpenAI 的某些模型(如 GPT-4)支持函数调用,可以让模型根据需要调用外部函数。

示例:使用函数调用

python
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage, FunctionMessage
from langchain.tools import BaseTool
from typing import Optional, Type
from pydantic import BaseModel, Field

# 定义工具输入模式
class WeatherInput(BaseModel):
    location: str = Field(description="城市名称")

# 创建自定义工具
class WeatherTool(BaseTool):
    name = "get_weather"
    description = "获取指定城市的天气信息"
    args_schema: Type[BaseModel] = WeatherInput

    def _run(self, location: str) -> str:
        # 模拟天气 API 调用
        return f"{location} 的当前温度是 25°C,天气晴朗"

# 初始化聊天模型
chat_model = ChatOpenAI(model_name="gpt-4")

# 定义工具
weather_tool = WeatherTool()
tools = [weather_tool]

# 定义工具模式
工具模式 = [
    {
        "type": "function",
        "function": {
            "name": weather_tool.name,
            "description": weather_tool.description,
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市名称"
                    }
                },
                "required": ["location"]
            }
        }
    }
]

# 发送消息
messages = [
    SystemMessage(content="You are a helpful assistant. Use the get_weather tool to get weather information when needed."),
    HumanMessage(content="北京的天气怎么样?")
]

# 获取模型响应
response = chat_model(messages, tools=工具模式)
print("Model response:", response)

# 处理函数调用
if response.additional_kwargs.get("tool_calls"):
    tool_call = response.additional_kwargs["tool_calls"][0]
    location = tool_call["function"]["arguments"]
    import json
    location = json.loads(location)["location"]
    
    # 调用工具
    tool_result = weather_tool.run(location)
    print("Tool result:", tool_result)
    
    # 发送工具结果给模型
    messages.append(response)
    messages.append(FunctionMessage(content=tool_result, name=tool_call["function"]["name"]))
    
    # 获取最终响应
    final_response = chat_model(messages)
    print("Final response:", final_response.content)

总结

OpenAI 提供了多种强大的语言模型,LangChain 提供了简洁的接口来集成这些模型。通过本文的介绍,您应该已经了解了如何在 LangChain 中使用 OpenAI 的语言模型、聊天模型和嵌入模型,以及如何使用流式输出和函数调用等高级功能。

在实际应用中,您可以根据具体需求选择合适的模型和参数,构建功能强大的 LLM 应用。