如何无需循环直接从Claude API获取多个补全结果(n个)
Claude API 单次调用生成多补全方案问题
问题背景
我正在使用Anthropic Claude API,希望通过单次API调用为给定prompt生成n个补全结果。OpenAI API的采样设置中有n参数可以实现这个功能,但我在Claude API里没找到对应的选项。
当前实现(带重试机制)
我目前用重试机制处理API调用的潜在错误,代码如下:
from tenacity import retry, stop_after_attempt, wait_exponential def before_sleep(retry_state): print(f"(Tenacity) Retry, error that caused it: {retry_state.outcome.exception()}") def retry_error_callback(retry_state): exception = retry_state.outcome.exception() exception_str = str(exception) if "prompt is too long" in exception_str and "400" in exception_str: raise exception return 'No error that requires us to exit early.' @retry(stop=stop_after_attempt(20), wait=wait_exponential(multiplier=2, max=256), before_sleep=before_sleep, retry_error_callback=retry_error_callback) def call_to_anthropic_client_api_with_retry(gen: AnthropicGenerator, prompt: str) -> dict: response = gen.llm.messages.create( model=gen.model, max_tokens=gen.sampling_params.max_tokens, system=gen.system_prompt, messages=[ {"role": "user", "content": [{"type": "text", "text": prompt}]} ], temperature=gen.sampling_params.temperature, top_p=gen.sampling_params.top_p, n=gen.sampling_params.n, # 用于生成多个补全的预期参数 stop_sequences=gen.sampling_params.stop[:3], ) return response
核心疑问
我在Anthropic API文档里没找到能单次请求生成多补全的n参数:
- Claude API是否支持单次调用直接生成n个补全结果?
- 如果不支持,有没有办法不用循环多次请求实现这个需求?
临时解决方案
目前我用循环多次调用API来获取多补全,代码如下:
@retry(stop=stop_after_attempt(20), wait=wait_exponential(multiplier=2, max=256), before_sleep=before_sleep, retry_error_callback=retry_error_callback) def call_to_anthropic_client_api_with_retry(gen: AnthropicGenerator, prompt: str) -> dict: if not hasattr(gen.sampling_params, 'n'): gen.sampling_params.n = 1 content: list[dict] = [] for _ in range(gen.sampling_params.n): response = gen.llm.messages.create( model=gen.model, max_tokens=gen.sampling_params.max_tokens, system=gen.system_prompt, messages=[ {"role": "user", "content": [{"type": "text", "text": prompt}]} ], temperature=gen.sampling_params.temperature, top_p=gen.sampling_params.top_p, stop_sequences=gen.sampling_params.stop[:3], ) content.append(response) response = dict(content=content) return response
解答
- Claude API暂不支持单次调用生成多补全:截至当前,Anthropic官方API并未提供类似OpenAI的
n参数来单次返回多个独立补全结果。你在代码中传入的n参数实际上不会被API处理,属于无效参数。 - 无循环替代方案说明:目前没有官方支持的非循环方式实现单次请求多补全。社区讨论中提到的相关方法本质上还是通过并发请求优化效率,但仍然是多次API调用。
优化建议
如果想提升多补全的获取效率,可以改用并发请求替代串行循环,比如使用asyncio配合Anthropic的异步客户端:
import asyncio from anthropic import AsyncAnthropic from tenacity import retry, stop_after_attempt, wait_exponential, AsyncRetrying async def async_call_claude(gen, prompt): client = AsyncAnthropic(api_key=gen.api_key) response = await client.messages.create( model=gen.model, max_tokens=gen.sampling_params.max_tokens, system=gen.system_prompt, messages=[{"role": "user", "content": [{"type": "text", "text": prompt}]}], temperature=gen.sampling_params.temperature, top_p=gen.sampling_params.top_p, stop_sequences=gen.sampling_params.stop[:3], ) return response @retry(stop=stop_after_attempt(20), wait=wait_exponential(multiplier=2, max=256)) async def get_multiple_completions(gen, prompt, n): tasks = [async_call_claude(gen, prompt) for _ in range(n)] responses = await asyncio.gather(*tasks) return {"content": responses}
这种方式可以并行发起多个请求,相比串行循环能大幅减少总耗时。
内容的提问来源于stack exchange,提问作者Charlie Parker
相关产品推荐
相关产品推荐

