【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案

慈云数据 2024-04-19 技术支持 41 0
  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

    本站文章一览:

    在这里插入图片描述


    本文通过一个案例来学习下如何让 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知识和实战案例
      • 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
      • +v: jasper_8017 一起交流💬,一起进步💪。
      • 微信公众号也可搜【同学小张】 🙏

        本站文章一览:

        在这里插入图片描述

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon