使用谷歌Gemini构建高级PaperQA2研究代理

本文详细介绍如何利用谷歌Gemini大模型构建PaperQA2科研文献分析代理,包含环境配置、API集成、多论文查询和对比分析功能实现,提供完整的代码示例和技术架构说明。

使用谷歌Gemini构建高级PaperQA2研究代理进行科学文献分析

在本教程中,将构建一个由谷歌Gemini模型驱动的高级PaperQA2 AI代理,专门用于科学文献分析。在Google Colab/Notebook中设置环境,配置Gemini API,并将其与PaperQA2无缝集成以处理和查询多篇研究论文。通过设置,最终获得一个能够回答复杂问题、执行多问题分析并进行论文间比较研究的智能代理,同时提供来自源文档的证据清晰答案。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
!pip install paper-qa>=5 google-generativeai requests pypdf2 -q

import os
import asyncio
import tempfile
import requests
from pathlib import Path
from paperqa import Settings, ask, agent_query
from paperqa.settings import AgentSettings
import google.generativeai as genai

GEMINI_API_KEY = "使用您自己的API密钥"
os.environ["GEMINI_API_KEY"] = GEMINI_API_KEY

genai.configure(api_key=GEMINI_API_KEY)
print("Gemini API密钥配置成功!")

首先安装所需的库,包括PaperQA2和谷歌生成式AI SDK,然后导入项目所需的模块。将Gemini API密钥设置为环境变量并进行配置,确保集成准备就绪。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
def download_sample_papers():
    """下载示例AI/ML研究论文用于演示"""
    papers = {
        "attention_is_all_you_need.pdf": "https://arxiv.org/pdf/1706.03762.pdf",
        "bert_paper.pdf": "https://arxiv.org/pdf/1810.04805.pdf",
        "gpt3_paper.pdf": "https://arxiv.org/pdf/2005.14165.pdf"
    }
    
    papers_dir = Path("sample_papers")
    papers_dir.mkdir(exist_ok=True)
    
    print("正在下载示例研究论文...")
    for filename, url in papers.items():
        filepath = papers_dir / filename
        if not filepath.exists():
            try:
                response = requests.get(url, stream=True, timeout=30)
                response.raise_for_status()
                with open(filepath, 'wb') as f:
                    for chunk in response.iter_content(chunk_size=8192):
                        f.write(chunk)
                print(f"已下载: {filename}")
            except Exception as e:
                print(f"下载失败 {filename}: {e}")
        else:
            print(f"已存在: {filename}")
    
    return str(papers_dir)

papers_directory = download_sample_papers()

def create_gemini_settings(paper_dir: str, temperature: float = 0.1):
    """为PaperQA2创建使用Gemini模型的优化设置"""
    
    return Settings(
        llm="gemini/gemini-1.5-flash",
        summary_llm="gemini/gemini-1.5-flash",
        
        agent=AgentSettings(
            agent_llm="gemini/gemini-1.5-flash",
            search_count=6, 
            timeout=300.0, 
        ),
        
        embedding="gemini/text-embedding-004",
        
        temperature=temperature,
        paper_directory=paper_dir,
        
        answer=dict(
            evidence_k=8,            
            answer_max_sources=4,      
            evidence_summary_length="约80词",
            answer_length="约150词,但可以更长",
            max_concurrent_requests=2,
        ),
        
        parsing=dict(
            chunk_size=4000,
            overlap=200,
        ),
        
        verbosity=1,
    )

下载一组知名的AI/ML研究论文进行分析,并将其存储在专用文件夹中。然后创建优化的PaperQA2设置,配置为将所有LLM和嵌入任务使用Gemini,微调搜索计数、证据检索和解析参数,以实现高效准确的文献处理。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
class PaperQAAgent:
    """使用PaperQA2进行科学文献分析的高级AI代理"""
    
    def __init__(self, papers_directory: str, temperature: float = 0.1):
        self.settings = create_gemini_settings(papers_directory, temperature)
        self.papers_dir = papers_directory
        print(f"PaperQA代理已初始化,论文来源: {papers_directory}")
        
    async def ask_question(self, question: str, use_agent: bool = True):
        """向研究论文提问"""
        print(f"\n问题: {question}")
        print("正在研究论文中搜索...")
        
        try:
            if use_agent:
                response = await agent_query(query=question, settings=self.settings)
            else:
                response = ask(question, settings=self.settings)
                
            return response
            
        except Exception as e:
            print(f"问题处理错误: {e}")
            return None

    def display_answer(self, response):
        """格式化显示答案"""
        if response is None:
            print("未收到响应")
            return
            
        print("\n" + "="*60)
        print("答案:")
        print("="*60)
        
        answer_text = getattr(response, 'answer', str(response))
        print(f"\n{answer_text}")
        
        contexts = getattr(response, 'contexts', getattr(response, 'context', []))
        if contexts:
            print("\n" + "-"*40)
            print("使用的来源:")
            print("-"*40)
            for i, context in enumerate(contexts[:3], 1):
                context_name = getattr(context, 'name', getattr(context, 'doc', f'来源 {i}'))
                context_text = getattr(context, 'text', getattr(context, 'content', str(context)))
                print(f"\n{i}. {context_name}")
                print(f"   文本预览: {context_text[:150]}...")

    async def multi_question_analysis(self, questions: list):
        """按顺序分析多个问题"""
        results = {}
        for i, question in enumerate(questions, 1):
            print(f"\n处理问题 {i}/{len(questions)}")
            response = await self.ask_question(question)
            results = response
            
            if response:
                print(f"已完成: {question[:50]}...")
            else:
                print(f"失败: {question[:50]}...")
                
        return results

    async def comparative_analysis(self, topic: str):
        """跨论文执行比较分析"""
        questions = [
            f"{topic}中的关键创新是什么?",
            f"当前{topic}方法的局限性是什么?",
            f"{topic}的未来研究方向有哪些建议?",
        ]
        
        print(f"\n开始比较分析: {topic}")
        return await self.multi_question_analysis(questions)

async def basic_demo():
    """演示基本PaperQA功能"""
    agent = PaperQAAgent(papers_directory)
    
    question = "什么是Transformer架构?为什么它很重要?"
    response = await agent.ask_question(question)
    agent.display_answer(response)

print("运行基本演示...")
await basic_demo()

async def advanced_demo():
    """演示高级多问题分析"""
    agent = PaperQAAgent(papers_directory, temperature=0.2)
    
    questions = [
        "Transformer中的注意力机制如何工作?",
        "大语言模型的计算挑战是什么?",
        "自然语言处理中的预训练是如何演变的?"
    ]
    
    print("运行高级多问题分析...")
    results = await agent.multi_question_analysis(questions)
    
    for question, response in results.items():
        print(f"\n{'='*80}")
        print(f"问题: {question}")
        print('='*80)
        if response:
            answer_text = getattr(response, 'answer', str(response))
            display_text = answer_text[:300] + "..." if len(answer_text) > 300 else answer_text
            print(display_text)
        else:
            print("无可用答案")

print("\n运行高级演示...")
await advanced_demo()

async def research_comparison_demo():
    """演示比较研究分析"""
    agent = PaperQAAgent(papers_directory)
    
    results = await agent.comparative_analysis("神经网络中的注意力机制")
    
    print("\n" + "="*80)
    print("比较分析结果")
    print("="*80)
    
    for question, response in results.items():
        print(f"\n{question}")
        print("-" * 50)
        if response:
            answer_text = getattr(response, 'answer', str(response))
            print(answer_text)
        else:
            print("分析不可用")
        print()

print("运行比较研究分析...")
await research_comparison_demo()

