大模型调用方式汇总

**调用方式**

一、ChatOpenAI

1.确保服务已启动

确保你的本地服务已启动 OpenAI 兼容接口(FastChat 启动命令):

python -m fastchat.serve.openai_api_server --host 0.0.0.0 --port 9997

测试接口是否正常:

curl http://localhost:9997/v1/models

应返回类似结果:

{"object":"list","data":[{"id":"deepseek-7b","object":"model"}]}

2.使用 ChatOpenAI 调用(LangChain 方式)

安装依赖:
pip install langchain-openai

完整代码:

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# 初始化本地模型
llm = ChatOpenAI(
    base_url="http://localhost:9997/v1",
    model="deepseek-7b",
    api_key="EMPTY"
)

# 使用提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的AI助手,回答需简明扼要"),
    ("human", "{question}")
])

# 创建链式调用
chain = prompt | llm

# 执行调用
response = chain.invoke({"question": "解释 Transformer 架构"})
print(response.content)

二、openai库调用

安装依赖:
pip install openai
完整代码:
from openai import OpenAI

# 配置本地客户端
client = OpenAI(
    base_url="http://localhost:9997/v1",  # 本地服务地址
    api_key="EMPTY"                      # 任意非空字符串
)

# 调用聊天接口
response = client.chat.completions.create(
    model="deepseek-7b",
    messages=[{"role": "user", "content": "如何学习机器学习?"}],
    temperature=0.7,
    stream=True  # 支持流式输出
)

# 处理响应(流式)
for chunk in response:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

三、使用 FastChat 直接对话(终端交互)

from fastchat.serve.cli import chat_loop

# 直接与模型对话(需先启动 model_worker)
chat_loop(
    model_path="./deepseek-llm-7b",  # 模型路径
    device="cuda",                  # 使用 GPU
    temperature=0.7
)

运行方式:启动后会进入交互式终端,直接输入问题即可。

四、使用 LangChain 集成

from langchain_community.llms import FastChat
from langchain.prompts import PromptTemplate

# 初始化 LangChain 适配的 FastChat
llm = FastChat(
    model_path="./deepseek-llm-7b",
    temperature=0.5,
    max_tokens=1024
)

# 使用模板提问
template = """你是一个AI助手。请回答:{question}"""
prompt = PromptTemplate.from_template(template)

response = llm(prompt.format(question="量子计算是什么?"))
print(response)

五、使用 transformers 直接加载模型

from transformers import AutoTokenizer, AutoModelForCausalLM

# 加载本地模型
tokenizer = AutoTokenizer.from_pretrained("./deepseek-llm-7b")
model = AutoModelForCausalLM.from_pretrained("./deepseek-llm-7b", device_map="auto")

# 生成文本
input_text = "解释一下深度学习"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

六、使用 vLLM 高性能推理(适合大批量请求)

from vllm import LLM, SamplingParams

# 初始化 vLLM
llm = LLM(model="./deepseek-llm-7b")

# 配置生成参数
sampling_params = SamplingParams(
    temperature=0.8,
    top_p=0.9,
    max_tokens=512
)

# 批量生成
inputs = ["如何学习Python?", "AI的未来发展方向是什么?"]
outputs = llm.generate(inputs, sampling_params)

for output in outputs:
    print(f"问题: {output.prompt}")
    print(f"回答: {output.outputs[0].text}\n")

七、使用 WebSocket 实时流式传输

# server.py (FastChat 已支持,启动时添加 --worker-address ws://localhost:21001)
# 客户端代码:
import websockets
import json

async def stream_chat():
    async with websockets.connect("ws://localhost:21001/worker_generate_stream") as ws:
        payload = {
            "prompt": "写一首关于春天的诗",
            "temperature": 0.7,
            "max_new_tokens": 256
        }
        await ws.send(json.dumps(payload))
        
        while True:
            response = await ws.recv()
            data = json.loads(response)
            print(data["text"], end="", flush=True)  # 流式输出

import asyncio
asyncio.get_event_loop().run_until_complete(stream_chat())

八、使用 gRPC 调用(高性能场景)

定义文件chat.proto

// 先定义 proto 文件(chat.proto):
service ChatService {
  rpc Generate (ChatRequest) returns (stream ChatResponse);
}

message ChatRequest {
  string prompt = 1;
  float temperature = 2;
}

message ChatResponse {
  string text = 1;
}

python客户端:

import grpc
from chat_pb2 import ChatRequest
from chat_pb2_grpc import ChatServiceStub

channel = grpc.insecure_channel("localhost:50051")
stub = ChatServiceStub(channel)

responses = stub.Generate(
    ChatRequest(prompt="AI如何改变医疗行业?", temperature=0.6)
)

