- 大家好,我是同学小张,日常分享AI知识和实战案例
- 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
- 一起交流💬,一起进步💪。
- 微信公众号也可搜【同学小张】 🙏
本站文章一览:
本文通过一个案例来学习下如何让 LangChain 写代码并自动执行输出结果。
本文案例来自:https://python.langchain.com/docs/expression_language/cookbook/code_writing
0. 完整代码
先来跑通demo代码
from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ( ChatPromptTemplate, ) from langchain_experimental.utilities import PythonREPL from langchain_openai import ChatOpenAI template = """Write some python code to solve the user's problem. Return only python code in Markdown format, e.g.: ```python .... ```""" prompt = ChatPromptTemplate.from_messages([("system", template), ("human", "{input}")]) model = ChatOpenAI() def _sanitize_output(text: str): _, after = text.split("```python") return after.split("```")[0] chain = prompt | model | StrOutputParser() | _sanitize_output | PythonREPL().run result = chain.invoke({"input": "whats 2 plus 2"}) print(result)
执行结果:
1. 代码学习
这段代码实现的功能:当接收到用户提问时,通过调用大模型来写Python代码,通过执行Python代码输出Python代码的运行结果。上面的demo中,用户提问2+2等于几,Python程序执行结果为4。
案例很简单,但也有值得学习的地方。
(1)首先是前面的传统chain部分,prompt | model | StrOutputParser
就是将用户提问和系统设定的Prompt给到大模型,然后大模型输出结果,通过StrOutputParser
将结果转换成字符串格式。
StrOutputParser
的作用:将大模型的输出转换成字符串格式。如果是LLM的返回,保持原样(LLM的返回本来就是字符串),如果是ChatModel的返回,它会输出.content
中的信息作为结果字符串。
这里面可以重点关注下给系统设定的Prompt:限定了只输出Python代码,并且用Markdown的形式,并且还给了输出格式的例子。最大限度地保证大模型输出地Python代码是可以运行的。
template = """Write some python code to solve the user's problem. Return only python code in Markdown format, e.g.: ```python .... ```"""
(2)_sanitize_output
函数,将大模型输出的Markdown格式的Python代码提取出来,其实这里就是去掉前面的 “```python” 和后面的 “```”。所以,前面的Prompt就显得至关重要了,一定将输出格式限制死了,有一点不对就会提取Python代码出错。
(3)PythonREPL().run
,从代码中也能猜出它就是用来在内部运行 Python 程序的,它是LangChain封装的一个用来执行Python代码的类。
run
函数的几个注意点:
- 参数为完整的要执行的Python代码
- 其返回结果为 Python 代码中通过
print
函数打印的内容,如下示例代码,print(1+1),才能返回2。
from langchain_experimental.utilities import PythonREPL python_repl = PythonREPL() python_repl.run("print(1+1)") # 有返回值,2 python_repl.run("print(1+1)") # 无返回值,空的
本文中demo程序生成的Python代码,有使用 print
:
看下PythonREPL的源码,原理很简单,就是调用了一下 exec
函数执行代码,然后将标准输出中的内容放到队列中。执行完之后 return queue.get()
,将标准输出内容作为结果返回。
所以从源码也可以知道,它不止会返回 print
打印出来的内容,任何输出到标准输出中的信息它都会返回,例如程序报错、警告等。
本文到这里就结束了。通过本文,我们主要是学习了如何让大模型写Python程序并自动执行。其实最大的收获就是知道了有 PythonREPL
这么个东西,更深一点知道了 PythonREPL
的运行原理,后面即使不用LangChain,也能自己写一段类似的功能。
如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~
- 大家好,我是同学小张,日常分享AI知识和实战案例
- 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
- 一起交流💬,一起进步💪。
- 微信公众号也可搜【同学小张】 🙏
本站文章一览: