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

2024-11-20 09:22   重庆  

点击关注公众号,“技术干货” 及时达!



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

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

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

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

打开火山方舟,新建推理接入点,选择Doubao-embedding(不要设访问限制)。

查看该模型的API调用方法,并打开.cloudiderc文件,将模型端点加入

export EMBEDDING_MODELEND="your_modelend_point"

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

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

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

1. 环境配置

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

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

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

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

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

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

点击这里,进入安装说明(一般选择下载次数最多的,也基本是最新/最稳定的版本)

复制这个命令到anoconda prompt执行

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

2. 代码环节

目录指引:

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

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

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

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

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

import osfrom langchain_openai import ChatOpenAIfrom langchain.prompts import (    ChatPromptTemplate,    MessagesPlaceholder,    SystemMessagePromptTemplate,    HumanMessagePromptTemplate,)from langchain.chains import LLMChainfrom 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 osfrom 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,具体可以参考我上一篇文章。话不多说,直接上代码,这里用了两个版本的代码,大家可以对照掘金小册子和练中学之前的内容,自己试着解读一下代码

  • 版本1
import osfrom 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)

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

  • 版本2
import osfrom langchain_openai import ChatOpenAIfrom 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要是都能完美解决,那我真白写了?我是不是人啊?我到底是不是人啊?!!

点击关注公众号,“技术干货” 及时达!


稀土掘金技术社区
掘金,一个帮助开发者成长的技术社区
 最新文章