🌟 探索LangChain装饰器:让代码更Pythonic的秘密武器

97 阅读2分钟

LangChain装饰器:让代码更Pythonic的秘密武器

随着生成式AI和自然语言处理技术的不断进步,开发者需要找到更有效的方法来编写和管理复杂的语言模型链条(LangChain)。LangChain装饰器正是这样一个工具,它为编写自定义LangChain提示和链条提供了语法糖,并且不属于LangChain官方团队产品。本文将深入探讨LangChain装饰器的主要功能、使用方法以及可能遇到的挑战。

主要优势

  • Pythonic风格:代码更易读,更符合Python的编程习惯。
  • 多行提示支持:可以编写多行提示而不破坏代码缩进。
  • IDE的支持:利用IDE的提示、类型检查和文档功能来快速了解函数的提示和参数。
  • LangChain生态系统的强大功能:支持可选参数和参数共享。

代码示例

以下是如何使用LangChain装饰器编写一个简单提示的例子:

from langchain_decorators import llm_prompt

@llm_prompt
def write_me_short_post(topic:str, platform:str="twitter", audience:str = "developers")->str:
    """
    Write me a short header for my post about {topic} for {platform} platform. 
    It should be for {audience} audience.
    (Max 15 words)
    """
    return

# 使用自然的方式调用
write_me_short_post(topic="starwars")
# 或者
write_me_short_post(topic="starwars", platform="reddit")

常见问题和解决方案

问题:如何定义全局设置?

可以通过GlobalSettings定义,以下是示例:

from langchain_decorators import GlobalSettings, ChatOpenAI

GlobalSettings.define_settings(
    default_llm=ChatOpenAI(temperature=0.0),
    default_streaming_llm=ChatOpenAI(temperature=0.0, streaming=True)
)

问题:如何实现流式传输?

流式传输要求函数为异步,并需要捕获流:

from langchain_decorators import StreamingContext, llm_prompt

@llm_prompt(capture_stream=True)
async def write_me_short_post(topic: str, platform: str = "twitter", audience: str = "developers"):
    """
    Write me a short header for my post about {topic} for {platform} platform. It should be for {audience} audience. (Max 15 words)
    """
    pass

tokens = []

def capture_stream_func(new_token: str):
    tokens.append(new_token)

with StreamingContext(stream_to_stdout=True, callback=capture_stream_func):
    result = await write_me_short_post(topic="starwars")
    print("Stream finished ... we can distinguish tokens thanks to alternating colors")

总结和进一步学习资源

LangChain装饰器为开发者提供了一种更简洁高效的方式来编写语言模型链条。通过提供多行提示支持和Pythonic风格,它将开发体验提升到了一个新的水平。更多详细的使用示例和教程,可以查看以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---