目录
前言
在上一篇章,我们学习了如何调用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识别的问题,后续再优化接口调用处理的问题,不急,需要源码和有问题的话可以私信我,咱们一起解决。
883

被折叠的 条评论
为什么被折叠?