定义了一个PaperQAAgent,使用Gemini优化的PaperQA2设置来搜索论文、回答问题并引用来源,具有清晰的显示辅助功能。然后运行基本、高级多问题和比较演示,以便端到端地查询文献并有效总结发现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
def create_interactive_agent():
    """创建用于自定义查询的交互式代理"""
    agent = PaperQAAgent(papers_directory)
    
    async def query(question: str, show_sources: bool = True):
        """交互式查询功能"""
        response = await agent.ask_question(question)
        
        if response:
            answer_text = getattr(response, 'answer', str(response))
            print(f"\n答案:\n{answer_text}")
            
            if show_sources:
                contexts = getattr(response, 'contexts', getattr(response, 'context', []))
                if contexts:
                    print(f"\n基于 {len(contexts)} 个来源:")
                    for i, ctx in enumerate(contexts[:3], 1):
                        ctx_name = getattr(ctx, 'name', getattr(ctx, 'doc', f'来源 {i}'))
                        print(f"  {i}. {ctx_name}")
        else:
            print("抱歉,找不到该问题的答案。")
            
        return response
    
    return query

interactive_query = create_interactive_agent()

print("\n交互式代理已就绪!现在可以提问自定义问题:")
print("示例: await interactive_query('Transformer如何处理长序列?')")

def print_usage_tips():
    """打印有用的使用提示"""
    tips = """
    GEMINI版PAPERQA2使用提示:
  
    1. 问题表述:
       - 明确想知道的内容
       - 询问比较、机制或影响
       - 使用领域特定术语
  
    2. 模型配置:
       - Gemini 1.5 Flash免费且可靠
       - 调整温度(0.0-1.0)以平衡创造性与精确性
       - 使用较小的chunk_size以获得更好的处理效果
  
    3. 文档管理:
       - 将PDF添加到论文目录
       - 使用有意义的文件名
       - 混合不同类型的论文以获得更好的覆盖范围
  
    4. 性能优化:
       - 免费层级限制并发请求数
       - 使用较小的evidence_k值以获得更快响应
       - 通过保存代理状态缓存结果
  
    5. 高级用法:
       - 链接多个问题进行更深入分析
       - 使用比较分析进行研究综述
       - 与其他工具结合完成完整工作流程
  
    可尝试的示例问题:
   - "比较BERT与GPT模型中的注意力机制"
   - "Transformer训练中的计算瓶颈是什么?"
   - "预训练从word2vec到现代LLM是如何演变的?"
   - "使Transformer成功的关键创新是什么?"
    """
    print(tips)

print_usage_tips()

def save_analysis_results(results: dict, filename: str = "paperqa_analysis.txt"):
    """将分析结果保存到文件"""
    with open(filename, 'w', encoding='utf-8') as f:
        f.write("PaperQA2分析结果\n")
        f.write("=" * 50 + "\n\n")
        
        for question, response in results.items():
            f.write(f"问题: {question}\n")
            f.write("-" * 30 + "\n")
            if response:
                answer_text = getattr(response, 'answer', str(response))
                f.write(f"答案: {answer_text}\n")
                
                contexts = getattr(response, 'contexts', getattr(response, 'context', []))
                if contexts:
                    f.write(f"\n来源 ({len(contexts)}):\n")
                    for i, ctx in enumerate(contexts, 1):
                        ctx_name = getattr(ctx, 'name', getattr(ctx, 'doc', f'来源 {i}'))
                        f.write(f"  {i}. {ctx_name}\n")
            else:
                f.write("答案: 无可用响应\n")
            f.write("\n" + "="*50 + "\n\n")
    
    print(f"结果已保存至: {filename}")

print("教程完成!现在拥有一个功能完整的PaperQA2 AI代理与Gemini。")

创建了一个交互式查询助手,允许按需提问自定义问题并可选择查看引用的来源。同时提供实用使用提示,并添加了一个保存器,将每个问答与来源名称写入结果文件,最终获得一个即用型工作流程。

成功创建了一个功能完整的AI研究助手,利用Gemini的速度和多功能性与PaperQA2的强大论文处理能力。现在可以交互式探索科学论文、运行针对性查询,甚至以最小努力进行深度比较分析。此设置增强了消化复杂研究的能力,并简化了整个文献综述过程,使能够专注于洞察而非手动搜索。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计