重磅!本地使用langchain&02_DocQA报错 | 豆包MarsCode AI刷题

922 阅读6分钟

关于项目空间02_DocQA.py报错的解决方法,以及本地使用langchain调用大模型的方法

一、 02_DocQA.py报错的解决方法

直接运行该文件,大概率会出现如下报错。查看报错信息的最后一行,发现“ArkNotFoundError”, image.png

再查看Traceback的下一行,发现在代码的77行出现问题。根据该代码块的79、80行,发现使用了embedding模型,可是我们之前并没有配置。

image.png

打开火山方舟,新建推理接入点,选择Doubao-embedding(不要设访问限制)。 image.png 查看该模型的API调用方法,并打开.cloudiderc文件,将模型端点加入

export EMBEDDING_MODELEND="your_modelend_point"

在终端执行source ~/.cloudiderc,再次运行02_DocQA.py即可。点击网络服务进入网址或直接在右侧的Web预览中进行问答。 image.png

二、 本地使用langchain调用大模型(本例使用了智谱大模型glm-4和火山引擎大模型)

【注意】上一篇提到我的langchain出问题了,后来发现是我给python文件名也起的langchain,大家不要犯类似的错误。解决了这个不算bug的bug,终于可以写代码了?当然不是,下面要解决其他bug!

image.png

1. 环境配置

我的原先环境还是有问题,把包都卸载重装了还是不管用,使用pip install下载的langchain等包都不是最新版,老是各种bug,一怒之下,我重新创建并且配置了一个新环境

(大家可以按照我的步骤走一遍,然后有精力的话在自己的旧环境里面再试一遍)

  • 1. 最新版本的langchain 0.3将不再支持python3.8了,这次使用的是3.9版本的python。
conda create --name bytedance python=3.9
conda activate bytedance

不创建新环境的,要在原环境中,更新python版本,并更新其他库(如果事先安装好了langchain 0.2版本以及其他依赖项,这个更新貌似没用, 不过可以尝试),然后查看版本是否都更新了

conda install python=3.9
conda update --all
conda list
  • 2. 安装langchain
conda install conda-forge::langchain

【注意】由于pip安装可能不是最新版本,所以要用conda官网方法安装,进入anoconda官网,库的下载命令都可以从这里查看anaconda.org/

image.png 点击这里,进入安装说明(一般选择下载次数最多的,也基本是最新/最稳定的版本) image.png 复制这个命令到anoconda prompt执行 image.png

  • 3. 安装依赖项
conda install conda-forge::langchain-openai
conda install conda-forge::langchain-community

2. 代码环节

目录指引:

  1. 调用智谱大模型glm-4(免费)
  2. 调用火山大模型

如果按照我的流程新建环境一步步走下来执行下面的代码会很顺利,其余的代码执行过程中报错,可能是一些包的安装或者版本问题,说到底还是环境的问题。

1. 调用智谱大模型glm-4(免费)

我由于环境问题,尝试了各种方法,后来经历了一番波折,终于在使用openai测试的时候环境没问题了,但是由于openai并不在国内我无法连接,所以我先行尝试了其他的开源大模型,然后才使用火山大模型。下面是智谱大模型官网给出的langchain调用模板。

【注意】需要自己去智谱官网注册账号,并把api_key配置到自己的环境变量中

import os
from langchain_openai import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory


api_key = os.environ.get("ZHIPUAI_API_KEY")

llm = ChatOpenAI(
    model="glm-4",
    max_tokens=100,
    openai_api_key=api_key,
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
)

prompt = ChatPromptTemplate(
    messages=[
        SystemMessagePromptTemplate.from_template(
            "你是一个智能机器人,可以回答人类许多问题。"
        ),
        MessagesPlaceholder(variable_name="chat_history"),
        HumanMessagePromptTemplate.from_template("{question}")
    ]
)

memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
chat = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
response = chat.invoke({"question": "请给我的花店起个名字。"})
print(response['text'])

智谱给出的是有提示词的模板,看着有一点复杂,于是我觉得是不是可以更简单一点,然后就产生了下面的简单版代码。

import os
from langchain_openai import ChatOpenAI

# 从环境变量中获取API密钥和模型端点
api_key = os.environ.get("ZHIPUAI_API_KEY")

# 实例化ChatOpenAI对象
llm = ChatOpenAI(openai_api_key=api_key,
                 openai_api_base="https://open.bigmodel.cn/api/paas/v4/",
                 model="glm-4",
                 temperature=0.8,
                 max_tokens=60)

# 通过对象调用模型
response = llm.predict("请给我的花店起个名字")
print(response)

大家或许更关心火山大模型的调用,代码如出一辙。

2. 调用火山大模型

之前我们在环境变量中已经分别配置了ARK_API_KEYLLM_MODELEND,具体可以参考我上一篇文章。话不多说,直接上代码,这里用了两个版本的代码,大家可以对照掘金小册子和练中学之前的内容,自己试着解读一下代码

image.png

  • 版本1
import os
from langchain_openai import ChatOpenAI

# 从环境变量中获取API密钥和模型端点
api_key = os.environ.get("ARK_API_KEY")
model = os.environ.get("LLM_MODELEND")

# 实例化ChatOpenAI对象
llm = ChatOpenAI(openai_api_key=api_key,
                 openai_api_base="https://ark.cn-beijing.volces.com/api/v3",
                 model=model,
                 temperature=0.8,
                 max_tokens=60)

# 通过对象调用模型
response = llm.predict("请给我的花店起个名字")
print(response)

这个版本执行时会报警,是因为调用方法的版本面临弃用,但是对执行结果没有影响 image.png

  • 版本2
import os
from langchain_openai import ChatOpenAI
from langchain.schema import (
    HumanMessage,
    SystemMessage
)


# 从环境变量中获取API密钥和模型名称
api_key = os.environ.get("ARK_API_KEY")
model = os.environ.get("LLM_MODELEND")

# 初始化ChatOpenAI对象
llm = ChatOpenAI(openai_api_key=api_key,
                 openai_api_base="https://ark.cn-beijing.volces.com/api/v3",
                 model=model,
                 temperature=0.8,
                 max_tokens=60)

messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的花店起个名")
]
response = llm.invoke(messages)

# 以下几行可直接替换20-24行代码
# response = llm.invoke([
#     ("system", "你是一个智能机器人,可以回答人类许多问题。"),
#     ("human", "请给我的花店起个名字。")
# ])

print(response.content)

三、总结与提示

  1. 环境的配置至关重要,这里包括库的安装、库的版本、依赖项......很多东西其实需要大家自己去相应的官网查看指引和相关文档,本文除了国内的大模型网站,像langchain、Anoconda、Github这些网站都是英文的,有些网页提供了翻译,大部分是没有的,大家可以先搜索关键词查看相应部分,或者复制到翻译软件中查看中文翻译,实在太别扭不理解的,就可以利用网站上的一些关键信息直接去请教AI了。
  2. 其实代码报错的内容大家基本都能看得懂,无非就是报错的最后一行、或者Traceback下面第一行,可以先试着去理解并尝试自己解决,不懂的再去查找官方文档或者AI,当然AI最方便,但是有的问题仍然无法解决;
  3. conda虚拟环境的问题其实AI只能解决大部分,有时候他最后会给你一个“如果以上方法都不能解决,请尝试重新创建一个环境”
  4. 最后再说一遍,AI要是都能完美解决,那我真白写了?我是不是人啊?我到底是不是人啊?!!

image.png