社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

大道至简,GraphRAG生成的Prompt和数据集,用60行Python基础代码就能优化

AI修猫Prompt • 1 年前 • 510 次点击  

点击上方蓝字关注我

最近有朋友问我,Prompt优化有什么用?这是一个严肃的问题,因为很多朋友写出了Prompt根本没有优化之后的使用机会,现在Token又这么便宜,又不在乎多几个Token,优化有什么用?放在扣子里虽说收费,但费用也能接受,太多的Token便宜到几乎可以忽略费用。或许你认为,Prompt优化现在看来没那么重要。

我的公众号文章中有很多篇幅都是用来介绍优化的,要是把优化问题仅认为是一个费用问题或准确率问题,那就把优化问题过于简单化。繁杂的提示词肯定让你崩溃过,尤其是前面用的好好的,突然有一天就崩了,提示词不听话了。哈哈!不管你是跑在Agent里还是自动化流程里,或者是元宝、扣子、Dify等各种框架里,优化问题都是个不可忽视的大问题。

往期推荐

谷歌最新 | 破解Prompt自动优化之迷,DSPy助力示例选择,指令优化独大时代或将终结

太卷了,剑桥最新Prompt贝叶斯优化LLAMBO,ICLR2024 | 你竟然还不知道

微软:当你的结构化Prompt遇到优化瓶颈,用语义分解、结构化方法可以快速优化

谷歌DeepMind重磅:提示工程师必须掌握OPRO,用LLM就能自动优化Prompt|ICLR2024

融合DSPy与LangChain,输出优化的Prompt,训练中文弱智吧数据生成创意文章

这么说吧,对Prompt进行优化意味着响应速度更快,客户体验更好。你能得到准确度更高,鲁棒性更强的prompt,能让你的AI程序更稳定,生成内容更精准。

上一篇,我介绍了用微软最新最强的GraphRAG把一个PDF文件自动生成可用于优化的训练数据集和Prompt。这是一个范例,有很好的泛化作用,您可以对某种方案、技术手册或者某种技术教程等等PDF格式的文件,自动生成更大的数据集,比如300-500条或者把几个PDF文本整合到一个可用于优化和训练的数据集中。

图片由xiumaodalle生成

01

优化验证大致思路

上一篇我只生成了15个和GraphRAG论文有关的问题和答案对,后面异步主函数下的数据集生成模块把这些内容上篇文章图中的内容保存到一个数据集中prompt_optimization_dataset.yaml。xiumao代码运行截图1是这个数据集中的部分内容。

async def main():
    entities, description_embedding_store, jina_embedder = process_and_embed()
    
    context_builder = LocalSearchMixedContext(
        entities=entities,
        entity_text_embeddings=description_embedding_store,
        embedding_vectorstore_key=EntityVectorStoreKey.ID,
        text_embedder=jina_embedder,
    )

    local_context_params = {
        "top_k_mapped_entities": 5,
        "include_entity_rank": True,
         "embedding_vectorstore_key": EntityVectorStoreKey.ID,
        "max_tokens": 4000,
    }

    search_engine = LocalSearch(
        llm=DeepSeekClientWrapper(deepseek_client),
        context_builder=context_builder,
        llm_params={"max_tokens": 1000, "temperature": 0.0},
        context_builder_params=local_context_params,
        response_type="multiple paragraphs",
    )

    initial_summary = await run_rag_query(search_engine, "总结这篇论文的主要观点,包括研究方法、实验流程和主要结果")
    
    if initial_summary:
        dataset = await generate_and_answer_questions(deepseek_client, search_engine, initial_summary)
        
        with open('prompt_optimization_dataset.yaml', 'w', encoding='utf-8') as yaml_file:
            yaml.dump(dataset, yaml_file, allow_unicode=True, sort_keys=False)
        
        print("数据集已保存为 prompt_optimization_dataset.yaml")

if __name__ == "__main__":
    import nest_asyncio
    nest_asyncio.apply()
    asyncio.run(main())

xiumao代码运行截图1

然后再特意为这个简易优化程序(醋)写(包)了一个(盘)简单的RAG检索系统(饺子),检索代码不超过70行,比较数据集优化前后答案的变化。

def main():

    # 创建文档列表
    documents = [{'content': f"Question: {item['question']}\nAnswer: {item['answer' ]}"} for item in dataset]

    # 创建检索器
    retriever = SimpleRetriever(documents)
   
    # 加载数据集
    dataset = load_dataset('prompt_optimization_dataset.yaml')

    # 执行查询
    question = "多文档问答任务中,模型是如何具体评估其应用能力的?"
    retrieved_docs = retriever.retrieve(question, top_k=3)
    answer = generator.generate(question, retrieved_docs)
    
    print("问题:", question)
    print("答案:", answer)

if __name__ == "__main__":
    main()

用这个简单的RAG去问个问题

xiumao代码运行截图2

02

开始优化

对数据集优化的意义在于:你能够整理和规范数据集中的内容,并用于生产系统的部署,如果需要的话,或者作为问答系统的知识库,总之你优化就对了。用最简单的Python基础语句,让Deepseek作为模型批量总结、整理数据集中的字段成你希望的字数和格式,别说控制不了模型生成字数,用好基础语句(写个惩罚函数)连标点符号都能控制,就说你想要什么吧。所以,大道至简,越是基础的知识越有力量,越不容易出错。最后整理完的内容保存到refined_dataset.yaml中。

import yaml
from openai import OpenAI

# 配置 DeepSeek 语言模型
class DeepSeekLM:
    def __init__(self, api_key, base_url, model):
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.model = model
        self.kwargs = {
            "temperature": 0.7,
            "max_tokens": 200,
            "top_p": 1,
            "frequency_penalty": 0,
            "presence_penalty": 0
        }

    def __call__(self, prompt, **kwargs):
        merged_kwargs = {**self.kwargs, **kwargs}
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": "你是一个答案总结助手。请将给定的答案简明扼要地总结为120-180个字符。"},
                {"role": "user", "content": prompt}
            ],
            **merged_kwargs
        )
        return response.choices[0].message.content

# 加载数据集
print("正在加载数据集...")
with open('prompt_optimization_dataset.yaml', 'r', encoding='utf-8') as file:
    dataset = yaml.safe_load(file)
print(f"成功加载数据集,共 {len(dataset)} 条记录")

xiumao代码运行截图3

03

验证优化结果

再然后,数据集结果已保存到refined_dataset.yaml,再去用这个yaml文件替换xiumao代码运行截图2那个简单RAG中的优化前的数据集prompt_optimization_dataset.yaml,用同样的问题提问,结果如下:

xiumao代码运行截图4

数据集优化验证结束,这两篇文章的代码如果您有需要,您成为赞赏群成员后可以向我要。


我很认真,转载请与我联系,私自抓取转载将被起诉
AI已成为我洞察世界并输出想法的工具

本地部署LLM成为你自己AI资源的掌控者

本地离线生成式AI文生文全要素提效指南,更安全更经济更高效


这份指南还包含8500条复杂Prompt,以及管理工具和方法(包含system提示词)

想把方法论转化为复杂提示词?Prompt心法与算法高级指南,帮你从知到行升维实践


关于Prompt,这本手册,是你和我沟通的桥梁

第一性原理下的Prompt,助你跃升为大师的指导手册


🎉让我们一起创造更多美好! 🎉


如果您觉得这篇文章对您有帮助或启发
感谢您为我【点赞】【在看】


👉微信号:xiumaoprompt

加我微信之前,请想好要和我说点什么

要不我不会轻易通过您




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/172123
 
510 次点击