for response in responses:
    print(response.text, end="", flush=True)

**调用方式对比表**

方式适用场景优点缺点
HTTP POST通用远程调用简单易用延迟较高
直接加载模型本地开发/调试最低延迟需管理显存
LangChain复杂应用流程集成工具链丰富额外依赖
vLLM高并发推理吞吐量高配置复杂
WebSocket实时流式输出低延迟推送需维护长连接
gRPC微服务间通信高性能二进制传输需要定义proto

<think>好的,我现在需要回答用户关于如何在Spring Boot中使用WebClient调用大模型的流式接口的问题。首先,我需要回顾一下用户提供的引用内容,特别是引用[3],里面提到了WebFlux和流式调用大模型的方法。用户希望得到一个示例,所以重点应该放在代码实现上。 首先,我应该确认WebClient的基本用法。WebClient是Spring WebFlux的一部分,用于非阻塞的HTTP请求。流式调用通常涉及处理服务器发送的事件(SSE)或分块传输的数据。大模型的流式响应可能以SSE形式返回,每个数据块逐步传输。 接下来,我需要考虑如何配置WebClient实例。根据引用[3],需要创建带有响应式支持的WebClient,设置baseUrl,并配置默认的header,比如Content-Type和Authorization,特别是如果大模型API需要认证的话。 然后,处理流式响应。使用WebClient的post方法发送请求,body可能是一个Mono,比如使用BodyInserters.fromValue发送JSON数据。响应应该通过retrieve()获取,然后作为ServerSentEvent的流进行处理。这里需要注意,每个事件的数据可能需要解析,例如JSON对象。 另外,用户可能需要处理每个数据块并最终汇总结果。例如,使用StringBuilder来累积响应内容,并在订阅时触发请求。同时,需要确保主线程不会提前退出,所以可能需要阻塞或等待异步操作完成,这在测试或命令行应用中常见。 还要考虑异常处理,比如在doOnError中记录错误,以及在onComplete中处理完成后的逻辑。此外,引用[3]提到WebFlux的非阻塞特性,确保流式处理不会阻塞主线程,这一点需要在示例中体现出来。 最后,生成相关问题,帮助用户进一步探索,比如如何自定义请求头、处理错误、优化性能等。需要确保所有步骤符合用户的要求,代码语法正确,并且使用中文回答,行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。</think>以下是如何在Spring Boot中使用WebClient调用大模型流式接口的详细实现步骤和示例: ### 1. 配置WebClient实例 ```java @Bean public WebClient webClient() { return WebClient.builder() .baseUrl("https://api.largemodel.com/v1/stream") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .defaultHeader("Authorization", "Bearer your-api-key") .build(); } ``` *注:需在`application.properties`中配置baseUrl和API密钥更安全* ### 2. 流式响应处理方法 ```java public void streamModelResponse(String prompt) { webClient.post() .uri("/chat/completions") .body(BodyInserters.fromValue(Map.of( "prompt", prompt, "temperature", 0.7, "stream", true ))) .retrieve() .bodyToFlux(ServerSentEvent.class) .timeout(Duration.ofSeconds(30)) .doOnError(WebClientResponseException.class, ex -> log.error("API响应错误: {} {}", ex.getRawStatusCode(), ex.getResponseBodyAsString())) .subscribe( event -> { String data = event.data(); if (!"[DONE]".equals(data)) { JsonNode node = new ObjectMapper().readTree(data); System.out.print(node.get("choices").get(0).get("text").asText()); } }, error -> System.err.println("错误: " + error.getMessage()), () -> System.out.println("\n\n流式传输完成") ); } ``` ### 3. 完整控制器示例 ```java @RestController @RequiredArgsConstructor public class StreamController { private final WebClient webClient; private final StringBuilder fullResponse = new StringBuilder(); @GetMapping("/stream-chat") public Flux<String> streamChat(@RequestParam String message) { return webClient.post() .bodyValue(createRequest(message)) .retrieve() .bodyToFlux(DataBuffer.class) .map(dataBuffer -> { String chunk = DataBufferUtils.release(dataBuffer).toString(StandardCharsets.UTF_8); fullResponse.append(chunk); return chunk; }); } private Map<String, Object> createRequest(String message) { return Map.of( "messages", List.of(Map.of("role", "user", "content", message)), "stream", true, "max_tokens", 2000 ); } } ``` ### 关键点说明: 1. **响应式背压控制**:通过`Flux`实现按需处理数据流,自动处理背压[^3] 2. **超时配置**:使用`.timeout()`防止长时间无响应 3. **SSE事件处理**:支持标准的Server-Sent Events格式 4. **数据完整性**:使用StringBuilder累积完整响应 5. **错误处理**:区分网络错误和API业务错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值