Langchain从零开始到应用落地案例[AI智能助手]【2】---使用Markitdown来OCR识别解析文件实现基于文件进行AI问答

目录

前言

安装

代码编写

运行演示

示例源码

结束语


前言

在上一篇章,我们学习了如何调用ollama模型进行了简单问答效果

Langchain从零开始到应用落地案例[AI智能助手]【1】---调用ollama模型实现简单循环会话-优快云博客

在这一篇章我会和你们一起学习如何解析文章,并依据文章来进行简单会话,目前不做持久化设定,而是实现单轮会话先,因为我还没学习到这里,那么接下来就一起学习吧,如果有错和需要修改的有疑问的请私信我,我们一起进步和学习,谢谢大家了。

安装

 这里将会使用markitdown开源模型来进行文档解析,以及图片识别

关于markitdown它是支持多格式解析(能支持ocr识别),支持mcp和插件的,所以这里极力推荐使用markitdown模型

官方链接:https://github.com/microsoft/markitdown

不过这里需求的最低的python环境为:3.10

在上一篇章我可能我没考虑markitdowen官方文档的环境需求,抱歉了,这里深感歉意!!!!

指令安装

pip install 'markitdown[all]'

代码编写

新建一个ocr_tools.py文件,用来之后拓展文件识别或者其他文件处理的统一模块。

OK,这里我们在桌面新建一个普通的文本文件“testdemo.txt”,然后再文本内随便写一些内容。

OK这个桌面文件路径:

C:\Users\a\Desktop\testdemo.txt #关于a是你的电脑用户名,最后面你依据你自己创建的文件名称和后缀修改就好了

先做普通的识别输出先

注:先把路径改成双斜杠先,在后续的篇章再优化修改,这里就先别焦虑之后传参怎么修改的问题

from markitdown import MarkItDown

md = MarkItDown()
file_path = "C:\\Users\\a\\Desktop\\testdemo.txt"
res = md.convert(file_path)
print(res.markdown)

不出意外,这里你就能看到类似的运行效果

关于这个警告,不管他,忽视他,因为不影响运行暂时这个项目也不会造成冲突,实在不喜欢可以借助AI工具优化掉。

在有这个基础上,我们就能实现基本的基于文件的问答了,把上一篇的模型调过来,进行图片尝试试试。

注:markitdown不支持纯图片识别,即图片不含有文字信息。

这里随便找一张文章截屏进行操作就ok了。

关于这里,会出现个问题点,我并没有考虑到某些模型不具备图像输入识别的问题,就是普通的语言模型不具备ocr识别,所以这里我们不操作了,后续篇章补齐,这里先操作文件处理。

原因是因为markitdown的ocr是依赖底层模型是否支持图片输入的,如果就是纯语言模型的话就是无法输出相关文档内容的,多模态模型可以,我这里把源码奉上,有多模态模型或者支持图像输入的模型直接使用就ok了。

import warnings
from markitdown import MarkItDown
from Ollama_test_demo1.setting_llm import llm

warnings.filterwarnings("ignore", message="Couldn't find ffmpeg or avconv*")

file_path = "D:\\pychram\\test_ocr.png"
client = llm
md = MarkItDown(llm_client=client)

try:
    res = md.convert(file_path)
    print("识别结果:")
    print("文本内容:", res.text_content)
    print("Markdown格式:", res.markdown)
    print("标题:", res.title)
except Exception as e:
    print(f"处理图片时出错: {e}")

如果模型不支持图像输入,只是语言模型的话就是例如图片效果。

基于文件的处理,传递给大模型,进行基于大模型的问答。

首先先做文件解析,这一步很简单

md = MarkItDown()
file_path = "文件的绝对路径"
res = md.convert(file_path)
text = res.text_content

然后拼接promt提示词,就和llamaIndex一样的操作,将文件解析的内容传递到promt提示词内

prompt = ChatPromptTemplate.from_messages(
        [
            ("system", f"用户上传文件的内容{text}/n/n"
                       f"你是一个问答助手,用户和你进行对话,你先基于用户上传文件的内容查询回答,"
                       f"如果没有需要根据用户问题给出一个回答。"),
            ("human", "{question}"),
        ]
    )

最后再创建节点进行模型调用进行回答

chat = prompt | llm

question = input("请输入问题:")
response = chat.invoke(question)
print(response.content)

测试运行就ok了

注意点,pdf,xlxs等文件是可以解析的,但是里面有些符号需要转义,不然会被pormt视为占位符。

 prompt = ChatPromptTemplate.from_messages(
        [
            ("system",
             f"用户上传文件的内容{text}\n\n你是一个问答助手,用户和你进行对话,你先基于用户上传文件的内容查询回答,如果没有需要根据用户问题给出一个回答。".replace(
                 "{", "{{").replace("}", "}}")),
            ("human", "{question}"),
        ]
    )

运行演示

至于这里没有输出的问题是因为我的电脑输出比较缓慢,后续的话会优化为云端模型,因为转的有点慢,不利于测试观察

最终效果:

示例源码

import warnings

from langchain_core.prompts import ChatPromptTemplate
from markitdown import MarkItDown
from Ollama_test_demo1.setting_llm import llm

warnings.filterwarnings("ignore", message="Couldn't find ffmpeg or avconv*")




def chat_with_markdown():

    md = MarkItDown()
    file_path = "C:\\Users\\a\Desktop\\AgentTestworddemo.txt"
    res = md.convert(file_path)
    text = res.text_content

    # 修改此处:对系统提示中的大括号进行转义
    prompt = ChatPromptTemplate.from_messages(
        [
            ("system",
             f"用户上传文件的内容{text}\n\n你是一个问答助手,用户和你进行对话,你先基于用户上传文件的内容查询回答,如果没有需要根据用户问题给出一个回答。".replace(
                 "{", "{{").replace("}", "}}")),
            ("human", "{question}"),
        ]
    )
    chat = prompt | llm

    question = input("请输入问题:")
    response = chat.invoke({"question": question})
    print(response.content)

if __name__ == '__main__':
    chat_with_markdown()

结束语

到这里呢,咱们也学会了,嘻嘻,那么接下来就是一起来优化ocr识别的问题,后续再优化接口调用处理的问题,不急,需要源码和有问题的话可以私信我,咱们一起解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值