导读:
本文旨在探索一条创新的路径,即通过利用Google的Gemini Flash而非广为人知的LangChain,来实现与CSV文件的智能交互。本文将构建一个简单的CSV解释器,利用大型语言模型(LLM)来生成代码并解析数据,并通过Streamlit打造直观的用户界面。这一实践不仅展示了技术的灵活应用,还强调了简化开发流程的重要性。©️【深蓝AI】
在当今AI工具日新月异的环境中,LangChain(LLM编程框架)、LangGraph、LlamaIndex和CrewAI等工具层出不穷。尽管这些工具各有千秋,但对于开发者而言,学习曲线往往陡峭,尤其是当真正想要构建项目而非仅仅跟风学习这些库时。LangChain固然强大,但其复杂的文档可能会让使用者感到困惑。对于简单的项目而言,LangChain或许并非首选,保持“KISS”(Keep it simple stupid)原则显得尤为重要。
虽然这些工具可能并不如描述中那般难以驾驭,但建议先尝试实现一些基础功能,再根据需求转向更高级的工具。
自2022年11月以来,AI领域的发展日新月异,尤其是GPT-4o和Gemini更新的接连推出。
GPT-4o的“Sky”语音在演示中引发了巨大反响,掀起了AI行业的新一轮热潮,甚至在一定程度上掩盖了Google I/O大会上Gemini的光芒。诚然,GPT始终走在其他LLM的前列,但对于构建最小可行产品(MVP)和个人项目而言,Gemini为开发者带来了福音,其免费层级允许访问API和最新模型,且每分钟请求限制为15次,相当友好。
ChatGPT的免费版本虽已允许用户上传文件,但仍无法在没有代码解释器的情况下直接解析CSV或Excel数据。因此,为了测试Gemini Flash的功能,本项目构建了一个CSV解释器。市面上不乏使用Langchain创建CSV解释器的教程,但本项目将从头开始构建,以更易于理解的方式呈现,尤其适合初学者。
1. Pipeline设计
本项目的核心在于利用LLM的能力自动生成代码。首先为LLM提供数据集的关键信息,如通过head(), describe(), columns(), 和 dtypes等方法获取的基本描述,以此作为生成代码的基础。随后,将生成的代码与用户的具体查询相结合,旨在提升用户与系统的交互体验,使结果更加贴近用户的实际需求。
本项目分为两大阶段:
- 代码生成阶段:此阶段聚焦于利用LLM的生成能力,基于数据集的元数据信息,自动生成相应的pandas命令或代码片段。
加粗样式 - 结果整合与对话优化阶段:在代码生成后,将这些代码的输出与用户的具体查询紧密结合,通过转换代码输出为自然语言的方式,改善用户与系统之间的对话体验,使结果更加直观易懂。
在设计prompt时,需要注意以下几点:
清晰明确: 确保prompt中的指令或问题表述清晰、准确,避免产生歧义。
简洁直接: 尽量用简短的语言传达核心信息,避免冗长和复杂的描述。
避免指令过载: 不要在同一prompt中堆砌过多的指令或问题,以免LLM无法理解或执行。
同时,可以借鉴zero-shot、chain-of-thought、few-shot等prompt技巧,以及基于角色的prompt设计方法,来更好地引导LLM,提高其生成代码的质量和准确性。
总共需要四个prompt:两个系统prompt和两个主要prompt(每个阶段的系统prompt + 主要prompt)。系统prompt作为一个框架,为人工智能在特定参数范围内运行并生成连贯、相关且与预期结果一致的回复创造条件。
阶段 | 系统prompt | 主要prompt |
---|---|---|
第一阶段 | 你是使用 pandas 的 Python 开发专家。您必须为用户查询生成 JSON 格式的简单 pandas “命令”。无需添加 "打印 "函数。在生成命令前分析列的数据类型。如果不可行,则返回 “无”。 | 数据帧名称为 “df”。df 的列数为 {cols},数据类型为 {dtype}:{desc}。df 的标题为:{head}。不能使用 df.info() 或任何不能打印的命令。在数据帧 df 上为该查询编写一条 pandas 命令:{user_query} |
第二阶段 | 你的任务是理解。您必须分析用户查询和响应数据,生成自然语言响应数据。 | 用户查询为 {final_query}。命令输出为 {str(data)}。如果数据为 “无”,则可以说 “请提出查询以开始”。不要提及使用的命令。用自然语言生成输出响应。 |
通过将把元数据动态注入这个提示符,以生成pandas命令。
2. 整合所有内容
数据帧元数据
df = pd.read_csv(uploaded_file)
head = str(df.head().to_dict())
desc = str(df.describe().to_dict())
cols = str(df.columns.to_list())
dtype = str(df.dtypes.to_dict())
系统prompt
model_pandas = genai.GenerativeModel('gemini-1.5-flash-latest', system_instruction="You are an expert python developer who works with pandas. You make sure to generate simple pandas 'command' for the user queries in JSON format. No need to add 'print' function. Analyse the datatypes of the columns before generating the command. If unfeasible, return 'None'. ")model_response = genai.GenerativeModel('gemini-1.5-flash-latest', system_instruction="Your task is to comprehend. You must analyse the user query and response data to generate a response data in natural language.")
主要prompt
final_query = f"The dataframe name is 'df'. df has the columns {cols} and their datatypes are {dtype}. df is in the following format: {desc}. The head of df is: {head}. You cannot use df.info() or any command that cannot be printed. Write a pandas command for this query on the dataframe df: {user_query}"natural_response = f"The user query is {final_query}. The output of the command is {str(data)}. If the data is 'None', you can say 'Please ask a query to get started'. Do not mention the command used. Generate a response in natural language for the output."
响应生成
# Stage 1
response = model_pandas.generate_content(final_query,generation_config=genai.GenerationConfig(response_mime_type="application/json",response_schema=Command,temperature=0.3))# Stage 2
bot_response = model_response.generate_content(natural_response,generation_config=genai.GenerationConfig(temperature=0.7))
Temperature参数控制回复的随机性。高temperature增加创意和多样性,但可能偏离查询;低temperature则保证回复一致和集中,但创意较少。因此,项目在第一阶段使用低temperature确保准确命令,第二阶段使用高temperature避免单调。
执行pandas命令时,使用Python的exec()函数,尽管存在安全风险,但它是实现动态代码执行的必要工具。未来计划优化架构和增加验证以提高安全性。
3. 用户界面
用户界面构建参考:https://omkamath.medium.com/how-i-built-a-beautiful-web-app-purely-in-python-with-zero-experience-874731df6bc1
3. 结论
通过精心设计的prompt,LLM能够轻松转型,胜任各类任务,这无疑是未来项目创新的核心驱动力。诚然,本项目并未追求突破性的技术革新,其架构与ChatGPT中的代码解释器理念不谋而合,均展现了高度的灵活性与通用性。在我看来,这种高度抽象化的设计理念,尤为适合初学者入门,为他们开启了一扇通往广阔技术世界的大门。
*有关Streamlit UI的全部代码,请查看gist。
©️【深蓝AI】
Ref:
https://gist.github.com/Om-Kamath/90f1ae351bea470e72d0e6a567527eea
https://medium.com/google-cloud/did-google-just-kill-streamlit-76f719d9e275
https://levelup.gitconnected.com/chat-with-csv-files-using-googles-gemini-flash-no-langchain-0e8f79d63348
https://omkamath.medium.com/how-i-built-a-beautiful-web-app-purely-in-python-with-zero-experience-874731df6bc1
撰稿|Sienna
审核|Los
本文首发于微信公众号【深蓝AI】,移步公众号【深蓝AI】,第一时间获取自动驾驶、人工智能与机器人行业最新最前沿论文和科技动态👇
深蓝AI·赋能自动驾驶+机器人+AI