在大多数LLM应用中,你会希望流式输出结果,以最小化用户看到第一个令牌所需的时间。
LangSmith的追踪功能通过generator函数原生支持流式输出。以下是一个示例。
from langsmith import traceable
@traceable
def my_generator():
for chunk in ["Hello", "World", "!"]:
yield chunk
# 向用户流式输出
for output in my_generator():
print(output)
# 异步函数同样适用
import asyncio
@traceable
async def my_async_generator():
for chunk in ["Hello", "World", "!"]:
yield chunk
# 向用户流式输出
async def main():
async for output in my_async_generator():
print(output)
asyncio.run(main())
聚合结果
默认情况下,被追踪函数的outputs在LangSmith中会被聚合成一个数组。如果你想自定义存储方式(例如,将输出连接成单个字符串),可以使用aggregate选项(Python中为reduce_fn)。这对于聚合流式LLM输出尤其有用。
聚合输出仅影响追踪记录中的输出表示,不会改变函数返回的实际值。
from langsmith import traceable
def concatenate_strings(outputs: list):
return "".join(outputs)
@traceable(reduce_fn=concatenate_strings)
def my_generator():
for chunk in ["Hello", "World", "!"]:
yield chunk
# 向用户流式输出
for output in my_generator():
print(output)
# 异步函数同样适用
import asyncio
@traceable(reduce_fn=concatenate_strings)
async def my_async_generator():
for chunk in ["Hello", "World", "!"]:
yield chunk
# 向用户流式输出
async def main():
async for output in my_async_generator():
print(output)
asyncio.run(main())